Java NoSuchElementException 在空行上使用扫描仪
Java NoSuchElementException using Scanner on empty Lines
我有一个包含很多 JTextAreas 的程序,这些 JTextAreas 由用户填充。我用 BufferedWriter 将这些评论保存在一个用分号分隔的 .txt 文件中。
我正在尝试将该 .txt 文件的内容读回到程序中,这是问题开始的地方。我正在使用扫描仪读取文件,它非常适合前几个 TextAreas。但是,在另一组 JTextAreas 上,如果保存文件中只有空格或没有任何内容,它就会失败。我不明白为什么它在几行之前工作正常。
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);
}}});
现在,如果保存文件包含每个 JTextArea 的值,第二个 for-Loop 可以完美运行,但如果其中一个元素只有空格,则失败。我在这里做错了什么?
似乎如果输入字符串没有您将要调用的输入的确切数量 scan.next()
但是 return 不会有任何元素,因此您可以从 documentation 它抛出一个 NoSuchElementException
.
public String next()
Finds and returns the next complete token from this scanner. A
complete token is preceded and followed by input that matches the
delimiter pattern. This method may block while waiting for input to
scan, even if a previous invocation of hasNext() returned true.
Throws: NoSuchElementException - if no more tokens are available
IllegalStateException - if this scanner is closed
要解决此问题,请添加一个检查以查看是否有令牌,否则如果没有令牌则添加空字符串。你可以用这样的三元运算符来做到这一点
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]);
我有一个包含很多 JTextAreas 的程序,这些 JTextAreas 由用户填充。我用 BufferedWriter 将这些评论保存在一个用分号分隔的 .txt 文件中。
我正在尝试将该 .txt 文件的内容读回到程序中,这是问题开始的地方。我正在使用扫描仪读取文件,它非常适合前几个 TextAreas。但是,在另一组 JTextAreas 上,如果保存文件中只有空格或没有任何内容,它就会失败。我不明白为什么它在几行之前工作正常。
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);
}}});
现在,如果保存文件包含每个 JTextArea 的值,第二个 for-Loop 可以完美运行,但如果其中一个元素只有空格,则失败。我在这里做错了什么?
似乎如果输入字符串没有您将要调用的输入的确切数量 scan.next()
但是 return 不会有任何元素,因此您可以从 documentation 它抛出一个 NoSuchElementException
.
public String next()
Finds and returns the next complete token from this scanner. A complete token is preceded and followed by input that matches the delimiter pattern. This method may block while waiting for input to scan, even if a previous invocation of hasNext() returned true.
Throws: NoSuchElementException - if no more tokens are available IllegalStateException - if this scanner is closed
要解决此问题,请添加一个检查以查看是否有令牌,否则如果没有令牌则添加空字符串。你可以用这样的三元运算符来做到这一点
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]);