1

2 つのコンストラクタを持つクラスがあります。1 つはDateオブジェクトを受け入れ、もう 1 つは指定されたタイムスタンプ文字列に基づいて日付オブジェクトを作成しようとします。この注意点は、Dateオブジェクトへの変換で例外がスローされる可能性があることです。「変数のタイムスタンプが初期化されていない可能性があります」というエラーが表示されます。

最初のコンストラクター:

public Visit(Date timestamp) {
    this.timestamp = timestamp;
}

2 番目のコンストラクター (エラーを生成するコンストラクター):

public Visit(String timestamp) {
    try {
        this.timestamp = dateFormat.parse(timestamp);
    } catch (ParseException ex) {
        Logger.getLogger(Visit.class.getName()).log(Level.SEVERE, null, ex);
    }
}

this.timestampfinallyステートメントにの初期化を追加しようとしましtryたが、変数が既に初期化されている可能性があるというエラーが発生します。

4

3 に答える 3

3

例外が発生したときにデフォルト値を使用しても構わない場合は、次のようにすることができます。

Date temp = null;
try {
    temp = dateFormat.parse(timestamp);
} catch (ParseException ex) {
    Logger.getLogger(Visit.class.getName()).log(Level.SEVERE, null, ex);
}

this.timestamp = (temp == null ? <some default Date value> : temp);

そうでない場合は、コンストラクターから例外をスローできます。通常、コンストラクターの引数が有効でない場合は、IllegalArgumentExceptionたとえばを再スローできます。

于 2012-08-25T15:08:12.270 に答える
1

または、コンストラクターが例外を「スロー」するようにすることもできます。次に例を示します。

 public ToDelete(Date date) throws Exception {
    this.date = this.getDate(); //getDate throws the Exception
}
于 2012-08-25T15:11:32.993 に答える
1

this.timestamp の初期化を try の finally ステートメントに追加しようとしましたが、変数が既に初期化されている可能性があるというエラーが発生します。

これは、コンストラクターのすべてのコード パスで final メンバー変数を初期化する必要があり、一度だけ初期化する必要があるためです。これを回避する唯一の方法は、解析ロジックを代入から切り離すことです。

于 2012-08-25T15:12:42.220 に答える