【问题标题】:Java: Quick/Elegant way to check for nullJava:检查空值的快速/优雅方法
【发布时间】:2011-04-01 01:20:59
【问题描述】:

在我目前正在编写的程序中,我发现自己做了很多事情......

Map<String,List<String>> network = loadSerializedObj(file); // null if failed
if(network != null) {
    anonNet = util.anonymize(newNet);
} else {
    // Some sort of error handling.
    System.out.println("Some sort of error message. Exiting...");
    System.exit(0);        
}

是否有更简洁的方法来处理从文件加载序列化对象不起作用并且方法返回 null 的事件?欢迎任何提示。我可以在任何地方使它更优雅吗?

【问题讨论】:

  • 除了检查network 是否为空,它是否在其他地方使用过?如果没有,您可以直接说if (loadSerializedObj(file) != null),这会稍微压缩您的代码。

标签: java error-handling


【解决方案1】:

你应该让 loadSerializedObj 抛出异常而不是返回 null。当您没有任何东西要返回时,您可以返回 null 。当出现问题时,您应该抛出异常。

【讨论】:

    【解决方案2】:

    在这种情况下,您可以使用异常捕获。

    Map<String,List<String>> network = loadSerializedObj(file); // null if failed
    try {
        anonNet = util.anonymize(newNet);
    } catch(NullPointerException npe) {
        System.out.println("Some sort of error message. Exiting...");
        System.exit(0);        
    }
    

    但你必须指定 util.anonymize 来抛出 NullPointerException 如果它还没有。

    【讨论】:

    • -1 哎哟!为什么要对程序的正常流程使用异常?
    • 这不是正常的流程!这是一个例外:“某种错误消息。退出...”这是一个错误案例!
    【解决方案3】:

    你可以有一些

    class MyAssert {
      static<T> assertNotNull(T object) {
        if (object == null) {
          System.out.println("something is wrong...");
          System.exit(0);
        }
        return object;
      }
    }
    

    【讨论】:

      【解决方案4】:

      尝试返回 empty map 而不是 null 值:

          if(!loadSerializedObj(file).isEmpty()) 
          {
              anonNet = util.anonymize(newNet);
          } 
          else 
          {
              // error handling    
          }
      
          private Map<String,List<String>> loadSerializedObj(File file) 
          {
              // do stuff
              if(mapObject == null)
              {
                  mapObject = Collections.emptyMap();
              }
              return mapObject
          }
      

      【讨论】:

        【解决方案5】:

        您可以对名为 n(object) 的函数进行静态导入,如果为 null,则返回布尔值。或者使用 Groovy :)

        【讨论】:

          【解决方案6】:

          我认为在保持易于阅读/维护的代码的同时,您所拥有的一切都是最好的。

          【讨论】:

            【解决方案7】:

            Guava 的preconditions 可以成为进行简洁易读检查的好方法。

            Preconditions.checkNotNull(myReference, "My error message");
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-07-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多