2015-03-15 3 views
1

Когда я пытаюсь скомпилировать с Eclipse, у меня есть следующие ошибки:не могу понять, что случилось с моей программой Brackets_checker

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

У вас есть ошибка при компиляции или при запуске? – David

ответ

0

это неправильно:

c = sc.next().charAt(i); 

Вы читаете String из файла и получаете i-й символ от него. При следующем вызове c = sc.next().charAt(i) вы получите i-й символ следующей строки, что означает, что вы читаете только один символ из каждой строки и пропускаете все остальное.

Вы должны сохранить sc.next() в переменной String и перебрать символы этой строки до того, как вы снова вызовете sc.next().

И c != '\n' не является хорошим условием остановки. Вы должны проверить вместо этого, если последний вызов sc.next() возвратил null.

Подумайте об этом, если вы ожидаете, что весь ваш вход будет в одной строке, просто позвоните String s = sc.nextLine(); один раз и обработайте символы s.

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) 
} 

Вы также должны использовать Scanner#hasNext() перед вызовом next(), безопаснее, а также проверить ваш возвращенный String (currentToken в вышеуказанный пример) нет null.

Смежные вопросы