Java 扫描仪只接受第四个输入

Java 扫描仪只接受第四个输入,java,exception,input,java.util.scanner,Java,Exception,Input,Java.util.scanner,我最近开始学习Java,目前正在处理例外情况。 该程序是一个游戏-猜测数字。 下面的代码代表班级票 车票有序列号,由8个数字组成。 前7个数字是玩家选择的数字,最后一个数字是打印的票数(它是静态变量)。 应检查输入,以便玩家只能选择数字,数字必须介于1和90之间。同样,所有的数字必须不同(我们不考虑打印的票数)。 真正的问题是扫描仪。 当我运行程序时,扫描器在被接受之前两次要求玩家输入数字,即使玩家先输入正确的数字 代码如下: public class Ticket { privat

我最近开始学习Java,目前正在处理例外情况。
该程序是一个游戏-猜测数字。
下面的代码代表班级
车票有序列号,由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();
     }
 }
公共舱票{
私有静态int serialNum=0;
私人国际票务[];
票(){
扫描仪sc=新的扫描仪(System.in);
ticketNum=新整数[8];
this.serialNum+=1;
this.ticketNum[7]=serialNum;
System.out.println(“票号输入…”);
对于(int i=0;i<7;i++){
System.out.println(“选择”+(i+1)+“。编号:”;
试一试{
如果(!sc.hasnetint()){
抛出新的ValueException();
}否则{
if(包含(ticketNum,sc.nextInt())){
抛出新的DuplicateValueException();
}
如果((sc.nextInt()<1)| |(sc.nextInt()>90)){
抛出新的ValueException();
}
}
}捕获(异常值e){
System.out.println(e.Message());
i-=1;
sc.nextLine();
持续
}捕获(重复){
System.out.println(e.Message());
i-=1;
sc.nextLine();
持续
}
this.ticketNum[i]=sc.nextInt();
}
}
公共作废printTicketNum(){
System.out.println(“票据序列号:”);
for(int i=0;i0)
返回true;
其他的
返回false;
}
公共静态void main(字符串[]args){
票证t1=新票证();
t1.printTicketNum();
}
}

每次调用
sc.nextInt()
,都是从输入中提取一个新的整数。例如,在

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

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

如果((sc.nextInt()90)){
您认为
nextInt()在这里做什么?不仅在那里,在
中也包含(ticketNum,sc.nextInt())
在你的
捕获中也要小心:@Pshemo看下面我的评论。所以你的直觉是正确的:)扫描器不知道什么时候
nextInt()
应该返回相同的值,什么时候应该返回下一个值,这就是为什么决定总是返回下一个值(如其名称所示).如果我们想在其他地方重用相同的值,我们可以将其存储在变量中(但这不是我们的工作)。我怀疑这是个问题。:D谢谢。再问一个问题。那会是错误吗?如果我有局部变量输入,它是int,但用户类型,比如说“a”?为什么不试试看会发生什么?看看我的昵称……我会试试。我想不能这样做。当错误已经发生时,我没有选择检查它是否是整数我应该有局部变量char,对吗?
int input = sc.nextInt();