在空行

时间:2017-03-27 14:44:37

标签: java java.util.scanner nosuchelementexception

我得到了一个包含大量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可以正常工作,但如果其中一个元素只有空格则会失败。我在这里做错了什么?

1 个答案:

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