1

これはおそらく基本的な質問であり、コードでよりよく説明されています。

    public void checkStatus {
        int status = UNKNOWN;
        if (somecondition) {
             status = STATUS_UP;
        } elseif (someothercondition) {
             status = STATUS_DOWN;
        }
    }

したがって、問題は、定義上、STATUSに影響を与える可能性のあるすべての条件を把握しておらず、ステータスローカル変数を初期化しないことによってコンパイラが「未定義」エラーをスローすることを望まなかったことです。

結論として、私のアプリはステータスがUNKNOWNに設定されていると動作しません。コンパイラをシャットダウンするように設定しただけです。

質問:これにエレガントにアプローチするにはどうすればよいですか。ステータスがまだUNKNOWNに設定されている場合、メソッドの最後に致命的な例外をスローすることを検討しましたが、それは少し「醜い」と感じます。

ありがとうございました。

4

4 に答える 4

1

ステータス変数のデフォルト値をelse条件のみに入れることができるため、いずれかのif条件が渡されない場合、少なくともステータスがデフォルト値を取得します。

于 2012-04-09T12:11:49.267 に答える
1

整数の代わりに列挙型を試すことをお勧めします。

コードはUNKNOWNステータスで機能する可能性があります。これは、if / else if / elseを記述している場合は、else句から返されるものであり、switchを使用している場合はデフォルトの条件です。

例外をスローすることも同様に機能します。それはあなたがするデザインの選択です。不明なステータスが本当に例外的な状況である場合は、例外を使用する必要があります。それが一般的である場合、私は列挙型に傾くでしょう。

于 2012-04-09T12:13:25.773 に答える
1

例外をアサートまたはスローできます。

http://docs.oracle.com/javase/1.4.2/docs/guide/lang/assert.html

于 2012-04-09T12:13:50.437 に答える
1

私は常にチェーンthrowの最後にaを置きif / then / else、変数にデフォルト値を前もって割り当てません。例外がスローされると、アプリケーションを続行できないことを通知するだけでなく、続行できない理由も報告します。さらに、続行できないことが判明するとすぐにそれを実行します。これは、エラー報告にとって非常に望ましいことです(通常、エラーをできるだけ早く報告する必要があります)。

特別なケースが1つあります。これは、someconditionsの組み合わせがチェーンの末尾から外れることはないif / then / elseようにコードを構造化したが、コンパイラーがそれを自動的に検証できない場合です。たとえば、以前に入力を検証しましたが、コードを変更できるパスがないことがわかっています。この特定のケースでは、例外をスローするのではなく、アサーションを使用する必要があります。これは、単純なコーディングエラーではなく、コードに関する推論のエラーを示しているためです。

于 2012-04-09T12:14:51.420 に答える