【问题标题】:Java - checking if parseInt throws exceptionJava - 检查 parseInt 是否抛出异常
【发布时间】:2011-09-21 07:45:25
【问题描述】:

我想知道只有在 Integer.parseInt(whatever) 没有失败的情况下如何做某事。

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

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

想出了这样的东西,但它不起作用:

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

任何帮助表示赞赏。

【问题讨论】:

标签: java string jtextarea parseint


【解决方案1】:
public static boolean isParsable(String input) {
    try {
        Integer.parseInt(input);
        return true;
    } catch (final NumberFormatException e) {
        return false;
    }
}

【讨论】:

  • 不要捕获所有异常。这是非常糟糕的做法。
  • NumberFormatException。你也可以做对。它已记录在案。
  • 这只适用于这个特定的 try/catch 语句或任何其他 NumberFormatException。
  • “不要捕获所有异常。这是非常糟糕的做法。” 在这种情况下,这完全没问题,也是正确的做法,因为您只是在做正在检查是否有任何问题。捕获所有异常并记录它们。
  • 捕获所有异常绝不是正确的做法,因为这里预期的唯一异常是 parseInt 抛出的异常。如果出现其他任何问题,您将不希望程序继续运行(假设是非法访问异常,因为有人弄乱了反射)
【解决方案2】:

parseInt 如果无法解析整数,将抛出NumberFormatException。所以这样做会回答你的问题

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

【讨论】:

  • 这应该是正确答案,因为接受的答案是错误的。
【解决方案3】:

您可以在 java 中使用try..catch statement 来捕获可能由 Integer.parseInt() 引起的异常。

例子:

try {
  int i = Integer.parseint(stringToParse);
  //parseInt succeded
} catch(Exception e)
{
   //parseInt failed
}

【讨论】:

  • 为什么投反对票?这是一个有效的答案,虽然异常捕获对于良好的实践来说太模糊了,但它会起作用。
  • @josh.trow,在执行 parseint 时抛出异常也是不好的做法,因为它确实不是真正的异常,可以提供可解析的方法(检查是否可以解析)或将其转换为奇怪的值(如 Ruby 和 perl)
  • 那么有什么例外呢?
【解决方案4】:

应该是这样的。

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
    }
}

【讨论】:

    【解决方案5】:

    检查它是否整数可解析

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

    或使用扫描仪

    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();
    }
    

    【讨论】:

    • +1 用于使用 Scanner 进行无异常验证。
    【解决方案6】:

    而不是trying 和catching 表达式.. 最好在字符串上运行正则表达式以确保它是有效数字..

    【讨论】:

    • 如何更好?为什么要重新发明轮子?为什么要冒正则表达式与 parseInt() 不匹配的风险?为什么要浪费时间和金钱?
    • 当异常有开销(对于 JVM)来准备堆栈跟踪然后继续执行程序(这有点耗时)...检查表达式总是更好在解析之前..
    • 开销是微不足道的,我提出的其他问题也不是。您的一揽子陈述不成立。
    • 7 年后,没有人注意到这一点 - 对“一揽子声明”的指责没有帮助。如果性能至关重要,则有必要对这两种技术进行比较。准备正则表达式和堆栈跟踪都不是完全可以忽略不计的。事实上,正则表达式可以被缓存。
    【解决方案7】:

    您可以使用扫描仪代替 try-catch:

    Scanner scanner = new Scanner(line).useDelimiter("\n");
    if(scanner.hasNextInt()){
        System.out.println("yes, it's an int");
    }
    

    【讨论】:

      【解决方案8】:

      你可以试试

      NumberUtils.isParsable(yourInput)
      

      它是org/apache/commons/lang3/math/NumberUtils 的一部分,它检查字符串是否可以被Integer.parseInt(String)Long.parseLong(String)Float.parseFloat(String)Double.parseDouble(String) 解析。

      见下文:

      https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/math/NumberUtils.html#isParsable-java.lang.String-

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-23
        • 1970-01-01
        • 2018-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-04
        相关资源
        最近更新 更多