【问题标题】:Checking for empty String for error checking检查空字符串以进行错误检查
【发布时间】:2012-08-14 03:05:59
【问题描述】:

为什么这个方法会导致运行时错误?我知道 calc 不适用于空字符串,所以如果是这种情况,我将 hour 设置为 0。

呼叫:

String hoursJLabel = actionObject.calculateHours();
totalHours.setText(hoursJLabel);

方法:

public String calculateHours (){
    double sum = 0;
    double hour = 0;
    for (int i = 0; i < 7; i++) {
        if (hourArray[i].getText() != "") {
            hour = Double.parseDouble(hourArray[i].getText());
        }
        else  {
            hour = 0;
        }
    }
    sum += hour;
    return String.format("%.2f", sum);
}

【问题讨论】:

  • 请显示异常堆栈跟踪。
  • != "" 绝对是a 问题,尽管它可能不是 问题。始终使用.equals 来比较字符串。
  • 我不确定您的代码应该做什么,但您不希望 sum += hour 在 for 循环中吗?
  • @David 我们的任何答案解决了您的问题还是需要进一步的帮助?

标签: java swing object methods if-statement


【解决方案1】:

calculateHours() 中可能出现运行时错误的可能性有多种:

  • hourArraynull 并抛出 NullPointerException
  • 任何hourArray[i] 为空并抛出NullPointerException
  • hourArray[i].getText() 无法解析为 Double 并抛出 NumberFormatException
  • 您的 hourArray 可能包含少于 7 个元素,这会引发 IndexOutOfBoundsException

除此之外,hourArray[i].getText() != "" 是一个不好的比较,因为它不检查 null 并检查两个对象是否是同一个对象,而不是它们是否相等。

另外,我猜你希望在循环中包含sum += hour,否则sum 将包含hourArray 的最后一个值。

所以,你的方法应该是这样的:

public String calculateHours (){
    double sum = 0;
    if(hourArray != null){ // hourArray might be null
        double hour = 0;
        for (int i = 0; i < hourArray.length; i++) { // use .length here
            // check for nulls and empty String
            if (hourArray[i] != null && hourArray[i].getText() != null 
                                     && !"".equals(hourArray[i].getText())) {
                try{ // the text might can not be parsed to a double
                    hour = Double.parseDouble(hourArray[i].getText());
                }catch(NumberFormatException ex){
                    hour = 0;
                }
            }
            else  {
                hour = 0;
            }
            sum += hour; // I guess you want that inside your loop
        }
    }
    return String.format("%.2f", sum);
}

无论如何,如果这个类的编写方式不必在calculateHours() 方法中检查所有这些可能性,那就更好了。您会注意到,如果必须在此处完成所有这些检查,阅读会变得多么困难。

【讨论】:

    【解决方案2】:

    要检查非空String 是否为空,请使用length() 方法:

    if (hourArray[i].getText().length() == 0) ...
    

    如果一个字符串可以是null,则在长度之前添加一个检查,如下所示:

    String str = hourArray[i].getText();
    if (str != null && str.length() == 0) ...
    

    如果您使用 Java-6 或更高版本,则可以进一步简化:

    String str = hourArray[i].getText();
    if (str != null && str.isEmpty()) ...
    

    【讨论】:

    • @PaulBellora 这直到 Java-6 才可用,但你是对的。
    【解决方案3】:

    FI:Apache commons StringUtils 有一个方法 isBlank 可以处理 null、空和只有空格等的字符串,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-15
      • 2013-04-11
      • 1970-01-01
      • 2019-11-03
      • 2011-04-01
      • 2017-11-25
      • 1970-01-01
      • 2012-10-25
      相关资源
      最近更新 更多