我无法使StringTokenizer将几行文本拆分为单独的标记。输入的文字是
3
monkeys
但是,StringTokenizer显然将其解释为“3monkeys”。我需要它是“3”和“猴子”。因此,抛出NumberFormatException,因为我需要将字符串“3”转换为整数。
这是我到目前为止的代码。
Scanner f = new Scanner( new FileInputStream("input.txt" )); // Yes, i have the actual input file path here, but I changed it for this question.
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("output.txt")));
String temp = "";
//String cString = "";
while( f.hasNextLine() ) {
String cString = f.nextLine();
temp += cString;
}
StringTokenizer everythingTokens = new StringTokenizer( temp );
String[] everything = new String[ everythingTokens.countTokens() ];
for( int i = 0; i < everything.length; i++ ) {
everything[ i ] = everythingTokens.nextToken();
}
int numberOfPeople = Integer.parseInt( everything[ 0 ] ); // Line where exception occurs.
out.println( everything[ 0 ] );
错误信息是这个
Exception in thread "main" java.lang.NumberFormatException: For input string: "3monkeys"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:492)
at java.lang.Integer.parseInt(Integer.java:527)
at gift1.main(gift1.java:32)
Java Result: 1
为什么会发生这种情况,我该如何解决?
答案 0 :(得分:1)
StringTokenizer没有用新行创建标记
结果String
中没有换行符。要改变它..
String eol = System.getProperty("line.separator");
...
temp += cString + eol;
最终,我会废弃该代码并重新开始。
StringBuilder
而不是String +=
String
中呢?立即解析它,然后忽略为第1行读取的String
。答案 1 :(得分:0)
当您通过temp += cString
将每一行追加到字符串时,您所拥有的是“3”+“猴子”,即“3monkeys”。您可以通过在每行之后添加空格来解决此问题; temp += cString + " "
。
答案 2 :(得分:0)
将3和猴子连接起来会发生什么?
while( f.hasNextLine() ) {
String cString = f.nextLine();
temp += cString;
}
所以temp现在将包含3monkeys,你要移除新的行字符
如果你格式化你的输入文件,使得每一行都是一个单独的标记,那么我认为你甚至不需要在那里使用标记器,你只需要将cString添加到数组中或者更好地使用ArrayList以便你不会不得不考虑数组的大小