【问题标题】:Java Issue while storing Integer Input as Array将整数输入存储为数组时出现 Java 问题
【发布时间】:2018-02-03 09:03:44
【问题描述】:

我正在尝试编写一个需要两个输入的程序:

  • 数组大小

  • 数组内的元素

例如可以通过以下测试用例的东西:

5
0 1 3 4 5

第一行告诉数组的大小,即 5 个元素 第二行提供了这 5 个元素。

我还需要将这些元素的值存储在一个数组中。

以下是我试过的代码:

    public static void main(String[] args) {

        Scanner scanner = new Scanner( System.in );

        System.out.print( "Enter Array Length: " );

        int input = scanner.nextInt();
        System.out.print( "Enter Array Elements: " );

        int array[]= {};
        String line1 = scanner.nextLine(); // Read 1st line
        String[] numbers1 = line1.split(" "); // Split based on space
        for(int i = 0; i<numbers1.length; i++){
            array[i] = Integer.parseInt(numbers1[i]);
        }
        System.out.print( "Array Print:  "+ Arrays.toString(array) );
   }

但是,我在调用 parseInt 时不断收到“NumberFormatException”。

【问题讨论】:

  • 只需打印行并查看您阅读的内容。此外,您应该使用适当的大小初始化数组。

标签: java arrays java.util.scanner arr


【解决方案1】:

有两个错误。

  • nextInt() 之后使用nextLine()
  • 分配给足够的内存用于 正在存储整数。

测试,

int input = scanner.nextInt();
scanner.nextLine();
System.out.print( "Enter Array Elements: " );

int array[]= new int[input];

【讨论】:

    【解决方案2】:

    您错过了定义的数组大小。您正在获取大小但未分配,在这种情况下它将引发 ArrayIndexOutofbound 异常。

        Scanner scanner = new Scanner( System.in );
    
        System.out.print( "Enter Array Length: " );
    
        int input = scanner.nextInt();
    
        // use two scanners
        Scanner scanner2 = new Scanner( System.in );
        System.out.print( "Enter Array Elements: " );
        String line1 = scanner2.nextLine(); // Read 1st line
        int[] array = new int[input];
    
        String[] numbers1 = line1.split(" "); // Split based on space
        for(int i = 0; i<numbers1.length; i++){
            array[i] = Integer.parseInt(numbers1[i]);
        }
        System.out.print( "Array Print:  "+ Arrays.toString(array) );
    

    【讨论】:

      【解决方案3】:

      有两个错误:

      1) 数组是 java 中的对象。因此,在使用数组之前,您需要创建该数组的实例。

      2) 使用 next() 而不是 nextLine() 因为 nextLine() 不读取当前输入行,但下一行在您的情况下显然是空白的。这就是您收到 NumberFormatException 的原因。

      public static void main(String[] args) {
      
              Scanner scanner = new Scanner( System.in );
      
              System.out.print( "Enter Array Length: " );
      
              int input = scanner.nextInt();
              System.out.print( "Enter Array Elements: " );
      
              int array[]= new int[input];
              String line1 = scanner.next(); // Read 1st line
              String[] numbers1 = line1.split(" "); // Split based on space
              for(int i = 0; i<numbers1.length; i++){
                  array[i] = Integer.parseInt(numbers1[i]);
              }
              System.out.print( "Array Print:  "+ Arrays.toString(array) );
      }
      

      【讨论】:

        【解决方案4】:

        因为 Scanner.nextInt() 在用户输入 Array Length 的值时按下回车键时不会清除行分隔符,所以它会传递给下一个 Scanner 方法,即 Scanner.nextLine()。不幸的是,因为 nextInt() 不使用行分隔符,它是 nextLine() 从扫描仪缓冲区获取的第一件事,可以说基本上是 ENTER ,所以它跳过当您尝试使用 Integer.parseInt() 方法转换空字符串时,输入的内容最终会出现 NumberFormatException

        要解决这个问题,请使用不同的Scanner方法或将scanner.nextLine();直接放在int input = scanner.nextInt();之后,以消耗行分隔符:

        public static void main(String[] args) {
            Scanner scanner = new Scanner( System.in );
            System.out.print( "Enter Array Length: " );
            int input = scanner.nextInt();
            scanner.nextLine();  // Consume <-----------
        
            int array[] = new int[input];
            System.out.print( "Enter Array Elements: " );
            String line1 = scanner.nextLine(); // Read 1st line
            String[] numbers1 = line1.split(" "); // Split based on space
            for(int i = 0; i<numbers1.length; i++){
                array[i] = Integer.parseInt(numbers1[i]);
            }
            System.out.print( "Array Print:  "+ Arrays.toString(array) );
        }
        

        有很多方法可以完成您在 Java 中尝试做的事情。您还需要考虑的是,如果用户在元素行中输入一个字母字符,例如“w”或“o”,该怎么办?是的....NumberFormatException!在使用您正在使用的方法时,您也需要测试这种事情。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-10-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多