2013-07-25 97 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沒有可讀的整數。您應該確保掃描儀將返回的下一個事實上是一個整數。見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的開關會導致奇怪的事情發生。您應該在每個案例後添加一箇中斷,併爲案例8添加System.exit(0)

其次,您是否在掃描器提示處鍵入了任何內容?如果你輸入一個輸入結束符號,就會發生。另外,System.in對應什麼流?如果你是從真正的命令行調用它並且不輸入輸入的結尾,我不會看到這會發生。

+0

我只是使用Eclipse內部的控制檯。我經歷了並增加了休息和退出命令。我在掃描儀提示處輸入了什麼?第一次,它做我想做的任何事情。然後,在完成該任務後,它會通過原始while循環返回並崩潰,而不要求我另外輸入。 – waltershc