我如何使用扫描仪有什么问题?

时间:2014-10-11 19:32:34

标签: java java.util.scanner

我正在编写一个程序,允许我查看计算机上的java文件并查看所有大括号是否匹配,因此在匹配之前有{as}和no}。它让我选择一个文件,然后在我做之后说我没有这样的元素异常并且没有找到任何行。另一半时间它只是永远运行,让我觉得我设置了一个无限循环。任何提示扫描仪或while循环的提示将不胜感激。

public class BraceChecker {

public static void main(String[] args) {
    final JFileChooser fc = new JFileChooser();
    int response = fc.showOpenDialog(null);
    boolean end = true;

    if (response == JFileChooser.APPROVE_OPTION) {
        File f = fc.getSelectedFile();
        Scanner scan1 = new Scanner(f.toString());
        String line;
        ArrayListStack Stack1 = new ArrayListStack();
        while ((line = scan1.nextLine()) != null && end) {
            for (int i = 0; i < line.length(); i++) {
                if (line.charAt(i) == '{') {
                    Stack1.push('{');

                }
                if (line.charAt(i) == '}') {
                    if (Stack1.isEmpty()) {
                        System.out.println("Braces Are Unbalanced");
                        end = false;
                        i = line.length();
                    } else {
                        Stack1.pop();
                    }
                }
            }
        }
        if (end == true && Stack1.isEmpty()) {
            System.out.println("Braces are Balanced");
        }

    }

}

2 个答案:

答案 0 :(得分:1)

这是你的问题:

 while ((line = scan1.nextLine()) != null && end) 

请改用扫描仪的hasNextLine方法。如果您尝试扫描不存在的行(例如,如果您尝试离开文件末尾),则nextLine会抛出NoSuchElement

答案 1 :(得分:0)

我在这看到2个问题:

Scanner scan1 = new Scanner(f.toString());

扫描程序应扫描文件而不扫描它的字符串表示,否则它会扫描f.toString()中的字符串,这将是文件的名称,因此请使用:

new Scanner(f);// the file itself not its String representation

然后关于NoSuchElement错误。这是你为while循环写的条件的问题。虽然放置!= null似乎是正确的,但如果该行不存在,scanner.nextLine()不返回null,则抛出NoSuchElementException。

所以要解决这个问题:

 String line ;
 while(scanner1.hasNext()){ //hasNext() means the sanner has a next line 
   line = scanner1.nextLine();
 }