在Java中,如何检查输入是否为数字?

在Java中,如何检查输入是否为数字?,java,swing,parseint,Java,Swing,Parseint,我正在制作一个简单的程序,让你添加一场比赛的结果,以及他们完成比赛的时间。为了输入时间,我做了如下操作: int time = Integer.parseInt(JOptionPane.showInputDialog("Enter seconds")); 所以我的问题是,如果用户输入的不是正数,我如何向用户显示错误消息?就像一个消息对话框,在你输入一个数字之前,它会告诉你错误 如果JOptionPane.showInputDialog(“输入秒”)不是有效数字,您将获得NumberFormat

我正在制作一个简单的程序,让你添加一场比赛的结果,以及他们完成比赛的时间。为了输入时间,我做了如下操作:

int time = Integer.parseInt(JOptionPane.showInputDialog("Enter seconds"));

所以我的问题是,如果用户输入的不是正数,我如何向用户显示错误消息?就像一个消息对话框,在你输入一个数字之前,它会告诉你错误

如果
JOptionPane.showInputDialog(“输入秒”)
不是有效数字,您将获得
NumberFormatException
。对于正数检查,只需检查
time>=0

int time;
try {
    time = Integer.parseInt(JOptionPane.showInputDialog("Enter seconds"));
} catch (NumberFormatException e) {
    //error
}
Integer.parseInt
如果无法解析
int
,将抛出
NumberFormatException
。 如果您只想在输入无效时重试,请将其包装在
while
循环中,如下所示:

boolean valid = false;
while (!valid) {
    int time;
    try {
        time = Integer.parseInt(JOptionPane.showInputDialog("Enter seconds"));
        if (time >= 0) valid = true;
    } catch (NumberFormatException e) {
        //error
        JOptionPane.showConfirmDialog("Error, not a number. Please try again.");
    }
}

取决于你想如何解决它。 一种简单的方法是将时间声明为整数,然后执行以下操作:

Integer time;    
while (time == null || time < 0) {
    Ints.tryParse(JOptionPane.showInputDialog("Enter seconds"));
}
整数时间;
while(time==null | | time<0){
Ints.tryParse(JOptionPane.showInputDialog(“输入秒”);
}
当然,这需要你使用谷歌番石榴。(其中包含许多其他有用的函数)

另一种方法是使用上面的代码,但使用标准的tryparse,捕获NumberFormatException,在catch中不执行任何操作

有很多方法可以解决这个问题

或者不重新发明车轮,只需使用:
NumberUtils.isNumber
StringUtils.isNumeric
来自
Apache Commons Lang

Integer.parseInt抛出NumberFormatException当参数to Integer.parseInt不是整数时,使用try-Catch并显示所需的错误消息,将其保持在do-while循环中,如下所示

   int   time = -1;
   do{
       try{
            time = Integer.parseInt(JOptionPane.showInputDialog("Enter seconds"));
       }
       catch(NumberFormatException e){

       }
   }while(time<=0);
int-time=-1;
做{
试一试{
time=Integer.parseInt(JOptionPane.showInputDialog(“输入秒”);
}
捕获(数字格式){
}

}当(time@PradeepSimha您有一个问题。您使用正则表达式。现在有两个问题。请添加更多标记。您使用Swing吗?如果是整数秒,请为用户提供一个带有
SpinnerNumberModel
JSpinner
,如中所示。只需运行您的代码并输入一些无效输入。您将得到异常。那又如何您需要做的是处理您的异常。如果需要,您无法立即解析;您必须首先检查长度是否为零。您的复杂代码现在与
input.matches(\\d+)完全相同
。我真的看不出这个最简单的正则表达式比你精心设计的方案有多大的问题。你精心设计的方案涉及常规流控制的例外情况,一种清晰的代码气味。@MarkoTopolnik为例,我的“精心设计”代码是11行,其中4行实际上起到了作用。此外,使用您的方法,您还必须添加
while
循环、新
输入
变量等。除此之外,我认为这是一种非常有效的方法,可以教新的Java程序员关于异常等。好的,所以核心部分是
尝试{return Integer.parseInt](输入)>=0;}catch(NumberFormatException e){return false;}
针对
返回输入。匹配(\\d+”);
。并教人们使用异常(未选中,不少于!)for regular flow control只是一个糟糕的教学示例。教他们不要使用正则表达式进行字符串验证也是一个同样的示例。@MarkoTopolnik显然是想得到一个适合Java int的整数,因此您需要的不仅仅是输入。匹配(\\d+))。它将接受一个100位的字符串。+1@PatriciaShanahan点。虽然它很容易修复,例如
\\d{1,3}
,但它通过验证数字范围更进一步。