我该如何修复NumberFormatException?

时间:2017-12-08 12:39:12

标签: java

我知道这个错误是由数字格式异常引起的,但我不知道如何修复它。我试着做一个函数来检查变量是否是数字或字符串 这是我的代码

public boolean checkNumber(String x) {
   try{
       Integer.parseInt(x);
       return true;
   }catch(NumberFormatException ex){
       return false;
   }
}

这是一个函数采用格式为dd / mm / yyyy的参数, 拆分并将其存储在一个数组中,然后调用前一个函数来确定所有索引是否都是整数。

public boolean CheckBirthDate(String birthdate){
    int B = 0;
    String Line = birthdate;
    String[] seprated = Line.split("/");
    if( checkNumber(seprated[0])  && checkNumber(seprated[1])  && checkNumber(seprated[2])) {
        B = 1;
    }
    if(seprated.length == 3 && Integer.parseInt(seprated[0]) <= 31  && Integer.parseInt(seprated[1]) <=   12 && Integer.parseInt(seprated[2]) >= 1950 &&  Integer.parseInt(seprated[2]) <= 2017 && B == 1){
        return true;
    }else{
        return false;
    }
}

3 个答案:

答案 0 :(得分:2)

为什么不使用DateFormat?

date = Fri May 25 00:00:00 CET 1973

结果:

{{1}}

答案 1 :(得分:1)

这将有效:

public boolean CheckBirthDate(String birthdate) {
    int B = 0;
    String Line = birthdate;
    String[] seprated = Line.split("/");
    if (checkNumber(seprated[0]) && checkNumber(seprated[1]) && checkNumber(seprated[2])) {
        B = 1;
    }
    if (B == 1 && seprated.length == 3 && Integer.parseInt(seprated[0]) <= 31 && Integer.parseInt(seprated[1]) <= 12
        && Integer.parseInt(seprated[2]) >= 1950 && Integer.parseInt(seprated[2]) <= 2017) {
        return true;
    } else {
        return false;
    }
}

问题是,您检查if子句末尾是否B == 1而不是开头。因此,java尝试解析整数,即使它尚未验证它实际上是一个数字。

我还会使用布尔值B而不是int。但一般来说,SurfMan的解决方案可能是最好和最漂亮的

答案 2 :(得分:1)

我建议调试以找出错误发生的位置。

无论如何,最后一个条件,我建议你改变顺序。首先检查字符串是否为数字,这是完美的,然后将结果存储在变量中,很好。问题是条件工作的方式可能是这里的问题。 你最后检查一下是否有数字,应该在开头就完成,如:

if (B == 1 && seprated.length == 3 && Integer.parseInt(seprated[0]) <= 31 && Integer.parseInt(seprated[1]) <= 12
        && Integer.parseInt(seprated[2]) >= 1950 && Integer.parseInt(seprated[2]) <= 2017) {
        return true;
    } else {
        return false;
    }

这种方式首先检查第一个条件,如果是假,它不会继续执行其他条件,因为false&amp; true总是假的