1

JSON オブジェクトを試すことができるコードを作成しようとしています。それが間違った形式である場合は、何らかの方法でユーザーに通知します。

コードは次のとおりです。

 public boolean sjekkSporingsNummer (JSONObject object){       //object is passed correct
    Boolean riktigSporing = null; 
    riktigSporing = true;                                     //riktig sporing is set to true
    //if its true the json is correct
    try {
    JSONArray consignmentSet = object.getJSONArray("consignmentSet");
    JSONObject object1 = consignmentSet.getJSONObject(0);
    riktigSporing = true;
    }catch (Exception e){                                 //skips straigt to here
        e.printStackTrace();
        riktigSporing = false;
    }
    return riktigSporing;

失敗した場合:

07-31 12:34:07.243  15479-15479/com.example.posten E/AndroidRuntime: FATAL EXCEPTION: main
    java.lang.NullPointerException

私にとって奇妙に思えるのは、私のアプリが try をスキップして、return ステートメントに直接進むことです。

試してみたいのですが、「riktigSporing」を false に設定すると失敗します。

私は何を間違っていますか?

4

4 に答える 4

2

私はそうしないに違いない。入力パラメーターが null で、NPE を非常に早い段階でトリガーしていると思われます。

nullまた、 a をプリミティブにボックス化解除することもできますがboolean、それは機能しません。

編集:

FATAL EXCEPTION: main
java.lang.NullPointerException

はこれをさらに示唆しています。スタックトレースに対応する行番号が必要です。

于 2013-07-31T10:24:17.523 に答える
1

このキャッチでブール値を設定する必要があります。

catch (JSONException e) {
        e.printStackTrace();
        riktigSporing = false;
    }

このキャッチで何らかのエラーが発生した場合、JSON2 番目のキャッチではなく、呼び出されます。あなたのシナリオでは、2番目のキャッチは必要ないと思います。

一般的に使用する場合はException、削除JSONExceptionしてそこだけにしますException

注:コードのスニペットを見たとき、ブール値ではなくブール値をプリミティブ データ型として使用することをお勧めします。より明確で効率的になります。

于 2013-07-31T10:23:21.820 に答える
1

ほとんどの場合、try ブロックの最初の行で例外が発生します。

このメソッドをコーディングするためのより良いアプローチがあると思います。このメソッドの実行がどの程度成功したかを示すためにブール値を使用しないでください。このメソッドが正常に実行された場合は、何も返されません。ただし、実行時にエラーが発生した場合は、発生したエラーに固有の例外をスローします。

可能であれば、一般的な例外クラスの使用を避けてください。問題の原因となった状況に固有の例外クラスを使用してください。つまり、、NullPointerExceptionなどJSONExceptionですNumberFormatException。カスタム固有の考えられる理由または例外の理由がある場合は、カスタム例外クラスを作成し、必要に応じてそれをスローして、問題を可能な限り正確にマークします。

呼び出し元がこのエラーを適切に処理するか、この例外をさらにスローします。

一般に、このアプローチにより、アプリケーションの一貫性と管理性が向上します。

于 2013-07-31T10:31:16.563 に答える
0

それは無理だ。try ブロックは例外がスローされずに実行されるため、return ステートメントに移動する必要があると思います。または、コードが正しくビルドされていない可能性があります。

于 2013-07-31T10:23:12.463 に答える