为什么在将 String Array 转换为 int Array 时出现 NumberFormatException?

Why do I get NumberFormatException while converting String Array to int Array?

当我在 IntelliJ 上 运行 我的代码时,我没有收到错误。但是,当我尝试为我正在处理的作业提交我的代码时,我得到了两个测试用例的 NFE。我删除了我所有的代码,只让下面的代码 运行 通过测试用例。这里的某处一定是 NumberFormatException

public class Search {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.nextLine();
        int[] list = new int[n];
        String [] tokens = sc.nextLine().trim().split(" ");

        for (int i=0; i<tokens.length;i++){
            list[i]=Integer.parseInt(tokens[i]);
        }
    }
}

我阅读了有关双空格的信息并使用以下方法进行了检查:System.out.println(Arrays.asList(tokens).contains("")); 输出为假,所以这不是一个选项。如您所见,我已经在使用 trim()。 我很感激你的帮助。 路易斯

编辑: 好吧,这里有些可疑。我添加了

System.out.println(Arrays.asList(tokens).contains(""));
    System.out.println(Arrays.toString(tokens));

为了我的代码,并把它交给了测试用例。虽然 IntelliJ 会传递 false 后跟整数数组,但测试用例输出: 真的 [] . 因此你们都是对的,我只是错误地假设我的测试用例中的输入类似于我在作业中给出的示例输入。

编辑2:

好的! 我想到了。测试用例的输入与我的测试输入中的格式完全不同,看起来有点像这样:

10
8 8 9 12 110 111 117 186 298 321
2
8 13

我假设我包含的 sc.nextLine() 跳过了我需要制作列表的整数。 所以实际的问题不是额外的空格或任何东西,只是我通过使用 sc.nextLine() 提前超过了我想要的输入。 给了我我需要的提示的答案,即使我不认为这是有意的来自 Andronicus。 无论如何都要感谢其他人。

如果您知道将有一个整数作为输入并且您不担心解析,为什么不使用它呢?

int input = sc.nextInt();

在您的解决方案中,您必须执行以下操作:

Arrays.stream(sc.nextLine().trim().split(" ")).filter(s -> !s.matches("\s")).toArray(String[]::new);
\ or simplier
sc.nextLine().trim().split("\s+")

这可能是因为数字之间多了一堆空格。

例如,

9    8 7 9    1
  ^^       ^^
*Note: You have more than one spaces here.

这就是你的数组拆分后的样子,

tokens = {"9", "", "", "", "8", "7", "9", "", "", "", "1"}

上面会抛出 NumberFormatException 因为多余的空格。

你可以再试一下trimming内容,

int i = 0;
for (String token : tokens){
    token = token.trim();
    if (!"".equals(token)) {
        list[i++] = Integer.parseInt(token);
    }
}

有多种可能的原因:

  1. tokens 中有一个非数字 -- 例如。 9 1! 3 x 3 ...
  2. 令牌被多个拆分 space -- 例如 9 3

您应该可以通过数字格式异常的文本来判断。例如,在多个 space 的情况下,您会得到:

Exception in thread "main" java.lang.NumberFormatException: For input string: ""

对于非数字(例如 "a"),您会得到:

Exception in thread "main" java.lang.NumberFormatException: For input string: "a"

当然,有许多可能的解决方案,具体取决于当您 运行 进入无效输入时要执行的操作(您忽略它吗?抛出一个特殊的异常?尝试去除非数字? )

当您知道您的输入由白色space分隔,但不知道有多少白色-space时,您可以使用正则表达式来定位多个白色space s 在你的 split 命令中:

str.split("\s+"); // splits on one or more whitespace including tabs, newlines, etc.

然后,要处理令牌列表中的非数字,您可以在 for 循环中添加检查:

for(int i = 0; i < tokens.length; i++) {
  if(tokens[i].matches("\d+")) {
    list[i] = Integer.parseInt(tokens[i]);
  } else {
    // Handle error case for non-digit input
  }
}

请将您的代码修改为:

public class Example {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter the size of the array : ");
        int n = sc.nextInt();
        sc.nextLine();
        int[] list = new int[n];
        System.out.println("Enter a string : ");
        /** This regex will work for string having more than one space. */ 
        String trimmedToken = sc.nextLine().replaceAll("\s+", " ");
        String[] tokens = trimmedToken.split(" ");
        for (int i = 0; i < tokens.length; i++) {
            list[i] = Integer.parseInt(tokens[i]);
            System.out.println(list[i]);
        }
        sc.close();
    }

}

控制台输入:

Enter the size of the array : 
5
Enter a string : 
1       2     3      4    5

输出:

1
2
3
4
5