带有while循环的Java NoSuchElementException

时间:2017-03-10 00:11:19

标签: java while-loop nosuchelementexception

所以我对Java很陌生,我正在为学校制作一个程序。我在使用扫描仪时遇到问题。

public int[] userShoot(int shotType)
    {
        int[] returnThis = {0,0};
        int hitFlag = 0, shotProb;
        int flag = 1;
        if(shotType != 0)
        {
            while(flag == 1)
            {
                System.out.println("Pick a shot");
                System.out.println("1: Field Goal (Normal)");
                System.out.println("2: Three Pointer (Hard)");
                System.out.println("3: Backwards Field Goal (Hard)");
                System.out.println("4: Backwards Three Pointer (Very Hard)");
                System.out.println("5: Trickshot (Completely Random");
                Scanner sc = new Scanner(System.in);
                shotType = sc.nextInt();
                sc.close();
                if(shotType >= 1 && shotType <= 5)
                {
                    flag = 0;
                }
                else
                {
                    flag = 1;
                    System.out.println("Invalid Response.");
                }
            }
        }
        switch(shotType)
        ....
        returnThis[0] = shotType;
        returnThis[1] = hitFlag;
        return returnThis;
    }

使用此版本的代码,我在第一次运行while循环后得到NoSuchElement异常。所以我搜索了这个异常的修复程序,大多数答案告诉我使用hasNextInt()。

所以我改变了我的代码

Scanner sc = new Scanner(System.in);
if(sc.HasNextInt())
    shotType = sc.nextInt();
else
    shotType = 0;

现在当然显而易见的问题是,如果我使shotType = 0,我得到的回复无效。然后它只是循环,无法实际突破while循环。所以我的问题是:如何通过while循环在Java中正确地获取多个输入,例如在这段代码中?我不知道如何修复通过代码的每个循环耗尽的输入。我是否必须在循环外关闭扫描仪?

编辑:我尝试在循环之外关闭:

Scanner sc = new Scanner(System.in);
while(flag == 1)
{....}
sc.close();

但是这并没有解决,它仍然给出了NoSuchElement异常

EDIT2:

结合这两个修复工作,但没有给我我需要的行为。 代码如下:

Scanner sc = new Scanner(System.in);
while(flag == 1)
{
...
    if(sc.hasNextInt())
        shotType = sc.nextInt();
...
}
sc.close();

现在的问题是它只保留第一个输入,并且每次while循环时都不允许用户输入。

EDIT3:
在我的userShoot方法之外打开和关闭我的扫描仪工作 但是,我还必须更改原型并调用该方法。 IE userShoot(int shotType, Scanner sc);作为原型,并在调用它时:userShoot(shotType, sc);
谢谢大家的帮助!!

0 个答案:

没有答案