Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java StringIndexOutOfBoundsException_Java - Fatal编程技术网

Java StringIndexOutOfBoundsException

Java StringIndexOutOfBoundsException,java,Java,我正在编写一个程序,从items.txt文件中获取输入,根据changes.txt添加或删除行,并输出到另一个文件 这是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(

我正在编写一个程序,从items.txt文件中获取输入,根据changes.txt添加或删除行,并输出到另一个文件

这是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
我在print语句中添加了add,并在前面帮助诊断了这个问题。即使它打印add并完成,也不会将任何内容发送到输出文件。我猜这是因为StringIndexOutOfBoundsException

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

在执行字符之前,您应该检查codeStr.isEmpty

您正在从空字符串访问

差不多

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

原因是您正在使用,|\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
所以,对于那些零长度标记,您不能读取charAt0,因为没有这样的字符


将您的分隔符更改为| \r\n之类的值,即将该分隔符\r\n视为单个分隔符。

使用调试器,逐步完成代码。看看它崩溃时使用的值。可能是以后的某个迭代引发了异常。sry,我现在喝醉了。哪一行引发异常?您可能试图检查空输入的第一个字母,但根本没有字母。我将分隔符更改为,|\r\n,现在它将添加标记为A和A的更改,但不会删除标记为D和D的更改。在这种情况下,您可能有混合的换行符。试试,|\r?\n。