2015-04-10 3 views
0

Я пишу программу, которая занимает год как пользовательский ввод и возвращает победителя суперкубка за этот год (используя текстовый файл списка победителей суперкубка). Это правильно компилирует, но когда я пытаюсь запустить программу, я получаю ошибку:Использование сканера для чтения из текстового файла

Исключение в нити «основной» java.util.NoSuchElementException: Нет линии не найдено на java.util.Scanner.nextLine (Scanner.java:1540) at Hw5pr4.main (Hw5pr4.java:17)

Что я делаю неправильно?

Текстовый файл:

1967 Green Bay Packers 
1968 Green Bay Packers 
1969 New York Jets 
1970 Kansas City Chiefs 
1971 Baltimore Colts 
1972 Dallas Cowboys 
1973 Miami Dolphins 
1974 Miami Dolphins 
1975 Pittsburgh Steelers 
1976 Pittsburgh Steelers 
1977 Oakland Raiders 
1978 Dallas Cowboys 
1979 Pittsburgh Steelers 
1980 Pittsburgh Steelers 
1981 Oakland Raiders 
1982 San Francisco 49ers 
1983 Washington Redskins 
1984 Los Angeles Raiders 
1985 San Francisco 49ers 
1986 Chicago Bears 
1987 New York Giants 
1988 Washington Redskins 
1989 San Francisco 49ers 
1990 San Francisco 49ers 
1991 New York Giants 
1992 Washington Redskins 
1993 Dallas Cowboys 
1994 Dallas Cowboys 
1995 San Francisco 49ers 
1996 Dallas Cowboys 
1997 Green Bay Packers 
1998 Denver Broncos 
1999 Denver Broncos 
2000 St. Louis Rams 
2001 Baltimore Ravens 
2002 New England Patriots 
2003 Tampa Bay Buccaneers 
2004 New England Patriots 
2005 New England Patriots 
2006 Pittsburgh Steelers 
2007 Indianapolis Colts 
2008 New York Giants 
2009 Pittsburgh Steelers 
2010 New Orleans Saints 
2011 Green Bay Packers 
2012 New York Giants 
2013 Baltimore Ravens 
2014 Seattle Seahawks 
2015 New England Patriots 

Исходный код:

import java.util.*; 
import java.io.*; 

public class Hw5pr4 
{ 
    public static void main(String[] args) throws IOException{ 
     File winners = new File("SuperBowlWinners.txt"); 
     Scanner reader = new Scanner(winners); 
     String[][] data = new String[49][2]; 

     int index = 0; 
     while(reader.hasNext()){ 
      int yr = reader.nextInt(); 
      String year = Integer.toString(yr); 
      data[index][0] = year; 
      reader.nextLine(); 
      data[index][1] = reader.nextLine(); 
      index++; 
     } 

     Scanner keyboard = new Scanner(System.in); 
     System.out.println("Enter a year, or to exit, enter STOP"); 
     String input = keyboard.nextLine(); 

     String winner = "Not found"; 
     boolean found = false; 
     while(input!="STOP"){ 
      for(int i=0; i<49; i++){ 
       if(input.equals(data[i][0])){ 
        winner = data[i][1]; 
        found = true; 
       } 
      } 
      System.out.println("Enter a year, or to exit, enter STOP"); 
      input = keyboard.nextLine(); 
     } 
     if(found) 
      System.out.println(winner); 
     else 
      System.out.println("Error: the year is not in the data."); 
    } 
} 

ответ

0

Вы огонь nextLine более чем один раз. Вы должны сохранить nextLine() в переменной в начале вашей структуры while() и использовать ее.

Если вы, к примеру, в строке 10 вы будете пытаться читать строки 10 и строки 11.

+0

Ах, вот что это было. Я думал, что nextInt() оставляет наличный доход в буфере клавиатуры, который должен быть очищен, чтобы читать ввод с использованием nextLine(), но в этом случае он не является – Tommy

+0

. Это несколько сопоставимо с чтением слишком далеко с помощью subString() или выходя из индекса массива. Общая ошибка при запуске с java. Btw, не забудьте поднять полезные ответы и принять один из ответов;) –

1

Прежде всего вы читаете следующую строку много времени:

while(reader.hasNext()){ 
      int yr = reader.nextInt(); 
      String year = Integer.toString(yr); 
      data[index][0] = year; 
      reader.nextLine(); 
      data[index][1] = reader.nextLine(); 
      index++; 
     } 

Попробуйте удалите первый reader.nextLine(), потому что вы читаете следующую строку в data [index] [1] = reader.nextLine();

У вас также есть другая ошибка - while (input! = "STOP"). Для сравнения строк следует использовать в то время как (! Input.equals («СТОП»).

Я также заметил, что у вас есть какие-то другие ошибки в коде. Например, я думаю, вы должны поставить этот кусок кода

if(found) 
      System.out.println(winner); 
     else 
      System.out.println("Error: the year is not in the data."); 

в цикле в то время как для печати команды для ввода года необходимо также установить нашел ложь в начале каждой итерации цикла While Вы найдете другие ошибки самостоятельно

EDIT:... вот пример кода, как вы должны написать свой код в JAVA (это не идеально, но вы можете видеть, что следует учитывать):

File winners = new File("D:\\stack.txt"); 
     Scanner reader = new Scanner(winners); 
     HashMap<Integer, String> map = new HashMap<>(); 

     while (reader.hasNext()) { 
      map.put(reader.nextInt(), reader.nextLine().trim()); 
     } 

     Scanner keyboard = new Scanner(System.in); 
     String input = ""; 
     do { 
      System.out.println("Enter a year, or to exit, enter STOP"); 
      try { 
       input = keyboard.nextLine().toUpperCase(); 
       if(map.containsKey(Integer.parseInt(input))){ 
        System.out.println(map.get(Integer.parseInt(input))); 
       } else { 
        System.out.println("Error: the year is not in the data."); 
       } 
      } catch (Exception e) { 
       //This is just an example of handling exception, you must handle it better 
       //e.printStackTrace(); 
       if(!input.equals("STOP")) 
        System.out.println("You must enter a valid number..."); 
      } 
     } while (!input.equals("STOP")); 
Смежные вопросы