【问题标题】:String and Null Exception check through Try and Catch Block通过 Try 和 Catch 块检查字符串和 Null 异常
【发布时间】:2013-03-26 02:52:13
【问题描述】:

以下尝试通过日志记录捕获空双重输入的代码不起作用。我还想检查用户是否错误地在输入字段中添加了一个字符串(但我在编写查询时遇到了麻烦)。有人可以看看这个并指导我。

try {
    if (results1 != 00.00) {
        throw new Exception("Data must be added");
    }
}
catch (Exception e) {  
    log.error("You have an error", e);
}  

用户必须为 results1 输入一个值,因为它用于计算。 Results1 是一个双倍,因为它是一个百分比,我愿意将它更改为一个 int 如果这就是让它工作所需要的。如果用户不小心添加了 % 符号,我还想检查一下 try and catch 技术。我希望我的记录器捕获 NumberFormatException 以进行测试。

我认为这可能是问题所在:

      (results1 != 00.00)

这是检查双精度输入是否为空的最佳方法吗?另外如何检查是否添加了字符串?

【问题讨论】:

  • results1 是什么类型?
  • result1 是双精度。但如果需要,我可以将其更改为 int。

标签: java logging exception-handling log4j double


【解决方案1】:

Java 有函数 Double.parseDouble(string),如果它无法将字符串转换为双精度,它将抛出 NumberFormatException。

//编辑

结合 prashant 的回答,这是一个完整的实现。

try {
    Double result = Double.parseDouble(string);

    //This is required to check that number is a valid Percentage value
    if(!(result > 0 && result < 100)){
       //You will have to create this custom exception or throw a simple exception
       throw new InvalidPercentageCustomException(result + " is not a valid Percentage");
    }
}
catch(Exception e){
//Do Something
}

【讨论】:

  • 不需要catch(Exception e),顶级异常。我们可以捕获 NullPointerException 和 NumberFormatException 因为 parseDouble 只抛出其中任何一个。这提高了可读性并使我们能够实现更好的异常处理。
【解决方案2】:

使用 '==' 或 '!=' 作为双精度浮点数不是一个好主意。您可以与相当小的数字而不是等号 ('==') 进行比较。

 Math.abs(result1)  > 0.001

【讨论】:

  • 为什么 > 0.001,而不是 >= 0.01?这才是重点。这取决于 result1 的精度。无论如何+1
  • 0.01 或 0.001 无关紧要。双精度和浮点精度都具有更高的精度。
  • 没有。如果由于前面步骤中的精度损失导致结果包含 0.002(而不是 0),并且我们正在谈论货币,那么如果您认为它等于 0 会产生巨大的差异。
【解决方案3】:

据我了解,您想检查用户输入(字符串)是否为有效百分比。

你可以像这样使用 parseDouble:

try{
     Double result = Double.parseDouble(results);

     //This is required to check that number is a valid Percentage value
     if(result <= 0.0 || result >= 100.0){
         //You will have to create this custom exception or throw a simple exception
         throw new InvalidPercentageCustomException("Not a valid Percentage");
     }
}
catch(Exception e){
//Do Something
}

还有一个建议:你不应该仅仅为了让你的程序正常工作而改变你的数据类型。

【讨论】:

    【解决方案4】:

    这就是您必须检查 NumberFormatException 的方式。下面的程序有三个例子。第一个是成功场景,第二个是解析异常的空字符串,第三个是解析异常的字符串

    package com.stackoverflow.test;
    
    public class ParseCheck {
    
        public static void main(String args[]) {
    
            String results1 = "123.56";
            String results2 = "";
            String results3 = "xyz";
    
            try {
                Double.parseDouble(results1);
                System.out.println(results1 + "  parsed successfully");
            } catch (NumberFormatException e) {
                e.printStackTrace();
            }
            try {
                Double.parseDouble(results2);
                System.out.println(results2 + "parsed successfully");
            } catch (NumberFormatException e) {
                e.printStackTrace();
            }
            try {
                Double.parseDouble(results3);
                System.out.println(results3 + "parsed successfully");
            } catch (NumberFormatException e) {
                e.printStackTrace();
            }
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-18
      • 1970-01-01
      • 2013-12-26
      • 1970-01-01
      • 2018-12-13
      • 2017-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多