Java 不应该';不要捕捉NPE,但不要';我不知道如何处理空值

Java 不应该';不要捕捉NPE,但不要';我不知道如何处理空值,java,exception,nullpointerexception,Java,Exception,Nullpointerexception,我知道不建议捕获NPE,但是NPE是在一个方法中,其返回值是基于NPE来自的变量的布尔值 代码是这样的: public static boolean isStale() { return a.get(); //a==null causing NPE } 就我而言,如果没有a的信息,我真的不知道该返回什么。 我该怎么办?我应该抛出什么样的异常(如果有) 编辑: 1.返回true或false将不准确,因为结果实际上取决于a中的信息 a实际上来自服务调用客户端。getA() 无需抛出任何异常,只

我知道不建议捕获NPE,但是NPE是在一个方法中,其返回值是基于NPE来自的变量的布尔值

代码是这样的:

public static boolean isStale() {
 return a.get();  //a==null causing NPE
}
就我而言,如果没有a的信息,我真的不知道该返回什么。 我该怎么办?我应该抛出什么样的异常(如果有)

编辑:
1.返回true或false将不准确,因为结果实际上取决于a中的信息

  • a实际上来自服务调用客户端。getA()

  • 无需抛出任何异常,只需确保a
    a
    不是
    null
    在使用它之前,使用一个简单的条件语句:

    public static boolean isStale() {
      a!=null ? return a.get() : return false;  
    }
    
    如果返回false与此无关,则只需将方法的返回类型更改为String并返回警告或任何其他重要消息:

    public static String isStale() {
      a!=null ? return a.get().toString() : return "NULL";  
    }
    

    看看这个:

    不需要抛出任何异常,只需确保
    a
    不为
    null
    在使用它之前,使用一个简单的条件语句:

    public static boolean isStale() {
      a!=null ? return a.get() : return false;  
    }
    
    如果返回false与此无关,则只需将方法的返回类型更改为String并返回警告或任何其他重要消息:

    public static String isStale() {
      a!=null ? return a.get().toString() : return "NULL";  
    }
    

    看看这个:

    这取决于isStale()确定的内容。您可以尝试/捕获此方法并捕获NullPointerException。如果你真的没有办法处理
    a
    为空,我不认为这违反了最佳实践。如果
    a
    为空,您还可以实例化新的
    a
    ,或者引发您自己的异常。

    这取决于isStale()确定的内容。您可以尝试/捕获此方法并捕获NullPointerException。如果你真的没有办法处理
    a
    为空,我不认为这违反了最佳实践。如果
    a
    为空,您还可以实例化新的
    a
    ,或者引发您自己的异常。

    没有理由阻止代码引发异常。只需考虑你的情况:你说你的方法的行为没有定义在<代码> A==NULLU/<代码>的情况下,那么你为什么要处理它呢?这只会导致奇怪的行为,您的用户可能会惊讶于他们的代码失败或在某个地方产生意外的结果,而他们对您的API的调用却进行得很顺利

    异常是专门为解决这类问题而设计的,所以要好好利用它。您可以抛出一个新的自定义异常来添加一些特定于API的语义,或者让NPE传播到调用方

    例如:

    public static boolean isStale() {
         if (a == null) throw new IllegalStateException("a should not be null");
         return a.get();
    }
    

    但是,您更可能应该在构造函数中执行此操作(因为我假设
    a
    是一个属性)。在构造函数中,我会选择
    IllegalArgumentException

    没有理由阻止代码抛出异常。只需考虑你的情况:你说你的方法的行为没有定义在<代码> A==NULLU/<代码>的情况下,那么你为什么要处理它呢?这只会导致奇怪的行为,您的用户可能会惊讶于他们的代码失败或在某个地方产生意外的结果,而他们对您的API的调用却进行得很顺利

    异常是专门为解决这类问题而设计的,所以要好好利用它。您可以抛出一个新的自定义异常来添加一些特定于API的语义,或者让NPE传播到调用方

    例如:

    public static boolean isStale() {
         if (a == null) throw new IllegalStateException("a should not be null");
         return a.get();
    }
    

    但是,您更可能应该在构造函数中执行此操作(因为我假设
    a
    是一个属性)。在构造函数中,我会选择
    IllegalArgumentException

    首先你需要问自己:
    a
    null
    是否正常

    如果
    ,那么抛出异常很少是个好主意。只有在发生意外情况时才应该抛出异常。然后,你就可以决定这对你的计划意味着什么了。在这种情况下返回一些默认值有意义吗

    return a == null ? false : a.get(); // return false as a default value?
    
    如果
    (更有可能):

    。。。然后问以下问题:为什么我会得到一个
    null

    如果是因为您编写了一个bug:那么您不需要做任何事情。只要让它抛出一个
    NullPointerException
    。如果程序中的一个基本不变量被破坏了,那么捕捉异常并假装一切正常是毫无意义的。最好让它尽早抛出异常,并集中精力尽快理解和修复错误。尝试处理异常只会导致您的程序在其他更意外的时间点失败,并且会变得更难调试

    另一方面,如果是因为某个外部实体向您提供了您无法控制的坏数据:那么这可能是引发自定义异常的一个很好的例子,该异常可用于向用户或开发人员提供更有意义的错误消息。但是,即使在这种情况下,最好让
    a
    验证
    null
    值更“上游”,并让它尽早抛出异常。担心
    a
    值的正确性不应该成为
    isStale()
    方法契约的一部分



    有趣的阅读,面向C#,但原则同样适用于Java:。

    首先你需要问自己:
    a
    null是否正常

    如果
    ,那么抛出异常很少是个好主意。只有在发生意外情况时才应该抛出异常。然后,你就可以决定这对你的计划意味着什么了。在这种情况下返回一些默认值有意义吗

    return a == null ? false : a.get(); // return false as a default value?
    
    如果
    (更有可能):

    。。。