我可以使用扫描仪读取文件。当返回类型为void时,我能够读取数据并将其打印到控制台,但是之后会立即抛出ArrayOutOfBoundsException。理想情况下,我想返回一个字符串数组,但是,我只得到一个ArrayOutOfBoundsException。在这两种情况下,在癌症[j] = input.nextLine()行引发异常。我已经确定数组的大小是正确的。当我不对其大小进行硬编码时,编译器会在同一行抛出NullPointerException(这是有意义的,因为未声明数组的大小)。
我需要返回字符串数组的方法,因为我必须对它进行额外的操作。
public String[] readCancer() {
cancers = new String[21];
int j = 0;
try {
input = new Scanner(myData);
String result;
while(input.hasNext()) {
++j;
cancers[j] = input.nextLine();
//System.out.println(cancers[j]);
}
} catch (FileNotFoundException fnfx) {
JOptionPane.showMessageDialog(null, "Txt file could not be found");
}
return cancers;
}
我尝试以稍微不同的方式重写该方法,但我得到了相同的错误,只是这次是在输出[i] =结果;
public String[] readCancers() {
FileInputStream fis;
DataInputStream dis;
BufferedReader br;
InputStreamReader isr;
String result;
String[] output = new String[21];
int i = 0;
try {
fis = new FileInputStream(myData);
dis = new DataInputStream(fis);
isr = new InputStreamReader(dis);
br = new BufferedReader(isr);
while((result = br.readLine()) != null) {
++i;
output[i] = result;
}
} catch (FileNotFoundException fnfx) {
fnfx.printStackTrace();
} catch (IOException iox) {
iox.printStackTrace();
}
return output;
}
答案 0 :(得分:0)
很难知道你的文件有多少元素,但我假设你有21个元素,所以你需要一个21元素的数组。您已声明了一个包含21个元素的数组,但代码如下:
++j;
表示以下内容:
j = j+1;
然后使用j向数组中添加一个元素,这会导致您完全跳过j = 0,并且第21个项目会尝试放置在数组的第22个元素(超出范围)。你可能想要的是这样的:
cancers[j];
j++;
或者:
cancers[j++];
那样你就不会出界了。如果您有超过21个项目,那么我建议您增加数组大小。
答案 1 :(得分:0)
作为你问题的评论者:它可能是一个一个类型的错误,因为你跳过了第一个数组元素。但是一旦你有一个固定大小的数组要读入,你必须在任何情况下检查while循环中i或j的值:while(input.hasNext() && j < 20)
或while((result = br.readLine()) != null && i < 21)
。
然后在循环检查之后是否会有任何额外的输入,这可能表示错误,你必须处理它。