【问题标题】:java.lang.NumberFormatException error after inputting a number [duplicate]输入数字后java.lang.NumberFormatException错误[重复]
【发布时间】:2020-09-11 00:35:58
【问题描述】:

在这一点上,我感到很愚蠢,因为无法找出最有可能是简单修复的东西。我不断收到错误“线程“main”中的异常 java.lang.NumberFormatException:对于输入字符串:“” 在 java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68) 在 java.base/java.lang.Integer.parseInt(Integer.java:662) 在 java.base/java.lang.Integer.parseInt(Integer.java:770) 在 searchSorting.main(searchSorting.java:15)" 输入我想输入多少个数字后。其他解决这个问题的方法似乎不适用于我。谢谢你的帮助

import java.util.Scanner;
import java.util.Arrays;
public class searchSorting 
{
    public static void main (String[]args)
    {
        String line;
        int number, search, item, array[], first, last, middle;
        Scanner in = new Scanner(System.in);

        System.out.print("How many numbers you want to input?: ");
        number = in.nextInt();
        array = new int [number];

        item = Integer.parseInt(in.nextLine());
        double[] values = new double[item];

for (int i = 0; i < values.length; i++) {
    System.out.print("Input number " + i + ": ");
    values[i] = Double.parseDouble(in.nextLine());
}
for (int index = 0; index < 5; index++)
    System.out.print(values[index] + "  ");
    in.nextLine();
    Arrays.sort(values);
    System.out.println("Sorted number is: " + Arrays.toString(values));


System.out.println("Enter the number you are looking for?");
      search = in.nextInt();
      first = 0;
      last = (item - 1);
      middle = (first + last)/2;

      while( first <= last )
      {
         if ( array[middle] < item )
           first = middle + 1;
         else if ( array[middle] == item )
         {
           System.out.println(item + " found at location " + (middle + 1) + ".");
           break;
         }
         else
         {
             last = middle - 1;
         }
         middle = (first + last)/2;
      }
      if ( first > last )
          System.out.println(item + " is not found.\n");
   
}}

【问题讨论】:

  • 为什么使用item = Integer.parseInt(in.nextLine());而不是更直接的item = in.nextInt();
  • 我这样做了,但现在我的输入数字 0:在它之后不再打印

标签: java arrays error-handling


【解决方案1】:

有关更多信息,请查看 ScannerInteger 文档,这是一个很好的资源。

编辑:尝试删除第 15 行并将下一行中的 item 替换为 number

【讨论】:

    【解决方案2】:

    你这样称呼:

     number = in.nextInt();   
    

    假设用户键入 123 和 ENTER,此调用会使用 123 并将输入流置于行尾字符之前。

    下一个相关代码是

    item = Integer.parseInt(in.nextLine());  
    

    nextLine 调用将输入流推进到行尾,返回它在途中传递的所有字符。由于在 123 之后立即按下了 ENTER 键,因此返回的值为 emoty 字符串。哪个不是整数。

    您需要检查您的策略,即有时扫描数字 (nextInt) 有时扫描其余 linr (nextLine)。将两者混合需要非常小心。建议您最好坚持使用数值方法 (nextInt/nextDouble)。

    例如,替换这个

     item = Integer.parseInt(in.nextLine()); 
    

    通过这个

     item = in.nextInt();
    

    自动处理行尾。


    来自 cmets 的讨论:

    我仍然对为什么它让我输入感到困惑 在下一行再次显示该值

    从最初的问题开始假设您如何修改代码:这是因为您编写的代码会读取两次数字:

        System.out.print("How many numbers you want to input?: ");
        number = in.nextInt();    // **** first input ****
        array = new int [number]; 
    
        item = in.nextDouble();   // **** second input ****
        double[] values = new double[item];
    

    每次您调用in.nextSomething() 时,扫描器都会读取更多输入。应该是这样的:

        System.out.print("How many numbers you want to input?: ");  
        number = in.nextInt();  
        array = new int [number];
        double[] values = new double[number];
    

    【讨论】:

    • 感谢您的额外解释!这解决了错误问题,但现在“输入编号 0:”不再显示在下一行。
    • 这是我不使用 Scanner 而是使用 BufferedReader 的原因之一。
    • 当然,如果我想要一个像许多用户期望的那样面向行的 UI(所以:提示,然后重复读取该输入),那么我将逐行读取并解析行。从 SO 中的许多初学者帖子来看,通过令牌扫描的概念很难掌握。它表面上很吸引人,但对粗心的人有陷阱。
    • @kayaruth - 你所说的“没有出现在下一行”是什么意思——之后呢?您的代码最初提示输入“多少个数字?”,期望读取 2 个值(“数字”和“项目”),然后进入提示输入“输入数字 N”的循环.那么 - 你是在第一个提示后输入 2 个数字吗?
    • 这个数组array = new int [number]; 似乎没有被使用,所以也许它和之前读取的number 根本不应该存在?
    猜你喜欢
    • 2020-09-27
    • 2017-09-02
    • 2013-06-27
    • 1970-01-01
    • 2013-09-16
    • 2020-03-11
    • 2015-04-19
    • 2018-06-08
    • 1970-01-01
    相关资源
    最近更新 更多