无论用户输入如何,简单Java方法都返回0

时间:2015-03-17 20:38:32

标签: java methods return-value

该方法应该返回用户输入的整数,只要它只是一个整数(不是String,float等),并且只要该整数是给定选项列表中的选项之一。每当我向用户提供他们需要选择的选项列表时,我想在整个程序中使用此方法。这些列表将具有不同的大小,因此我将参数作为参数传递给用户可能选择的最大值(maxValue),从而为该方法提供列表大小。

//This method handles the players input and checks if the number entered is one of the options listed or not

public static int response(int maxValue){ //the parameter is the number of options in the particular list

    response = new Scanner(System.in);
    Boolean check = true;

    while(check){
        try{
            int yesOrNo = response.nextInt();
            if(yesOrNo > maxValue || yesOrNo <= 0){ //checks if the int entered does not exceed the list size or go below zero
                System.out.println("I'm sorry, that number was not one of the options. Please reselect your choice.");


            }else{
                check = false;
            }
        }catch(Exception e){ //catches an exception when the user enters a string or anything but an int
            System.out.println("Please only use digits to make a selection.");
            response(maxValue);
        }
    }

    return yesOrNo; //returns the user's response. Well, it is supposed to.

}

我是编程方面的初学者。我正在通过在线教程学习Java,并在我做的愚蠢的小程序上试错。我正在进行一个有趣的小文本冒险,我还处于开始阶段。

我遇到的麻烦是因为此方法只返回0.是否yesOrNo被分配了用户通过扫描程序response输入的整数?为什么它只返回0?


感谢您的回复。我现在明白了,我需要在int yesOrNo之外声明我的try,因为它超出了范围,正如你所说的那样,被宣布在内。

但是有一些提到&#39;在catch块中有一个完全不必要的函数调用&#39;。唯一的问题是如果我删除它,当用户输入字符串或其他非int值时,使用System.out.println("Please only use digits to make your selection.")创建了一个无限循环。

这是我更新的代码:

//This method handles the players input and checks if the number entered is one of the options listed or not
public static int response(int maxValue){ //the parameter is the number of options in the particular list
    response = new Scanner(System.in);
    Boolean check = true;
    int yesOrNo = 0;

    while(check){
        try{
            yesOrNo = response.nextInt();
            if(yesOrNo > maxValue || yesOrNo <= 0){ //checks if the int entered does not exceed the list size or go below zero
                System.out.println("I'm sorry, that number was not one of the options. Please reselect your choice.");


            }else{
                check = false;
            }
        }catch(Exception e){ //catches an exception when the user enters a string or anything but an int
            System.out.println("Please only use digits to make a selection.");
            response(maxValue);
        }
    }

    return yesOrNo; //returns the user's response. Well, it is supposed to.

}

在阅读其他帖子之后,在发出另一个问题之前,我发现许多其他人面临同样的问题。有些人说无限循环被创建是正确的,因为当扫描程序遇到错误时它不会删除该错误的标记,从而导致while循环无限地再次读取相同的错误。这是我读到的内容:

&#34;根据扫描仪的javadoc:

&#39;当扫描程序抛出InputMismatchException时,扫描程序将不会传递导致异常的令牌,因此可以通过其他方法检索或跳过它。&#39;

这意味着如果下一个标记不是int,它会抛出InputMismatchException,但标记会保留在那里。因此,在循环的下一次迭代中,getAnswer.nextInt()再次读取相同的标记并再次抛出异常。你需要的是用它。在catch中添加一个getAnswer.next()来使用令牌,该令牌无效且需要丢弃。&#34;

所以现在已经修复了无限循环问题:)找到我需要学习的其他内容。谢谢。

4 个答案:

答案 0 :(得分:2)

yesOrNo超出范围,因为您在try块中声明了它。返回时,将声明移到范围内。

Boolean check = true;
int yesOrNo;

答案 1 :(得分:0)

yesOrNo您返回的内容与

不同
int yesOrNo = response.nextInt();
你的循环中的

。循环中的yesOrNo在}的结束try处消失(超出范围)。

某处必须有另一个int yesOrNo。寻找它。

答案 2 :(得分:0)

唯一可以编译的是yesOrNo被声明为类或实例变量,在此代码段中看不见。

我们看到的yesOrNo声明在try块内声明,隐藏了返回的yesOrNo。但是它没有理由成为类或实例变量。

从类声明中删除它,并在try块之前在本地声明它,所以当它返回时它在范围内。

int yesOrNo = 0;
try{
    yesOrNo = response.nextInt();

答案 3 :(得分:0)

我看到&#34; int yesOrNo&#34;在循环中。在循环范围内读取的值仅限于此。在外面声明该变量并尝试。