我得到了一个包含大量JTextAreas的程序,这些程序由用户填充。我将这些注释用BufferedWriter保存在.txt文件中,用分号分隔。
我正在尝试将该.txt文件的内容读回到程序中,这是问题的开始。我正在使用扫描仪来读取文件,它适用于前几个TextAreas。但是在另一组JTextAreas上,如果savefile中只有空格或什么都没有,它就会失败。我不明白为什么它之前只能运行几行。
openItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
JFileChooser oi = new JFileChooser();
oi.showOpenDialog(null);
Scanner scan = null;
try{
scan = new Scanner(oi.getSelectedFile());
scan.useDelimiter(Pattern.compile(";"));
String[] input = new String[144];
for (int i = 1; i<9;i++){ //This works fine, even with empty JTextAreas
input[i] = scan.next();
}
f1.setText(input[1]);
f2.setText(input[2]);
f3.setText(input[3]);
f4.setText(input[4]);
f5.setText(input[5]);
f6.setText(input[6]);
f7.setText(input[7]);
f8.setText(input[8]);
for(int i=1;i<13;i++){ //This throws a NoSuchElementException if it's reading a savefile with empty TextAreas
input[i] = scan.next();
}
c1.setText(input[1]);
c2.setText(input[2]);
c3.setText(input[3]);
c4.setText(input[4]);
....
}catch(IOException | NoSuchElementException i){
JOptionPane.showMessageDialog(null, "Error while reading", "Error",1);
}}});
现在,如果savefile包含每个JTextArea的值,则第二个for-Loop可以正常工作,但如果其中一个元素只有空格则会失败。我在这里做错了什么?
答案 0 :(得分:1)
似乎输入字符串没有您将调用的确切数量的输入scan.next()
但是不会返回任何元素,因此您可以从documentation看到它抛出一个NoSuchElementException
。
public String next()
查找并返回此扫描仪的下一个完整令牌。一个 完整标记之前和之后是匹配的输入 分隔符模式。此方法可能在等待输入时阻塞 扫描,即使之前的hasNext()调用返回true。
抛出:NoSuchElementException - 如果没有更多令牌可用 IllegalStateException - 如果此扫描程序已关闭
要解决此问题,请添加一项检查以查看是否存在令牌,否则如果没有令牌则添加空字符串。您可以使用像这样的三元运算符来完成此操作
for(int i=1;i<13;i++){ //This throws a NoSuchElementException if it's reading a savefile with empty TextAreas
input[i] = (scan.hasNext())? scan.next(): "";
}
c1.setText(input[1]);
c2.setText(input[2]);
c3.setText(input[3]);
c4.setText(input[4]);