2013-07-25 4 views
-2

Сообщите мне, если вы, ребята, видите что-то не так с этим. Я получаю эту ошибку:Простая ошибка оператора switch?

Exception in thread "main" java.util.NoSuchElementException 
    at java.util.Scanner.throwFor(Unknown Source) 
    at java.util.Scanner.next(Unknown Source) 
    at java.util.Scanner.nextInt(Unknown Source) 
    at java.util.Scanner.nextInt(Unknown Source) 
    at interaction.menu(interaction.java:15) 
    at driver.main(driver.java:9) 

линия 15 является selection = scan.nextInt(); прямо внутри цикла. Основной просто содержит метод, который вызывает этот метод в этом классе.

//provides the interface to be used 
    public void menu(){ 
    Scanner scan = new Scanner(System.in); 
    database db = new database(); 
    int selection; 

    while(true){ 
     hugeTextBlock(); 
     selection = scan.nextInt(); 
     switch(selection){ 
      //creates a new course 
      case 1: db.addCourse(); 
      //removes a course 
      case 2: db.deleteCourse(); 
      //enroll a student 
      case 3: db.enrollStudent(); 
      //delete a student 
      case 4: db.deleteStudent(); 
      //register for a course 
      case 5: db.registerStudent(); 
      //drop a course 
      case 6: db.dropCourse(); 
      //check student registration 
      case 7: db.checkReg(); 
      //quit 
      case 8: break; 
      default: System.out.println("default action"); 
     } 
    } 
} 

Ниже приведен метод addCourse внутри другого класса. Я побежал сам по себе, и все работает отлично.

//creates a new course 
public void addCourse(){ 
    try{ 
    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
    Connection conn = DriverManager.getConnection("jdbc:odbc:StudentRegistration_DSN"); 
    Statement st = conn.createStatement(); 
    Scanner scan = new Scanner(System.in); 

    System.out.println("Please enter the course title: "); 
    String title = scan.nextLine(); 
    System.out.println("Please enter the course's code: "); 
    String code = scan.next(); 

    st.executeUpdate("insert into course values('"+code+"','"+title+"')"); 
    ResultSet rs = st.executeQuery("select * from course"); 
    code = ""; 
    title = ""; 
    System.out.println("This is the relation as of current changes."); 

    while (rs.next()) 
    { 
     code=rs.getString(1); 
     title=rs.getString(2); 
     System.out.println("Code: " + code + " Title: " + title); 
    } 
    rs.close(); 
    st.close(); 
    conn.close(); 
    scan.close(); 
    } 
    catch (Exception e){ 
     System.out.println(e); 
    } 

} 
+4

Возможно, у вас есть перерыв в вашем коммутаторе ... –

+0

См. Http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html. (В частности, поиск этой страницы для фразы * проваливается *.) – ruakh

ответ

0

Исключением является то, что Scanner.nextInt не имеет значения для чтения. Вы должны убедиться, что следующее сканирование сканера будет, по сути, int. См. Scanner.hasNextInt.

while (!scanner.hasNext()) { 
    // sleep here 
} 
if (scanner.hasNextInt()) { 
    selection = scan.nextInt(); 
} else { 
    selection = 0; 
    scan.next(); // reads the garbage. 
} 
+0

Простите мое невежество, но это не останавливает меня, чтобы ввести другое целое число. Он просто заканчивает метод и падает. Я думал, что дело закончится, и цикл while начнет все снова, как в первый раз. Должен ли я делать утверждение, проверяющее 'if (scan.hasNextInt)', и если это не так, выполните другое сканирование? – waltershc

+0

Редактировать: оператор switch отлично работает, если я использую другой случай. Цикл while просто держит его. Кроме того, 'db.addCourse();' работает вне оператора switch. Что происходит, когда метод заканчивается, что испортил объект сканера? – waltershc

+0

Исключение остановит текущий поток. Он больше не будет работать. Вам нужно будет проверить, есть ли вход и если ввод является целым числом. И читайте соответственно. Я обновлю ответ. –

1

Прежде всего, только разрыв выключателя на корпусе 8 приведет к возникновению странных вещей. Вы должны добавить разрыв после каждого случая и добавить System.exit(0) для случая 8.

Во-вторых, вы ввели что-нибудь в подсказке сканера? Если вы наберете символ конца ввода, это произойдет. Кроме того, какой поток соответствует System.in? Если вы вызываете это из подлинной командной строки и не вводите конец ввода, я не вижу, как это может произойти.

+0

Я просто использую консоль внутри Eclipse. Я прошел и добавил перерывы и команду выхода. Я что-то вводил в подсказке сканера? В первый раз он делает то, что я хочу. Затем, после завершения этой задачи, он возвращается через исходный цикл и выходит из строя, не спрашивая меня о другом вводе. – waltershc

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