2016-10-15 4 views
-3

Код:Отсутствие исключения элемента. Я застрял

package FisherTCh5Sec4to5; 

import java.util.Scanner; 

public class FisherTCh5Sec4to5 { 

public static int generateRandomInt(int lowerLimit, int upperLimit){ 
    int range = (upperLimit - lowerLimit) + 1; 
    int randomInt = (int) Math.random() * range + lowerLimit; 
    return randomInt; 
}//end generate random int 

public static int collectInteger(String purpose, int minimum, int maximum){ 
    Scanner in = new Scanner(System.in); 
    int userInt = 0; 
    boolean done = false; 
    do { 
     System.out.printf(purpose); 
     if (in.hasNextInt()){ 
      userInt = in.nextInt(); 

      if (userInt >= minimum && userInt <= maximum){ 
       done = true; 
      } else System.out.printf("That number isn't in the desired range.\n"); 

     } else System.out.printf("Sorry...I can't use that input.\n"); 

     //Clear input stream 
     in.nextLine(); 

    } while (!done); 
    in.close(); 
    return userInt; 
}// end method 


public static void main(String[] args) { 

    // Variables 
    final int LOWER_LIMIT = 1; 
    final int UPPER_LIMIT = 10; 
    boolean done = false; 
    String playAgain = ""; 
    int count = 0; 
    int wins = 0; 

    // Open input stream 
    Scanner in = new Scanner(System.in); 

    do { 
     // Use collectInteger to get a number 
     int userInput = collectInteger("Let's play a game! Try and guess my number (between 1 and 10): ", LOWER_LIMIT, 
       UPPER_LIMIT); 

     // use generateRandomInt to get a number 
     int randomInt = generateRandomInt(LOWER_LIMIT, UPPER_LIMIT); 

     // If statement to decide a win or loss 
     if (userInput == randomInt){ 
      System.out.printf("Congrats you win! My number was %d.\n", randomInt); 
      wins++; 
     } else System.out.printf("Sorry...my number was %d.\n", randomInt); 


     // Ask user to play again 
     System.out.print("Would you like to continue? (\"c\" to continue \"q\" to quit): "); 
     playAgain = in.next(); 
     if (playAgain.equals("c")){ 
      done = false; 
     } else done = true; 

     count ++; 

    } while(done = false); 

    // Print and calculate win percentage 
    double winPercent = (wins/count) * 100; 
    System.out.printf("Wow! Your win percentage was %.2f%%.\n", winPercent); 

    // close input stream 
    in.close(); 


}//end main 

}//end class 

Все работает прекрасно для части «Вы хотите, чтобы играть снова», за исключением. Думаю, он не позволит мне читать данные пользователя. Есть идеи?

+0

Просто отсутствует! = –

ответ

0

Линия in.close(); в collectInteger закрывает ввод от System.in. Удалите эту строку, и она должна работать.

Кроме этой линии: while(done = false);

должен быть изменен на: while(done == false); или while(!done);

Рассуждения: Используя один знак равенства, вы настраиваете done ложного каждый раз, когда условие цикла проверяется. Это означает, что цикл никогда не повторяется, поскольку условие всегда ложно.

1

Ваш первый вызов in.close() внутри collectInteger() также закрывает входной поток System.in. Это не возобновляется при создании нового сканера. Не верьте мне? Проверьте это с

System.out.println(System.in.available()); // Inside try/catch 

У вас есть несколько вариантов ...

  1. один экземпляр сканера внутри основного() - передать сканер в качестве аргумента collectInteger(). Внутри collectInteger() вам нужно будет заменить in.close() на in.reset(). Закройте сканер внутри основного устройства, когда он вам больше не нужен (или System.in).
  2. Глобальная переменная - private static Scanner in = new Scanner(System.in); - Вам не нужно передавать ее в качестве параметра, а создает более тугое соединение. Опять же - закройте его только тогда, когда вам больше не понадобится System.in
  3. Храните несколько сканеров, но только закрывайте его внутри основного - Не рекомендуется, но поток закрывается при выключении jvm.

Я хотел бы также окружать какие-либо операции ввода-вывода с TRY/поймать/наконец ...

try 
{ 
    // open resource 
    // read/write operation 
} 
catch(/*specific exception(s)*/) 
{ 
    // handle exception 
} 
finally 
{ 
    // close resource 
} 

Другой вопрос:

boolean done = false; // Currently redundant 

do { 
     ... 


     // Ask user to play again 
     System.out.print("Would you like to continue? (\"c\" to continue \"q\" to quit): "); 
     playAgain = in.next(); 
     if (playAgain.equals("c")){ 
      done = false; // Already initialized to false 
     } else done = true; 

     count ++; 

    } while(done = false); 

Может быть изменено на:

boolean done = false; 

do { 
     ... 


     // Ask user to play again 
     System.out.print("Would you like to continue? (\"c\" to continue \"q\" to quit): "); 
     playAgain = in.next(); 
     if (playAgain.equals("q")){ // CHANGE 
      done = true;    // CHANGE 
     } 

     count ++; 

    } while(!done);     // CHANGE 
Смежные вопросы