Java - 检查 parseInt 是否会抛出异常

39

我想知道如何仅在Integer.parseInt(whatever)不失败时执行某些操作。

更具体地说,我有一个包含用户指定值的jTextArea,这些值由换行符分隔。

我想检查每一行是否可以转换为整数。

我尝试了以下代码,但它并不起作用:

for(int i = 0; i < worlds.jTextArea1.getLineCount(); i++){
                    if(Integer.parseInt(worlds.jTextArea1.getText(worlds.jTextArea1.getLineStartOffset(i),worlds.jTextArea1.getLineEndOffset(i)) != (null))){}
 }

希望得到任何帮助。


6
只需处理“NumberFormatException”异常。 - Bala R
可能是什么是NumberFormatException,我该如何修复它?的重复问题。 - xenteros
8个回答

62
public static boolean isParsable(String input) {
    try {
        Integer.parseInt(input);
        return true;
    } catch (final NumberFormatException e) {
        return false;
    }
}

9
不要捕获所有异常。这是非常不好的习惯。 - Amir Raminfar
14
数字格式异常。你最好弄对了。这已经有记录了。 - user207421
1
这将仅适用于此特定的try/catch语句或任何其他NumberFormatException。 - user4919188
1
不要捕获所有的异常,这是非常糟糕的做法。在这种情况下,只检查是否出现了错误是完全可以的,也是正确的做法。捕获所有的异常并记录它们。 - Kerem Baydoğan
1
捕获所有异常绝不是正确的做法,因为这里预期的仅为 parseInt 抛出的异常。如果发生任何其他错误,您不希望程序继续运行(比如说一个非法访问异常,因为有人搞乱了反射)。 - DownloadPizza

28

检查是否可以解析为整数

public boolean isInteger(String string) {
    try {
        Integer.valueOf(string);
        return true;
    } catch (NumberFormatException e) {
        return false;
    }
}

或者使用 Scanner

Scanner scanner = new Scanner("Test string: 12.3 dog 12345 cat 1.2E-3");

while (scanner.hasNext()) {
    if (scanner.hasNextDouble()) {
        Double doubleValue = scanner.nextDouble();
    } else {
        String stringValue = scanner.next();
    }
}

或者使用正则表达式,例如:

private static Pattern doublePattern = Pattern.compile("-?\\d+(\\.\\d*)?");

public boolean isDouble(String string) {
    return doublePattern.matcher(string).matches();
}

3
使用Scanner实现+1的验证而不出现异常。 - Pascal Kesseli

12

这将类似于这样。

String text = textArea.getText();
Scanner reader = new Scanner(text).useDelimiter("\n");
while(reader.hasNext())
    String line = reader.next();

    try{
        Integer.parseInt(line);
        //it worked
    }
    catch(NumberFormatException e){
       //it failed
    }
}

10

如果parseInt无法解析整数,则会抛出NumberFormatException。因此,这样做将回答您的问题。

try{
Integer.parseInt(....)
}catch(NumberFormatException e){
//couldn't parse
}

3
这应该是正确的答案,因为被接受的那个是错误的。 - Luís Henriques

8
您可以使用扫描仪代替try-catch:
Scanner scanner = new Scanner(line).useDelimiter("\n");
if(scanner.hasNextInt()){
    System.out.println("yes, it's an int");
}

3

2
你可以在Java中使用try...catch语句,来捕获由Integer.parseInt()引起的异常。
例如:
try {
  int i = Integer.parseint(stringToParse);
  //parseInt succeded
} catch(Exception e)
{
   //parseInt failed
}

为什么要投反对票?这是一个有效的回答,虽然异常捕获过于模糊,不符合良好的实践规范,但它可以工作。 - josh.trow
2
@josh.trow,当执行parseint时抛出异常也是不好的实践,因为它并不是真正的异常情况,可以提供一个可解析的方法(检查是否可以解析)或将其转换为奇怪的值(如Ruby和Perl)。 - Yet Another Geek
那么异常是用来做什么的? - user207421

2

与其使用 trycatch 表达式,不如在字符串上运行正则表达式以确保它是有效的数字。


更好在哪里?为什么要重复发明轮子?为什么要冒着正则表达式不匹配parseInt()的风险?为什么要浪费时间和金钱? - user207421
2
当出现异常时,准备堆栈跟踪并继续执行程序会增加开销(对于JVM而言),这需要一些时间...最好在解析表达式之前先检查它。 - Anantha Sharma
1
开销微不足道,而我所提出的其他问题却不是。你的一概而论是站不住脚的。 - user207421
七年过去了,没有人注意到这个问题——指责“笼统的陈述”是没有帮助的。如果性能很关键,那么比较这两种技术是必要的。准备正则表达式和堆栈跟踪都不是完全可忽略的。实际上,正则表达式可以被缓存。 - Adam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接