-2

このメソッドで実行時エラーが発生するのはなぜですか? 空の文字列では計算が機能しないことを理解しているので、その場合は時間を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

ランタイムエラーが発生する可能性は複数ありますcalculateHours()

  • hourArrayでありnull、スローしますNullPointerException
  • anyhourArray[i]はnullであり、NullPointerException
  • hourArray[i].getText()に解析できず、DoubleをスローしますNumberFormatException
  • あなたのhourArrayかもしれない要素が7つ未満である場合、IndexOutOfBoundsException

それに加えて、2つのオブジェクトが等しいかどうかではなく、同じオブジェクトであるかどうかを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 に答える
1

null 以外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()) ...
于 2012-08-14T03:11:59.080 に答える
0

FI: Apache commons StringUtils には、null、空、スペースのみの文字列などを処理する isBlank メソッドがあります。

于 2012-08-14T03:27:22.010 に答える