1

久しぶりにC#.NETランドでJava(Android)に戻り、さまざまな特異性を思い出そうとしています。

私を立ち往生させているのはこれです。次のように、クラスが適切に初期化されない場合、コンストラクターで例外をスローします。

    // Constructor
    public CountdownDictionary(JSONArray jsValues, ArrayList<String> returnFieldList)
{
    this.DictionaryType = getDictionaryTypeFromValues(jsValues);
    if (this.DictionaryType == CountdownDictionaryTypes.Unknown)
    {
        throw new Exception("Unknown dictionary type");
    }
}

Eclipseでコンパイル時エラーが発生する

未処理の例外タイプ例外

これは私を混乱させます。どうすれば例外を処理できますか?このクラスで例外を処理したくないので、呼び出し元にバブルして処理できるように、未処理のままにしておきます。

私は何が欠けていますか?

4

9 に答える 9

4

コンストラクター内で例外をスローしていますが、メソッド シグネチャで throws 句を指定していませんでした。これはコンパイル時エラーです。これが eclipse の不平です。次のコード スニペットは、問題を解決します。

 public CountdownDictionary(JSONArray jsValues, ArrayList<String> returnFieldList) throws Exception
于 2012-07-10T18:39:58.373 に答える
2

メソッドコンストラクターthrowsのヘッダーに句を追加します。

public CountdownDictionary(JSONArray jsValues, ArrayList<String> returnFieldList) throws Exception
于 2012-07-10T18:40:12.273 に答える
2

メソッドの署名に追加することで、コンストラクターが例外をスローできるコンパイラーを示す必要があります。これによりthrows Exception、呼び出し元は例外を処理する必要があることがわかります。

于 2012-07-10T18:43:10.100 に答える
2

もう 1 つのオプションは、チェック済み例外の代わりに実行時例外をスローすることです。ただし、これは、この例外がプログラマー エラーが原因でのみスローされるかどうかによって異なります。

プログラマーのエラーでない場合、コンストラクターで例外をスローするのは一般的に不適切な呼び出しです。また、タイプ Exception の例外のみをスローするのも、一般的に不適切な呼び出しです。これは、この悪い動作を処理するために、より高いレベルでアプリケーション固有の動作を提供する必要があるためです。

于 2012-07-10T18:43:30.360 に答える
1

throws Exception左中括弧の前に追加するだけです。

于 2012-07-10T18:40:28.890 に答える
1

Exceptionを呼び出し元のメソッドで処理する場合は、次を使用します。

public CountdownDictionary(JSONArray jsValues, ArrayList<String> returnFieldList) throws Exception {
    // ...
}

このように、このメソッドは をスローし、Exception呼び出し元のコードがそれを処理するように強制することが示されています。

于 2012-07-10T18:40:33.017 に答える
1

次の行throw new Exception("Unknown dictionary type");は、プログラムのどこにもキャッチされていない例外をスローしています。

代わりに、次のようにします。

try {
    throw new Exception("Unknown dictionary type");
}catch(Exception e) {
    e.printStackTrace();
}

または

public CountdownDictionary(JSONArray jsValues, ArrayList<String> returnFieldList) throws Exception 
于 2012-07-10T18:41:18.170 に答える
0

これを試して...

私は通常これを使用し、次のように覚えています。

投げと投げの組み合わせ。

メソッドが不正な例外をスローします

そして条件内で、新しい例外オブジェクトをスローします。

例えば:

public CountdownDictionary(JSONArray jsValues, ArrayList<String> returnFieldList) throws Exception
{
    this.DictionaryType = getDictionaryTypeFromValues(jsValues);
    if (this.DictionaryType == CountdownDictionaryTypes.Unknown)
    {
        throw new Exception("Unknown dictionary type");
    }
}
于 2012-07-10T18:49:44.057 に答える
0

私は次のようにします:

// Constructor
public CountdownDictionary(JSONArray jsValues, List<String> returnFieldList)
{
    if (jsValues == null) {
        throw new IllegalArgumentException("JSON array cannot be null");
    }
    if (returnFieldList == null) {
        throw new IllegalArgumentException("Return field list cannot be null");
    }
    this.DictionaryType = getDictionaryTypeFromValues(jsValues);
    if (this.DictionaryType == CountdownDictionaryTypes.Unknown)
    {
        throw new IllegalArgumentException("Unknown dictionary type");
    }
}

これは未チェックの例外であるため、throws 句は必要ありません。

于 2012-07-10T19:24:10.043 に答える