阳台煮酒

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
public static void main(String[] args) {

  String name=null;
  if("aa".equals(name))//这种情形,不出现空指针异常  
//if(a.equals("aa"))//出现空指针异常
{
System.out.println(true);
}
else { System.out.println(false); } }

上面的两句不同的比较语句测试,第一句不出现空指针异常,第二句出现。 所以在变量和常量比较的时候,一般把常量放在前面。为了避免空指针异常。但是我的问题是:变量在前时候,读到变量,变量为空,就出现异常了。 为什么变量在后时候,name变量就不用读了吗?既然要比较肯定也要读啊,问题只是先后的问题。为什么放在后面就就不报空指针呢?

看了一下string类的equals方法

public boolean equals(Object anObject) {
     if (this == anObject) {
       return true;
     }
     if (anObject instanceof String) {
       String anotherString = (String) anObject;
       int n = value.length;
       if (n == anotherString.value.length) {
         char v1[] = value;
         char v2[] = anotherString.value;
         int i = 0;
         while (n-- != 0) {
           if (v1[i] != v2[i])
               return false;
           i++;
         }
         return true;
       }
     }
     return false;
   }

但是我的问题又来了:源码我看了一下,也明白,但是在源码中如果anobject为空的时候,就不会出现空指针异常吗 ? 后来经过一番讨论后,我得出的结论是这样的:

问题是出现在调用方法上了。因为null值,并不是一个String对象。而你通过声明的String对象引用去 调用了String对象的实例方法。当然不可以了。null调用了方法。

所以系统报出了,空指针异常。所以说,呼应文章的标题,这样还真的是避免了控制针异常。毕竟“aaa”这样的形式,不是null形式,是可以调用方法的。

posted on 2016-09-25 11:02  阳台煮酒  阅读(3710)  评论(0编辑  收藏  举报