【问题标题】:Using try-catch -- Skipping try使用 try-catch -- 跳过尝试
【发布时间】:2013-07-31 10:20:27
【问题描述】:

我正在尝试编写一个可以尝试 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。

我做错了什么?

【问题讨论】:

  • 你怎么知道它跳过了尝试?信任调试器不是证据;它可以很容易地搞砸该功能。如何将对象声明移出尝试并查看在返回点是否解析了某些内容? Lykke til med sporingen :)
  • 很可能catch with JSONException被执行了。
  • 你怎么知道你的应用跳过了 try 块?
  • 我尝试过使用调试器并尝试输入一条 toast 消息,但没有一个显示它在尝试中停止。
  • 我不明白 toast 消息是什么。是像 System.out.println() 这样的东西吗?尝试使用 System.err.println() 使用无缓冲打印。

标签: java android try-catch


【解决方案1】:

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

还请注意,您可以将 null 拆箱为原始 boolean,但这是行不通的。

编辑:

FATAL EXCEPTION: main
java.lang.NullPointerException

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 但是在您发表评论后我仍然收到异常
    • 这就是我得到答案的原因。错误出现在 Try/Catch 的第一行
    • object 传递给此方法的参数为空。
    【解决方案3】:

    你需要在这个 catch 中设置你的布尔值:

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

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

    如果你想一般使用Exception,删除JSONException,只保留Exception

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-29
        • 1970-01-01
        • 1970-01-01
        • 2010-11-23
        相关资源
        最近更新 更多