无法弄清楚我的Brackets_checker程序有什么问题

时间:2015-03-15 09:55:27

标签: java eclipse

当我尝试使用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();
    }

  }
}

2 个答案:

答案 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的字符。