2017-03-03 139 views
0

我写一个程序,它根据“changes.txt”,并输出到另一个文件需要输入从文件“items.txt”和添加或删除行。爪哇的StringIndexOutOfBoundsException

这是 “items.txt” 文件:

101,Nail #1 
102,Nail #2 
103,Nail #3 
104,Hammer Small 
105,Hammer Large 

这是更改文件:

A,106,Chainsaw 12" 
D,102 
d,104 
a,107,Chainsaw 10" 

这是我的方法,该方法具有的问题(void changes()是行号132):

void changes() { 
    try { 
     fileChange = new Scanner(new File("changes.txt")); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
    fileChange.useDelimiter(",|\r|\n"); 


    while (fileChange.hasNext()) { 
     String codeStr = fileChange.next(); 
     if ((codeStr.charAt(0) == 'D') || (codeStr.charAt(0) == 'd')) { 
      delete(fileChange.nextInt()); 
      System.out.println("delete"); 
     } else if ((codeStr.charAt(0) == 'A') || (codeStr.charAt(0) == 'a')) { 
      add(fileChange.nextInt(), fileChange.next()); 
      System.out.println("add"); 
     } //else 
      System.out.println("done"); 
    } 

    fileChange.close(); 
} 

这是输出我得到:

add 
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0 
done 

我在打印语句增加了“添加”和“完成”只是为了帮助在早期诊断问题。即使它打印“添加”和“完成”,也不会将任何内容发送到输出文件。我猜这是由于StringIndexOutOfBoundsException

这是我的第一个关于堆栈溢出的问题,所以请耐心等待任何格式问题或不当礼节。

+0

使用调试器,单步执行代码。看看它在崩溃时使用的值。 – Robert

+0

稍后的一些迭代可能会引发异常。 (Sry,我现在喝醉了。)哪一行会抛出异常? –

+0

您可能会尝试检查空输入的第一个字母(根本没有字母)。 – Robert

回答

0

您应该检查codeStr.isEmpty()你做一个charAt(0)之前。

您正在访问空字符串。

喜欢的东西

while (fileChange.hasNext()) { 
    String codeStr = fileChange.next(); 
    if (codeStr.isEmpty()) continue; 
1

这样做的原因是,你正在使用",|\r|\n"作为分隔符。 这将返回您的换行符的\r\n之间的空令牌(假定您使用的是Windows风格的换行符)。例如:

Scanner sc = new Scanner(new StringReader("Hello\r\nWorld")); 
sc.useDelimiter(",|\r|\n"); 
while (sc.hasNext()) { 
    String n = sc.next(); 
    System.out.println(n.length() + " " + n); 
} 

输出:

5 Hello 
0 
5 World 

Ideone demo

因此,对于那些零长度标记,你可以不读charAt(0),因为没有这样的字符。

将您的分隔符更改为",|\r\n"之类的内容,即将\r\n作为单个分隔符处理。

+0

我将分隔符更改为“,\ r \ n”,现在它将添加标记为“A”和“a”的更改,但不会删除标记为“D”和“d”的更改。 – Henry

+0

在这种情况下,您可能会出现混合换行符。试试'“,| \ r?\ n”'。 [如果所有换行符都是'\ r \ n'](http://ideone.com/XwLAJ8),对我来说似乎很好。 –