Java如何防止空对象异常

Java如何防止空对象异常,java,exception,Java,Exception,我正试图写越来越少的代码,我正试图找到一种防止崩溃的方法 我遇到的一个例子是: public class MyClass { private User user; public MyClass() { // Get user from another class // Another thread, user can be null for couple of seconds or minutes // Asynchronous ca

我正试图写越来越少的代码,我正试图找到一种防止崩溃的方法

我遇到的一个例子是:

public class MyClass
{
   private User user;

   public MyClass()
   {
       // Get user from another class
       // Another thread, user can be null for couple of seconds or minutes
       // Asynchronous call
       user = AnotherClass.getUser();

       // start method
       go();
   }

   private void go()
   {
      // Method 1
      // Program it is crashing if user is null
      if (user.getId() == 155)
      {
         // TO DO
      }
      else
      {
         System.out.println("User is NOT 155 !");
      }

      // Method 2
      // Program still crashes if user is null
      if (user != null && user.getId() == 155)
      {
         // To do
      }
      else
      {
         System.out.println("user is not 155");
      }

      // Method 3
      // Program wont crash, but I write much more code !
      if (user != null)
      {
         if (user.getId() == 155)
         {
            // To do
         }
         else
         {
            System.out.println("User is not 155 !");
         }
      }
      else
      {
          System.out.println("User is not 155 !");
      }
   }
}
如您所见,方法3正在运行,但我正在编写更多的代码。。。我该怎么办?

为什么不在此处使用,所以与其将user设置为null,不如将其设置为
user
对象的特殊“null”情况(实现)

e、 g

(理想情况下,另一个class.getUser()将在内部执行空检查)

在这种情况下

user.getId()
可以返回一个特殊值(-1?),该值永远不会等于有效的用户id。因此,您的代码将始终如下所示:

if (user.getId() == 155)
这同样适用于
用户
对象上的其他方法。

为什么不在此处使用,因此与其将用户设置为null,不如将其设置为
用户
对象的特殊“null”情况(实现)

e、 g

(理想情况下,另一个class.getUser()将在内部执行空检查)

在这种情况下

user.getId()
可以返回一个特殊值(-1?),该值永远不会等于有效的用户id。因此,您的代码将始终如下所示:

if (user.getId() == 155)

这同样适用于
User
对象上的其他方法。

它必须位于由以下语句开始的块中:

if(user!=null&&user.getId()=155)

这在逻辑上与方法3相同。当JVM看到
user
为空时,它应该停止计算该值


我要说的是,我在JVM 1.3中遇到了类似的情况,因此,如果您使用的是一个非常旧的JVM,那么可能就是它。

它必须位于由以下语句开始的块中:

if(user!=null&&user.getId()=155)

这在逻辑上与方法3相同。当JVM看到
user
为空时,它应该停止计算该值

我要说的是,我在JVM1.3中遇到了类似的情况,因此如果您使用的是一个非常旧的JVM,可能就是它。

更喜欢这种方式,即方法2

函数的第一个参数计算为false时,总值必须为false

这是最可取和可读的代码

你的假设是错误的,方法2崩溃,方法3工作。在上述代码中,如果
user!=空
则仅执行
user.getId()==155

更喜欢这种方式,即方法2

函数的第一个参数计算为false时,总值必须为false

这是最可取和可读的代码


你的假设是错误的,方法2崩溃,方法3工作。在上述代码中,如果
user!=null
则仅执行
user.getId()==155

方法2也应该可以工作。再检查一下。在java中,如果第一部分为false,则第二部分不进行计算。重点不是它不起作用,而是它相对详细。方法2也应该起作用。再检查一下。在java中,如果第一部分为false,则第二部分未计算。重点不是它不起作用,而是它相对冗长。如果我交换这两个条件,会怎么样?如果(user.getId()==155&&user!=null)@ZbarceaChristian,则会出现null指针异常。如果交换这些条件,那么它就像
If(user.getId()==155){If(user!=null){}
,这是没有意义的。如果我交换这两个条件呢?如果(user.getId()==155&&user!=null)@ZbarceaChristian,那么最终会出现空指针异常。如果交换这些条件,那么它就像
If(user.getId()==155){if(user!=null){}
,这没有意义。如果我编辑用户类并添加一个默认值为-1的字段id会怎么样?private int id=-1;public user(/*params*/){}也许这将适用于编辑用户类并添加一个默认值为-1的字段id会怎么样?private int id=-1;public user(/*params*/){}也许这也合适