-2

为什么此方法会导致运行时错误?我知道 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);
}
4

3 回答 3

1

要检查非 nullString是否为空,请使用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()) ...
于 2012-08-14T03:11:59.080 回答
1

有多种可能发生运行时错误calculateHours()

  • hourArraynull并抛出一个NullPointerException
  • anyhourArray[i]为 null 并抛出一个NullPointerException
  • hourArray[i].getText()无法解析为 aDouble并抛出 aNumberFormatException
  • 您的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()方法中的所有这些可能性,那就更好了。您会注意到,如果必须在此处完成所有这些检查,阅读将变得多么困难。

于 2012-08-14T04:47:02.023 回答
0

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

于 2012-08-14T03:27:22.010 回答