当我尝试使用Eclipse编译时,我有下一个错误:
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:907)
at java.util.Scanner.next(Scanner.java:1416)
at scanner_io.Brackets_checker.main(Brackets_checker.java:21)
package scanner_io;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Scanner;
public class Brackets_checker {
public static void main(String[] args) {
int k = 0;
Scanner sc;
char c ;
boolean open = false;
try {
sc = new Scanner(new FileReader("data.txt"));
int i = 0;
c = sc.next().charAt(i);
while (c != '\n') {
c = sc.next().charAt(i);
if (c == '(') {
k++;
open = true;
}
if (c == ')' && open == true) {
k--;
open = false;
}
i++;
}
sc.close();
if (k == 0)
System.out.println("OK !");
else
System.out.println("NOT OK !");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
答案 0 :(得分:1)
Scanner#next()
继续吃元素,每次调用时都会获得一个新元素c = sc.next().charAt(i);
这意味着,如果您有令牌Test is going wrong
,则会生成将分配给c
的字符:T, s, i, n
- 这不是您最有可能的
而是拥有String
变量currentToken
,并对其字符进行迭代:
例如:
String currentToken = sc.next()
for (int i = 0; i < currentToken.length(); i++) {
c = currentToken.charAt(i)
}
您还应该在调用next()
之前使用Scanner#hasNext()
,它更安全,同时验证您返回的String
(上例中为currentToken
)不是null
。
答案 1 :(得分:0)
这是错误的:
c = sc.next().charAt(i);
您从文件中读取一个字符串并从中获取第i个字符。
下次调用c = sc.next().charAt(i)
时,您将获得下一个字符串的第i个字符,这意味着您只读取每个字符串中的一个字符并跳过所有其余字符。
您应该将sc.next()
存储在String变量中,并在再次调用sc.next()
之前迭代该字符串的字符。
并且c != '\n'
不是一个好的停止条件。您应该检查最后一次调用sc.next()
是否返回null。
考虑一下,如果您希望整个输入都在一行中,只需拨打String s = sc.nextLine();
一次并处理s
的字符。