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]);