1
try
{
    Array.Sort(PokeArray, (x1, x2) => x1.Name.CompareTo(x2.Name));
}
catch (NullReferenceException R)
{
    throw R;
}

ただし、これは私が作成したオブジェクトの配列を並べ替える単純なコード行です。null 値がある場合は、例外がスローされます。try catchブロックが機能していないようです。

この特定の領域x1.Name.CompareTo(x2.Name)で例外が発生します。Catch ブロックの配置が間違っていますか?

ありがとう!

更新: 以下のコメントから取得したスクリーンショット: ここに画像の説明を入力

4

3 に答える 3

6

いいえ、問題ないようです。ただし、例外キャッチした後に例外を再スローしています。Throw Rtry-catch が最初に呼び出されたコード ブロックに例外が渡されることを意味します。

try
{
    Array.Sort(PokeArray, (x1, x2) => x1.Name.CompareTo(x2.Name));
}
catch (NullReferenceException R)
{
    // throw R; // Remove this, and your exception will be "swallowed". 

    // Your should do something else here to handle the error!
}

アップデート

まず、スクリーンショットのリンクを元の投稿に追加します。これにより、問題が明確になります。:)

第二に、例外をキャッチしtry-catch ます-デバッグモードにいる間だけではありません。その行の後もステップを続行すると、try-catch 句から抜け出すことができ、プログラムを続行する必要があります。

例外がキャッチされなかった場合、プログラムは終了していました。

PS : VS のメイン メニューから と を選択DebugExceptions..、どの列でも [スロー] がチェックされていないことを確認してください。そうでなければそうなるでしょう。

明確にするために、これを繰り返しましょう。この例外は、コードがデバッグ モードで実行され、例外の表示が有効になっているため、表示されるだけです。

同じコードが本番モードで実行された場合、OP が期待するように、例外は飲み込まれます。

于 2013-10-25T11:21:17.063 に答える
0

あなたの場合、を呼び出したときにメソッドのデフォルトの実装によって が飲み込まれているNullReferenceExceptionため、コードはスローされません。そして、この例外は次のように伝播さ れます。これがcatch ブロックがスキップされた理由です。コレクション要素として意図的に null を含める次の簡単な例で、シナリオ全体を再現できます。NullReferenceExceptionCompareArray.Sort()InvalidOperationExceptionNullReferenceException

public class ReverseComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
     return y.CompareTo(x); //Here the logic will crash since trying to compare with   null value and hence throw NullReferenceException
    }
}

public class Example
{
    public static void Main()
    {
        string[] dinosaurs =
            {
               "Amargasaurus",
                null,
                "Mamenchisaurus",

            };

        Console.WriteLine();
        foreach (string dinosaur in dinosaurs)
        {
            Console.WriteLine(dinosaur);
        }

        ReverseComparer rc = new ReverseComparer();

        Console.WriteLine("\nSort");
        try
        {
            Array.Sort(dinosaurs, rc); //Out from here the NullReferenceException propagated as InvalidOperationException.
        }
        catch (Exception)
        {

            throw;
        }

    }
}
于 2013-10-25T11:46:00.613 に答える
0

コードで null をより適切に処理することができます。たとえば、すべての値がnullになる可能性がある場合、これでカバーできます:

if (PokeArray != null)
    Array.Sort(PokeArray, (x1, x2) =>
      string.Compare(x1 != null ? x1.Name : null, x2 != null ? x2.Name : null));

これらの値の一部が null になることが予想されない場合は、不要な null チェックを削除することでコードを単純化できます。

于 2013-10-25T11:57:11.803 に答える