从输入文件中读取数字时出错

时间:2016-05-06 09:53:37

标签: java input

我正在制作一个程序来计算我将使用input.txt文件创建的连接组件图的数量。在input.txt文件中,文本如下所示。

7 6 (enter)
0 1 (enter)
1 2 (enter)
2 0 (enter)
0 3 (enter)
3 2 (enter)
4 5 (enter)

它运行良好,但是当我将第一行数据7更改为10或更大的数字时,它会显示错误消息,

Exception in thread "main" java.lang.NumberFormatException: For input string: "0 "
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:580)
    at java.lang.Integer.parseInt(Integer.java:615)
    at Assignment41.main(Assignment41.java:28)

我不知道为什么会这样,以及如何调试这个.. 有什么想法吗?

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class Assignment41 {
    public static void main(String[] args) throws IOException { 
        BufferedReader in;
        try {
            in = new BufferedReader(new FileReader("input.txt"));

            String graphGuide;
            graphGuide = in.readLine();

            int divider = graphGuide.indexOf(" "); 
            int NodeNum = Integer.parseInt(graphGuide.substring(0, divider)); 
            int EdgeNum = Integer.parseInt(graphGuide.substring(divider + 1));

            AdjList cc = new AdjList();
            for(int i = 0; i < NodeNum; i++){
                cc.insertVertex(i);
            }

            for(int j = 0; j < EdgeNum; j++){
                String temp;
                temp = in.readLine();

                int v1 = Integer.parseInt(temp.substring(0, divider));
                int v2 = Integer.parseInt(temp.substring(divider + 1));
                cc.insertEdge(v1, v2);
                cc.insertEdge(v2, v1);
            }

            for(int k = 0; k < NodeNum; k++){
                cc.BFS(k);
                System.out.printf(" ");
            }

            System.out.println();
            System.out.println(cc.ccCount);

            in.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

2 个答案:

答案 0 :(得分:1)

如果trim()具有前导空格或尾随空格,则在解析String时需要Integer "0 "

否则,NumberFormatException字符串(注意空格)将不会被解析并将抛出int v1 = Integer.parseInt(temp.substring(0, divider).trim());

例如:

String

修剪String将删除任何前导或尾随空格,包括换行符等。

请参阅文档here

您还可以调试代码并确保表示整数值的子String.split在正确的索引处被精确解析,但这可能需要更多工作。

最后,您还希望在解析之前执行一些基本检查,例如修剪后的空值。

正如Rishal所述,使用String来...分割# Create some toy data set.seed(1) pos <- matrix(runif(20), 10, 2) colnames(pos) <- c("lon", "lat") print(pos) # lon lat # [1,] 0.26550866 0.2059746 # [2,] 0.37212390 0.1765568 # [3,] 0.57285336 0.6870228 # [4,] 0.90820779 0.3841037 # [5,] 0.20168193 0.7698414 # [6,] 0.89838968 0.4976992 # [7,] 0.94467527 0.7176185 # [8,] 0.66079779 0.9919061 # [9,] 0.62911404 0.3800352 #[10,] 0.06178627 0.7774452 new.pos <- c(0.5, 0.5) # New position # Compute distance to points and select nearest index nearest.idx <- which.min(colSums((t(pos) - new.pos)^2)) nearest.idx #[1] 9 # Pick out the point pos[nearest.idx, ] # lon lat #0.6291140 0.3800352

答案 1 :(得分:1)

而不是使用

String divider[] = graphGuide.split(" "); int NodeNum = Integer.parseInt(divider[0]); int EdgeNum = Integer.parseInt(divider[1]);

你可以很好地使用

{{1}}