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

对我来说奇怪的是我的应用程序跳过了尝试并直接进入 return 语句。

我希望它尝试并且失败将“riktigSporing”设置为false。

我究竟做错了什么?

4

4 回答 4

2

我敢打赌它不会。我怀疑您的输入参数为空,并且您很早就触发了 NPE。

另请注意,您可能会将 a 拆箱null为原始boolean,但这是行不通的。

编辑:

FATAL EXCEPTION: main
java.lang.NullPointerException

进一步暗示了这一点。您的堆栈跟踪中应该有相应的行号。

于 2013-07-31T10:24:17.523 回答
1

您很可能在 try 块的第一行遇到异常。

我认为有更好的方法来编写这种方法。不要使用布尔值来显示此方法执行的成功程度。如果此方法执行正常,则不返回任何内容。但是,如果执行时出现错误,请抛出特定于您遇到的错误的异常。

尽可能避免使用一般异常类。使用特定于导致问题的位置的异常类。即NullPointerException, JSONException,NumberFormatException等等。如果有自定义的特定可能原因或异常原因,则创建自定义异常类并在必要时将其抛出以尽可能精确地标记问题。

它将让调用者正确处理此错误或进一步抛出此异常。

一般来说,这种方法使您的应用程序更加一致和易于管理。

于 2013-07-31T10:31:16.563 回答
1

您需要在此捕获中设置布尔值:

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

如果这个 catch 出现一些错误,JSON将被调用,而不是第二个。我认为在您的情况下,您不需要第二次捕获。

如果你想普遍使用Exception,删除JSONException并只放在那里Exception

注意:当我查看您的代码片段时,我建议您使用 boolean 作为原始数据类型而不是 Boolean。它将更加清晰和高效。

于 2013-07-31T10:23:21.820 回答
0

是不可能的。我认为 try 块是在没有抛出异常的情况下执行的,因此它必须返回语句。否则您的代码可能无法正确构建。

于 2013-07-31T10:23:12.463 回答