2013-02-12 2 views
0

интересно, может ли кто-нибудь сказать мне, почему мой try-catch не работает. Я вводил символ, когда я должен вводить целое число, и программа просто выходит с исключением. Это похоже на попытку, которую я написал в другой программе. Не знаю, почему это не работает. :(Java try-catch не работает

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

public class Lab8FileIO { 
    public static void main(String[] args) throws IOException { 

    int menuChoice = 0; 
    String filename, userInput, choice; 
    boolean playAgain = true; 
    char response; 
    Scanner keyboard = new Scanner(System.in); 

    while (playAgain) 
    { 
     // Display menu and get user selection 
     displayMenu(); 

     do 
     { 
      try 
      { 
       menuChoice = keyboard.nextInt(); 

       if ((menuChoice < 1) || (menuChoice > 4)) // Make sure user enters a number within the specified range 
        System.out.print("You must enter a number from 1 to 4!"); 
      } 

      catch (InputMismatchException e) 
      { 
       System.out.print("You must enter a number from 1 to 4!"); 
       keyboard.nextInt(); 
      } 
     } while (menuChoice < 1 && menuChoice > 4); 

     // Get input/output filename from user 
     System.out.print("\nEnter filename in the format filename.txt: "); 
     filename = keyboard.next(); 

     switch (menuChoice) 
     { 
     // Write to file 
     case 1: 
      PrintWriter outputFile = new PrintWriter(filename); 

      userInput = getUserInput(); 
      System.out.println("I am writing your input to filename: " + filename + "\n"); 
      outputFile.println(userInput); 
      outputFile.close(); 
      break; 

     // Read from file 
     case 2: 
      File file = new File(filename); 
      Scanner inputFile = new Scanner(file); 

      System.out.println("I am reading from filename: " + filename + "\n"); 

      while (inputFile.hasNextLine()) 
      { 
       String line = inputFile.nextLine(); 
       System.out.println(line); 
      } 
      inputFile.close(); 
      break; 

     // Append to file 
     case 3: 
      FileWriter appendFile = new FileWriter(filename, true); 

      userInput = getUserInput(); 
      System.out.println("I am appending your input to filename: " + filename + "\n"); 
      appendFile.write(userInput); 
      appendFile.close();   
      break; 

     // Exit 
     case 4: 
      System.out.println("Goodbye!"); 
      System.exit(0); 
      break;    
     } 

     // Ask user to play again 
     do 
     { 
      System.out.print("\nWould you like to continue (Y/N)? "); 
      choice = keyboard.next(); 
      response = Character.toUpperCase(choice.charAt(0)); 
     } while (response != 'Y' && response != 'N'); // Keep asking until user enters correct response 

     if (response == 'Y') // Play again 
     { 
      playAgain = true; 
      System.out.println(); 
     } 

     else if (response == 'N') // Quit 
     { 
      playAgain = false; 
      System.out.println("\nThanks for playing!"); 
     } 
    } 

}

public static void displayMenu() 
    { 
     System.out.println("File IO Options:"); 
     System.out.println("1) Write"); 
     System.out.println("2) Read"); 
     System.out.println("3) Append"); 
     System.out.println("4) Quit"); 
     System.out.print("What would you like to do: "); 
    } 

    public static String getUserInput() 
    { 
     String str; 
     Scanner keyboard = new Scanner(System.in); 

     System.out.println("Start typing. Hit enter when you're done:"); 
     str = keyboard.nextLine(); 

     return str; 
    } 
} 

Это ошибка, я получаю:

File IO Опции:
1) Написать
2) Читать
3) Append
4) Выйти
Что вы хотите сделать: a
Вы должны ввести число от 1 до 4! Исключение в потоке "главный"
java.util.InputMismatchException
на java.util.Scanner.throwFor (Scanner.java:840)
в java.util.Scanner .next (Scanner.java:1461)
на java.util.Scanner.nextInt (Scanner.java:2091)
на java.util.Scanner.nextInt (Scanner.java:2050)
в Lab8FileIO.main (Lab8FileIO.java:41)

+5

Опубликовать трассировку стека, возможно, вы пытаетесь поймать неправильное исключение * или * вы неправильно используете блок. Вероятно, вы не поймаете все, 'keyboard.nextInt();' также называется * внутри * catch. –

+3

Обратите внимание, что если блок 'keyboard.nextInt()' * inside * 'catch исключает исключение, он не будет пойман, потому что вы уже находитесь за пределами блока' try'. – ruakh

+0

В другой программе, в которой у меня есть подобный try-catch, есть 'keyboard.nextInt();' в ней. Я не понимаю, почему это работает, а этого нет. – speedracer

ответ

5

Ваша программа не работает, потому что в вашем блоке catch у вас есть keyboard.nextInt();, который выдает новый необработанный InputMismatchException

catch (InputMismatchException e) 
{ 
    System.out.print("You must enter a number from 1 to 4!"); 
    // You can remove this line, since it will be called anyways in the next loop iteration 
    //keyboard.nextInt(); 

    // You can artificially set menuChoice = 1; for example for the loop to continue 
} 
+0

Хорошо, поэтому я удалил 'keyboard.nextInt();' но программа просто продолжает работать. Он не возвращается к запросу, чтобы снова ввести ввод. – speedracer

+0

Потому что в вашей петле ожидается, что 'menuChoice' будет находиться между 1-4' while (menuChoice <1 && menuChoice> 4) '. Вы можете искусственно установить 'menuChoice = 1', например. Это зависит от логики вашей программы и того, что вы хотите сделать. – iTech

+0

@ stef2dotoh Вы должны запустить отладчик, чтобы помочь вам разобраться с этими проблемами. У NetBeans и Eclipse есть отличные инструменты для одновременного просмотра кода по одной строке при просмотре значений переменных. Кроме того, вы можете добавить 'System.out.println()' вызовы, чтобы узнать, что делает ваш код. –

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