0

我无法让 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

为什么会发生这种情况,我该如何解决?

4

3 回答 3

1

StringTokenizer 不使用新行制作标记

结果中没有换行符String。要改变那个..

String eol = System.getProperty("line.separator");
...
  temp += cString + eol;

最终,我会废弃该代码并重新开始。

  1. 使用StringBuilder而不是String +=
  2. 但是,String如果预期是整数,为什么还要将第一行添加到 a 中呢?立即解析它,然后忽略String为第一行读取的内容。
于 2012-07-23T01:03:58.047 回答
0

当您通过 将每一行附加到字符串时temp += cString,您拥有的是“3”+“monkeys”,即“3monkeys”。您可以通过在每行后添加一个空格来解决此问题;temp += cString + " ".

于 2012-07-23T00:57:33.700 回答
0

发生的事情是你将 3 和猴子与这些连接起来

while( f.hasNextLine() ) {
    String cString = f.nextLine();
    temp += cString;
}

所以 temp 现在将包含 3monkeys 你正在删除换行符

如果您格式化输入文件,使得每一行都是一个单独的标记,那么我认为您甚至不需要标记器,您只需将 cString 添加到数组或更好地使用 ArrayList 这样您就不必介意数组的大小

于 2012-07-23T00:58:32.117 回答