我正在编写一个程序,允许我查看计算机上的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");
}
}
}
答案 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();
}