我正在制作一个程序来计算我将使用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();
}
}
}
答案 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}}