当前位置: 首页 > 知识库问答 >
问题:

如何避免JSONObject空检查

闻人举
2023-03-14

我有如下所示的JSON

{
  "a1": "aaa",
  "b1": 333,
  "c1": {
    "c1": "ccc",
    "d1": "ddd",
    "f1": [
      {"a1": "xyz"},
      {"b1":  "lmn"},
      {"c1":123.00}
    ]
  }
}

我将文件读成字符串并创建一个JSONObject,如下所示

JSONObject json = new JSONObject(new JSONTokener(str));
json.has and !=null 
if(
      json.has("c") 
   && json.getJSONObject("c")!= null 
   && json.getJSONObject("c").has("f") 
   && json.getJSONObject("c").getJSONArray("f").length() > 1 
   &&json.getJSONObject("c").getJSONArray("f").getJSONObject(1).has("b")
  ){     
      String x = json.getJSONObject("c").getJSONArray("f").getJSONObject(1).getString("b");
   }

然而,我认为我可以用try catch将语句括起来

try {
     String x = json.getJSONObject("c").getJSONArray("f").getJSONObject(1).getString("b");
    }catch(JSONException e) {
        //log and proceed
    }

请建议在这种情况下是否有任何合理的理由放一个长的if条件,而不是仅仅try-catch-log然后继续。

您还可以分享使用JSONException在此上下文中是否有任何“优点”吗?

共有1个答案

秋光熙
2023-03-14

请建议在这种情况下是否有任何合理的理由放一个长的if条件,而不是仅仅try-catch-log然后继续。

以下是几个原因:

>

  • 效率:创建、抛出和捕获异常的成本相对较高。到底有多昂贵取决于版本,可能也取决于上下文。在最近的版本中,JIT编译器(AFAIK)可以将一些序列优化为条件分支。但是,如果要记录异常,那么JVM必须创建一个异常对象并填充stacktrace,这是最昂贵的部分。

    json.getJSONObject("c").getJSONArray("f").getJSONObject(1).getString("b")
    

    您可能无法判断哪些组件丢失或为空。stacktrace中的行号不足以区分这些情况。(对于JSONException,异常消息将为您提供更多线索。)

    您也无法区分JSONnull的情况,这可能是另一种问题;也就是一个虫子。如果您将其视为数据错误,则会使查找和修复代码错误变得困难。

    如果捕获所有异常(正如另一个答案所建议的那样),您可能隐藏了更多类bug。坏主意。

    底线是你需要为自己权衡一下。其中一个因素是您得到的JSON不符合代码期望的可能性有多大。这在一定程度上取决于生成JSON的内容。

  •  类似资料:
    • 我想知道是否有可能在Java中“避免”空检查,以下面的代码为例: 它必须检查4次,否则代码将失败。 是否可以将语句转换为只有在没有NullPointerException时才执行的一行式语句?当出现异常时,该行应该被忽略。 这里我不是在谈论一个通用的语言特性,我是在谈论一个只有当您明确决定这样做时才会上交的特性。 例如:将是建议代码的一个片段。 在Java可能发生这样的事情吗? 如果不可能的话,在

    • 在Java,有没有一种方法可以避免在调用的每个级别上嵌套null检查,以确保沿途没有阻止下一次调用的null。有没有一个优雅的方法来做这件事? 例如: Objone.ObjTwo.ObjTree.ObjFour.ObjF

    • 问题内容: 我需要检查某个值是否为null。如果它不为null,则将一些变量设置为true。这里没有其他声明。这样的条件检查太多了。 有什么方法可以在不检查所有方法返回值的情况下处理此空检查? 我认为直接检查变量并忽略NullpointerException。这是一个好习惯吗? 问题答案: 不,在Java中捕获NPE而不是对您的引用进行空检查通常不是一个好习惯。 如果您愿意,可以使用这种东西: 或

    • 我需要检查一些值是否为空。如果它不为空,那么只需将某个变量设置为true。这里没有别的说法。我做了太多这样的检查。 有没有什么方法可以在不检查所有方法返回值的情况下处理这个空检查? 我想直接检查变量并忽略NullPointerException。这是一个好的做法吗?

    • 问题内容: 我正在尝试通过从客户端向服务器发送密钥和随机数来认证用户。 我的代码未向我显示客户端的响应。执行下面的代码时,我得到了一个空指针异常。 问题答案: 解决大多数问题的固定步骤: 阅读堆栈跟踪以确定哪一行代码引发NPE 在该行代码处设置一个断点 使用调试器,在遇到断点时,确定该行中的对象引用是 弄清楚为什么引用该文件(到目前为止,这是唯一实际的困难部分) 解决根本原因(也可能很困难)

    • 问题内容: 我有两个简单的Java代码。第一个将恒定功率定义为power = a.pow(b); 第二个将恒定功率定义为power = BigInteger.ONE.shiftLeft(b) 在命令行中设置内存标志- Xmx1024m,第一个代码可以正常工作,但是第二个代码却出现错误:java.lang.OutOfMemoryError:Java堆空间 我的问题:我应该在第二个代码中更改什么以避免