NumberFormat在Java中进行字符串解析时的异常

时间:2015-04-08 05:36:53

标签: java string parsing

我正在为一个问题编写我的解决方案,其中包括解析包含用户输入的数字的字符串,用空格分隔,然后将它们存储为整数。

当我使用nextLine()方法首先接受字符串(包括空格)然后使用split方法时,我不确定为什么会出现数字格式异常分离出整数。还有一点很奇怪的是,代码以前在一个不同的问题上工作过,但显然不是这里。

这里是代码和异常消息:

package algorithms.Warmup;

import java.util.ArrayList;
import java.util.Scanner;

/**
 * Created by manishgiri on 4/8/15.
 */
public class ChocolateFeastTest {

    static Scanner sc = new Scanner(System.in);
    public static void main(String[] args) {

        System.out.println("Enter number of test cases:");
        int T = sc.nextInt();
        ArrayList<Integer> result = new ArrayList<>(T);


        for(int i = 0; i < T; i++) {

            int[] numbers = new int[3];
            System.out.println("Enter N, C, M separated by spaces");

            String next = sc.nextLine();

            String[] nextSplit =  next.split(" ");


            int item;

            for(int p = 0; p < 3; p++) {
                item = Integer.parseInt(nextSplit[p]);
                numbers[p] = item;
            }

            int N = numbers[0];
            int C = numbers[1];
            int M = numbers[2];

            System.out.println(N + C + M);
        }

    }
}

异常消息:

Enter number of test cases:
2
Exception in thread "main" java.lang.NumberFormatException: For input string: ""
Enter N, C, M separated by spaces
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:592)
    at java.lang.Integer.parseInt(Integer.java:615)
    at algorithms.Warmup.ChocolateFeastTest.main(ChocolateFeastTest.java:32)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

Process finished with exit code 1

在跟踪异常时,看起来当我使用Integer.parseInt()时行中出现错误,但在此之前,为什么不在第一个中读取数字(带空格)的代码地点?即:这条线不起作用:

String next = sc.nextLine()

我很感激任何帮助!

5 个答案:

答案 0 :(得分:2)

您使用的nextInt()只读取整数,而不是行末尾的换行符\n

因此,当您按一个整数然后输入时,行:

int T = sc.nextInt();

仅读取整数。接下来你做的事情:

String next = sc.nextLine();

它读取在要读取的输入中等待的新行字符。

只需更改为:

int T = Integer.parseInt(sc.nextLine());

(但当然,尝试/捕捉就更好了)

答案 1 :(得分:2)

问题是nextInt()不使用实线,所以当你执行String next = sc.nextLine();它会读取同一行而导致错误。

问题可以通过

解决
int T = sc.nextInt();
nextLine();            //adding a next line after nextInt()

答案 2 :(得分:0)

我刚改变了:int T = sc.nextInt(); 收件人:int T = Integer.parseInt(sc.nextLine());

这似乎有效。

答案 3 :(得分:0)

我尝试使用BufferedReader并且它有效。 这是代码:

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.util.ArrayList;

import java.util.Scanner;

public class ChocolateFeastTest {

    static Scanner sc = new Scanner(System.in);
    public static void main(String[] args) throws IOException {

        System.out.println("Enter number of test cases:");
        int T = sc.nextInt();
        ArrayList<Integer> result = new ArrayList<>(T);
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        for(int i = 0; i < T; i++) {

            int[] numbers = new int[3];
            System.out.println("Enter N, C, M separated by spaces");

            String next = br.readLine();

            String[] nextSplit = next.split(" ");

            int item;

            for(int p = 0; p < 3; p++) {
                item = Integer.parseInt(nextSplit[p]);
                numbers[p] = item;
            }

            int N = numbers[0];
            int C = numbers[1];
            int M = numbers[2];

            System.out.println(N + C + M);
        }

    }
}

答案 4 :(得分:0)

您需要两次调用'sc.nextLine()'才能从下一行获取输入。第一个调用将带您到下一行,第二个调用将获取第二行的输入。

        String next = sc.nextLine();
        next = sc.nextLine();