如何安全扫描整数输入?

时间:2011-09-16 14:42:21

标签: java exception input infinite-loop java.util.scanner

Scanner scanner = new Scanner();
int number = 1;

do
{
    try
    {
        option = scanner.nextInt();
    }
    catch (InputMismatchException exception)
    {
        System.out.println("Integers only, please.");
    }
}
while (number != 0);

尽管有异常处理,但在给出非整数输入时,此代码将进入无限循环。它不是Scanner暂停以在下一次迭代中收集输入,而是继续抛出InputMismatchException直到程序被杀死。

扫描整数(或其他类型,我猜)输入,丢弃无效输入并正常继续循环的最佳方法是什么?

5 个答案:

答案 0 :(得分:5)

将您的代码更改为此

catch (InputMismatchException exception) 
{ 
    System.out.println("Integers only, please."); 
    scanner.nextLine();
} 

答案 1 :(得分:5)

在尝试将输入值分配给int之前,应检查输入是否可以解析为int。您不应该使用异常来确定输入是否正确,这是不好的做法,应该避免。

if(scanner.hasNextInt()){
   option = scanner.nextInt();
}else{
   System.out.printLn("your message");
}

这样,您可以检查输入是否可以解释为int,如果是,则指定值,如果不显示消息。调用该方法不会使扫描仪前进。

答案 2 :(得分:3)

来自javadoc:如果下一个标记无法转换为有效的int值,则此方法将抛出InputMismatchException,如下所述。如果翻译成功,扫描仪将超过匹配的输入。

请注意那里的第二句话,只有在成功的情况下才会进展。这意味着您需要将catch块更改为以下内容:

catch (InputMismatchException exception) 
{ 
    System.out.println("Integers only, please."); 
    scanner.next();
}

答案 3 :(得分:0)

我认为这样更好

import java.util.*;

class IntChkTwo{

public static void main(String args[]){

    Scanner ltdNumsScan = new Scanner(System.in);
    int ltdNums = 0;
    int totalTheNums = 0;
    int n = 4;



    System.out.print("Enter Five Numbers: ");
    for(int x=0;x<=n;x++){
        try{
            ltdNums = ltdNumsScan.nextInt();
            totalTheNums = totalTheNums + ltdNums;
        }catch(InputMismatchException exception){
            n+=1;//increases the n value 
                    //maintains the same count of the numbers
                    //without this every error is included in the count
            System.out.println("Please enter a number");
            ltdNumsScan.nextLine();

        }//catch ends
    }//for ends

    int finalTotalNums = totalTheNums;
    System.out.println("The total of all of the five numbers is: "+finalTotalNums);



}

}

我对代码示例感到困惑,所以我不得不重写它。希望这可以帮助你甚至多年。我知道它有所不同,但是当我尝试使用示例代码添加数字时,我一直很困惑。

起初我的烦恼是错误。

我宁愿放弃do-while循环,之前尝试过,如果你错过了某些东西,那就会进入无限循环。

答案 4 :(得分:0)

如果它扫描非int变量,则会弹出异常,如果不是flag则为true,循环将退出。

Scanner scanner = new Scanner();
int number = 1;
boolean flag = false;

do
{
    try
    {
        option = scanner.nextInt();
        flag=true;
    }
    catch (InputMismatchException exception)
    {
        System.out.println("Integers only, please.");
    }
}
while ( flag );