下面的代码有几个功能,允许诸如将数据写入文档,读取数据以及将数据放入数组中以便JTable
以后的行。
package tabletest.populatetable;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
public class GetData {
DataClass[] data = new DataClass[500];
int nextPosition = 0;
public GetData() {
readData();
}
public void writeData()
{
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(new File("resources/tabledata.txt")));
for(int i=0; i < nextPosition; i++) {
bw.write(data[i].toString());
bw.newLine();
}
bw.close();
} catch(Exception e) {
System.out.println("Invalid Data input");
}
}
public void readData()
{
try {
BufferedReader br = new BufferedReader(new FileReader(new File("resources/tabledata.txt")));
String nextData = br.readLine();
String[] arrayStringData;
while (nextData != null) {
try {
arrayStringData = nextData.split(",");
} catch(NullPointerException nPE) {
arrayStringData = new String[] {" ", " "};
}
for(int i = 0; i < arrayStringData.length - 1; i++) {
if(arrayStringData[i] == null || arrayStringData[i] == "") {
arrayStringData[i] = " ";
}
}
DataClass getData = new DataClass();
getData.col1 = arrayStringData[0].trim();
getData.col2 = arrayStringData[1].trim();
data[nextPosition] = getData;
nextPosition++;
nextData = br.readLine();
}
br.close();
} catch(Exception e) {
e.printStackTrace();
}
}
public String[][] dataInTableForm() {
final int colCount = 2;
String[][] temp = new String[nextPosition][colCount];
for(int i = 0; i < nextPosition; i++) {
temp[i][0] = data[i].col1;
temp[i][1] = data[i].col2;
}
return temp;
}
private class DataClass {
String col1;
String col2;
public String toString() {
return col1 + ", " + col2;
}
}
}
它正在阅读的文档resources/tabledata.txt
长12行,看起来像这样。
asfias, adsnj
aw,aerfae
aw,aewaa
,tre
asfd,
okfas,af
e,ds
sw,f
,
asfias, adsnj
aw,aerfae
aw,aewaa
问题出在文本文件的第9行。这就是它自己只有,
的地方。当逗号之前或之后有某些内容时,这似乎工作正常,我通过删除该行来检查它是否肯定是导致问题的逗号。
当我查看控制台时,我发现问题是ArrayIndexOutOfBoundsException
,堆栈跟踪在下面。
java.lang.ArrayIndexOutOfBoundsException: 0
at tabletest.populatetable.GetData.readData(GetData.java:55)
at tabletest.populatetable.GetData.<init>(GetData.java:14)
at tabletest.Table.createTablePanel(Table.java:76)
at tabletest.Table.createPanels(Table.java:34)
at tabletest.Table.runGUI(Table.java:24)
at tabletest.Table.main(Table.java:150)
代码的第55行是getData.col1 = arrayStringData[0].trim();
正如你在代码中看到的那样,我尝试了几种方法来防止这种情况发生,但我没有运气。我也试过从行尾删除.trim()
;但是,出现了完全相同的问题。
我很感激帮助解决这个问题。
答案 0 :(得分:7)
split(String regex)
的Javadoc说:
此方法的作用就像通过使用给定表达式和limit参数为零调用双参数
split
方法一样。 结尾的空字符串因此不包含在结果数组中。
因此,",".split(",")
将返回一个空数组,即new String[0]
。
如果您想保留尾随空字符串,请使用",".split(",", -1)
,这将返回new String[] { "", "" }
。
答案 1 :(得分:0)
String.split
将分隔符从结果数组中拉出来。因此,对于只有&#34;的字符串,&#34;你的数组长度为0(索引0处的元素不存在)。
您需要做的是检查长度是否大于0.您可以在尝试访问arrayStringData.length > 0
之前使用if语句中的代码arrayStringData
执行此操作
答案 2 :(得分:0)
__init__
函数将删除“,”分隔符并返回一个空数组。
如果split
数组为空,则try-catch块捕获空指针异常,而不是输出数组为空。
for循环只有在输出数组包含空字符串(它没有)时才有效。