为什么在将字符串数组转换为int数组时会获得numberFormateCeption



我在 Intellij 上运行代码时不会遇到错误。但是,当我尝试交付我的代码以进行分配IM的工作时,我都会在两个测试用例中获得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()。感谢您的帮助。路易斯

eddit:好吧,这里有些腥。我添加了

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

将其交给了测试用例。虽然Intellij会传递错误,然后再提供一系列整数,但测试案例输出:真的[]。因此,大家都是正确的,我只是错误地假设测试用例中的输入将类似于分配中我给出的示例输入。

edit2:

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

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+")

有许多可能的原因:

  1. tokens中有一个非数字 - 例如。9 1! 3 x 3 ...
  2. 代币被多个空间拆分 - 例如9 3

您应该能够通过数字格式异常的文本分辨。例如,在多个空间的情况下,您会得到:

线程中的异常" main" java.lang.numberformatexception:for Input String:"

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

线程" main" java.lang.numberformatexception中的例外:输入字符串:" a"

当然,有许多可能的解决方案,具体取决于您遇到无效输入时要做的事情(您忽略了它吗?

当您知道您的输入是通过空格分开的,但不知道有多少白色空间,您可以使用正则表达式来定位split命令中的多个空格:

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

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

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
  }
}

这可能是由于数字之间的额外空间。

例如,

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);
    }
}

请修改您的代码:

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

相关内容

  • 没有找到相关文章

最新更新