【问题标题】:Java - Unhandled exception error when using "continue" in a for loop?Java - 在 for 循环中使用“继续”时出现未处理的异常错误?
【发布时间】:2013-10-24 15:54:24
【问题描述】:

这是一个存储 10 个唯一字符串的程序。如果用户输入一个已经存在于数组中的字符串,用户将得到一个错误。我的代码对于我输入的第一个字符串运行良好,但之后抛出异常,我不知道为什么。如何解决此问题并使其正常工作?

附:我不想使用 Set。我想用数组来做。

编辑:错误名称:线程“主”java.lang.NullPointerException 中的异常 Java 结果:1

谢谢。

 public static void main(String[] args) {
        Scanner keyboard = new Scanner(System.in);
        int stringNumber = 0;
        String[] stringArray = new String[10];

        for (int i = 0; i <= stringArray.length; i++) {

            boolean itemExists = false;

            out.println("\nEnter a string");
            String input = keyboard.next();

            if (i > 0) {
                for (int j = 0; j < stringArray.length; j++) {
                    if (stringArray[j].equalsIgnoreCase(input)) {
                        itemExists = true;
                        out.println("Item \"" + input + "\" already exists.");
                        break;
                    } else {
                        continue; // Unhandled exception error. If I don't have "continue" here, the program doesn't work properly after the first number.
                    }
                }
            }

            if (itemExists == false) {
                stringArray[stringNumber] = input;
                out.println("\"" + stringArray[stringNumber] + "\"" + " has been stored.");
            } else {
                out.println("Try again.");
            }

            PrintArray(stringArray);
            stringNumber++;

        }

    }

    public static void PrintArray(String[] stringArray) {

        for (int i = 0; i <= 9; i++) {
            if (stringArray[i] == null) {
                out.print(" ");
            } else {
                out.print("\nYour strings:");
                out.print(" " +stringArray[i] + " ");
            }
        }
    }

【问题讨论】:

  • 是异常还是编译器错误?在这两种情况下,请发布堆栈跟踪或完整的错误消息。
  • 原帖中添加的错误信息
  • 您迷路了,因为您的逻辑很复杂,尝试将其拆分为不同的方法。

标签: java arrays string loops continue


【解决方案1】:

你的问题是这个if (stringArray[j].equalsIgnoreCase(input)) {,你指的是空元素,因为你的数组不包含任何内容。

你可以解决这个问题

if (input.equalsIgnoreCase(stringArray[j])) {

现在您将值与可能为空的数组项进行比较。

查看示例代码

    private final static Scanner keyboard = new Scanner(System.in);
    private final static String[] stringArray = new String[10];

    public static void main(String[] args) {

        int stringNumber = 0;
        for (int i = 0; i < stringArray.length; i++) {

            System.out.println("\nEnter a string");

            String input = readNextItem();

            if(isInputExist(input)) {
                System.out.println("Item \"" + input + "\" already exists.");
                System.out.println("Try again.");
            } else {
                stringArray[stringNumber++] = input;
                System.out.println("\"" + input + "\"" + " has been stored.");
            }

            printArray(stringArray);
        }

    }

    private static String readNextItem() {
        return keyboard.next();
    }

    private static boolean isInputExist(String input) {

        for(String stored : stringArray) {
            if(input.equalsIgnoreCase(stored)) {
                return true;
            }
        }
        return false;
    }

【讨论】:

    【解决方案2】:

    您收到 NullPointerException 是因为您正在访问一个空数组。在第二个循环中,您将遍历整个 stringArray 数组,但您已插入第一个 i 元素。

    改变这个:

    for (int j = 0; j < stringArray.length; j++) {
    

    用这个:

    for (int j = 0; j < i; j++) {
    

    附: 我建议你使用 Set 而不是数组。

    这里有一个带有 Set 的版本:

        int numStrings = 10;
        Set<String> inserted = new HashSet<String>();
    
        while(inserted.size()<=numStrings) {
            out.println("\nEnter a string");
            String input = keyboard.next();
            if (inserted.contains(input)) {
              out.println("Item \"" + input + "\" already exists.");
              out.println("Try again.");
            } else {
              inserted.add(input);
              out.println("\"" + input + "\"" + " has been stored.");
            }
        }
    
        out.println(inserted);
    

    【讨论】:

      【解决方案3】:

      问题是这个内部循环:

                 for (int j = 0; j < stringArray.length; j++) {
                      if (stringArray[j].equalsIgnoreCase(input)) {
                          itemExists = true;
                          out.println("Item \"" + input + "\" already exists.");
                          break;
                      } else {
                          continue; // Unhandled exception error. If I don't have "continue" here, the program doesn't work properly after the first number.
                      }
                  }
      

      它不是导致问题的 continue 语句,它是您调用的

      stringArray[j].equalsIgnoreCase(input)
      

      在if - stringArray[j] 中还没有填充String,会导致NullPointerException。您可以反转表达式:

      input.equalsIgnoreCase(stringArray[j])
      

      (假设“输入”永远不会为 NULL)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-15
        • 2016-07-17
        • 2019-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-01
        • 1970-01-01
        相关资源
        最近更新 更多