扫描仪仅接受第四个输入

时间:2016-08-02 13:19:47

标签: java exception input java.util.scanner

我最近开始学习Java,目前我正在处理例外情况 程序是一个游戏 - 数字猜测 下面的代码表示类票证 机票有序列号,由8个号码组成 前七个数字是玩家选择的数字,最后一个数字是打印的票数(它是静态变量) 应该检查输入,以便玩家只能选择数字,数字必须在1到90之间。此外,所有数字必须不同(我们不考虑打印的票数)。

真正的问题是Scanner 当我运行程序时,扫描仪在接受之前要求玩家进行两次,即使玩家先输入好的号码。

以下是代码:

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();
     }
 }

1 个答案:

答案 0 :(得分:4)

每次调用if(contains(ticketNum,sc.nextInt())){ throw new DuplicateValueException(); } if((sc.nextInt()<1)||(sc.nextInt()>90)){ throw new ValueException(); } 时,都会从输入中获取一个新的整数。例如,在您拥有的块中

int input = sc.nextInt();

你实际上可以用三个独立的整数阅读。

你不想这样做。相反,您可以将获取的整数分配给局部变量

-x

并且每次需要时只检查该变量的值。