2016-08-02 2 views
-3

Я начал изучать Java недавно, и в настоящее время я работаю с исключениями.
Программа игры - Номер Guessing.
Код ниже представляет класс Билет.
Билет имеет серийный номер, состоящий из 8 номеров.
Первые 7 номеров - это те, которые выбраны игроком, а последний номер - количество напечатанного билета (это статическая переменная).
Входы должны быть проверены, чтобы игрок мог выбирать номера, а номера должны быть между 1 и 90. Кроме того, все номера должны быть разными (мы не рассматриваем количество распечатанных билетов).Сканер принимает только четвертый ввод

Какой именно вопрос является сканером.
Когда я запускаю программу, сканер запрашивает игрока за номер два раза до его принятия, даже если игрок сначала набирает номер.

Вот код:

public class Ticket { 

    private static int serialNum = 0; 
    private int ticketNum[]; 

    Ticket() { 
     Scanner sc = new Scanner(System.in); 
     ticketNum = new int[8]; 
     this.serialNum += 1; 
     this.ticketNum[7] = serialNum; 
     System.out.println("Ticket numbers input..."); 

     for (int i = 0; i < 7; i++) { 
      System.out.println("Choose " + (i + 1) + ". number: "); 
      try { 
       if (!sc.hasNextInt()) { 
        throw new ValueException(); 
       } else { 
        if (contains(ticketNum, sc.nextInt())) { 
         throw new DuplicateValueException(); 
        } 
        if ((sc.nextInt() < 1) || (sc.nextInt() > 90)) { 
         throw new ValueException(); 
        } 
       } 
      } catch (ValueException e) { 
       System.out.println(e.Message()); 
       i -= 1; 
       sc.nextLine(); 
       continue; 
      } catch (DuplicateValueException e) { 
       System.out.println(e.Message()); 
       i -= 1; 
       sc.nextLine(); 
       continue; 
      } 

      this.ticketNum[i] = sc.nextInt(); 
     } 
    } 

    public void printTicketNum() { 
     System.out.println("Ticket serial number: "); 
     for (int i = 0; i < this.ticketNum.length; i++) { 
      System.out.print(ticketNum[i]); 
     } 
    } 

    private boolean contains(int arr[], int val) { 
     int flag = 0; 
     for (int i = 0; i < arr.length - 1; i++) { 
      if (arr[i] == val) 
       flag++; 
     } 
     if (flag > 0) 
      return true; 
     else 
      return false; 
    } 

    public static void main(String[] args) { 
     Ticket t1 = new Ticket(); 
     t1.printTicketNum(); 
    } 
} 
+2

'if ((sc.nextInt() <1) || (sc.nextInt()> 90)) {' как вы думаете, 'nextInt()' здесь? – Pshemo

+0

Не только там, также в 'contains (ticketNum, sc.nextInt())' – Tom

+0

Также будьте осторожны в своих блоках 'catch': [Пропуск nextLine() после использования next(), nextInt() или другого nextFoo() методы] (https://stackoverflow.com/questions/13102045/skipping-nextline-after-using-next-nextint-or-other-nextfoo-methods) – Pshemo

ответ

4

Каждый раз, когда вы звоните sc.nextInt(), вы извлечение нового целого числа от входа. Например, в блоке, где у вас есть

if(contains(ticketNum,sc.nextInt())){ 
    throw new DuplicateValueException(); 
} 
if((sc.nextInt()<1)||(sc.nextInt()>90)){ 
    throw new ValueException(); 
} 

Вы действительно можете читать в трех отдельных целых числах.

Вы не хотите этого делать. Вместо этого, вы можете присвоить целое число, которое вы запрашиваете к локальной переменной

int input = sc.nextInt(); 

и просто проверить значение этой переменной каждый раз, когда вам нужно.

+0

Я подозревал, что это проблема. : D Спасибо. – misty

+0

Еще один вопрос. Будет ли это ошибкой - если бы у меня был локальный ввод переменных, который является int, а пользовательскими типами, скажем, 'a'? – misty

+1

Почему бы вам не попробовать и не посмотреть, что происходит? –

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