为什么在将字符串数组转换为整数数组时出现NumberFormatException?

时间:2019-03-11 16:06:37

标签: java numberformatexception parseint

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()。 多谢您的协助。 路易斯

Eddit: 好吧,这里有些鱼。我添加了

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

提交给我的代码,并将其交给测试用例。尽管IntelliJ会传递false和后面的整数数组,但测试用例将输出: 真正 [] 。 因此,你们都是对的,我只是错误地认为测试用例中的输入与作业中给出的示例输入类似。

Edit2:

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

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

我假设我包含的sc.nextLine()跳过了我创建列表所需的整数。 因此,实际的问题不是多余的空格或其他任何东西,仅仅是我通过使用sc.nextLine()超越了想要的输入。 给出我所需提示的答案,甚至我都不认为这是安德罗尼库斯提出的。 还是要感谢其他人。

3 个答案:

答案 0 :(得分:2)

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

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 :(得分:2)

有许多可能的原因:

  1. tokens中有一个非数字-例如。 9 1! 3 x 3 ...
  2. 令牌被分割成一个以上的空格-例如9 3

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

  

线程“ main”中的异常java.lang.NumberFormatException:对于输入字符串:“”

对于非数字(例如“ a”),您将得到:

  

线程“ main”中的异常java.lang.NumberFormatException:对于输入字符串:“ a”

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

当您知道输入由空格分隔,但是不知道有多少空格时,可以在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
  }
}

答案 2 :(得分:0)

请为此修改您的代码:

select t.*
from t
where t.lvl = (select max(t2.lvl) from t t2 where t2.kid = t.kid);

控制台输入:

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