我是初学者,我有一个txt文件,用户将导入到java中,我将读取txt文件行为line然后在每行上设置变量base并将它们添加到当前记录
public void importTXT() {
JFileChooser fc = new JFileChooser();
fc.setAcceptAllFileFilterUsed(false);
fc.setMultiSelectionEnabled(false);
FileNameExtensionFilter filter = new FileNameExtensionFilter(
"TEXT FILES", "txt", "text");
fc.setFileFilter(filter);
int returnVal = fc.showOpenDialog(CollectionFrame.this);
String[] numstrs = null;
if (returnVal == JFileChooser.APPROVE_OPTION) {
File importedFile = fc.getSelectedFile();
try {
Scanner sc = new Scanner(importedFile);
while (sc.hasNextLine()) {
numstrs = sc.nextLine().split("\\s+"); // split by white
// space
}
} catch (IOException e) {
}
// add new collection
Collection newCollection = new Collection(numstrs[0]);
allRecord.addCollection(newCollection);
// add art consignment information
String consignmentName = numstrs[3];
String description = numstrs[4];
我在倒数第二行收到ArrayIndexOutOfBoundsException
String consignmentName = numstrs[3];
文本文件的内容如下:
Richman’s Estate Collection
5
ART
Water Lilies
A superb piece in great condition
有人可以告诉我出了什么问题吗?
答案 0 :(得分:0)
编辑:
您目前正在阅读所有行并每次更换numstrs
的值
所以当你离开循环时,你只得到了最后一行的值。
我想你要保存所有线路 - 见下文
结束编辑
你应该使用arraylist。
像这样:ArrayList<String[]> numstrsList = new ArrayList<String[]>();
if (returnVal == JFileChooser.APPROVE_OPTION) {
File importedFile = fc.getSelectedFile();
try {
Scanner sc = new Scanner(importedFile);
while (sc.hasNextLine()) {
numstrsList.add(sc.nextLine().split("\\s+")); // split by white
// space
}
} catch (IOException e) {
}
}
你可以通过以下方式捕捉你的arraylist的值:
for(int i=0:i<numstrsList.size();i++){
String[] oneLineStrArray = numstrsList.get(index)
//do something
}
你应该发布文本数据,否则我们无法帮助你解决OutOfBounds错误。 另外,我想知道如何实例化集合。
答案 1 :(得分:0)
正如之前的评论已经提出的那样,该文件显然不包含您期望的表单中的信息。 我建议您在扫描仪阅读后添加som错误处理。
if (numstrs.length < 5){
///TODO: add some handling here, exception or error dialog
}
答案 2 :(得分:0)
在这里,首先浏览ArrayIndexOutOfBoundsException
在尝试访问索引值之前检查numstrs
长度。你可以做到
String consignmentName = null, description = null;
if (numstrs.length >= 4) {
consignmentName = numstrs[3];
}
if (numstrs.length >= 5) {
description = numstrs[4];
}
另外,正如其中一条评论所指出的那样 - numstrs
将始终具有最后一行返回的值。