import junit.framework.TestCase;
public class NullTest extends TestCase{
public void testNull(){
Object a = null;
assert(a.equals(null));
}
}
本来以为这样回报空指针异常,但这个测试通过了~为什么?
于是有个逻辑我就搞不清了:// a = null;
// a.equals(null)// 看equals的函数原型 equals(Object obj) 
// 于是我可以说 null is Object 
// 但这个“特殊”的Object 却不能 null.equals(null)
// 为什么?
请列位给深度解释一下,谢谢?

解决方案 »

  1.   

    不知道你用的junit是什么版本的,我用的没有assert这个方法啊。有assertFalse这个方法,而且如果Object a = null; assertFalse(a.equals(null));这样用的话会抛出空指针异常的。
      

  2.   

    Ok 这个是我的错
    assert 关键字将这个错误吞了,然后后面的推论是错误的那为什么assert会吞掉这个异常呢?
      

  3.   

    不可能吞掉吧
    你确定你开了断言么
    java -ea 加class名儿试下
      

  4.   

    assert只是声明对象为空就不报错package com.nullwenti;import junit.framework.TestCase;public class Test extends TestCase { /**
     * @param args
     */ public static void main(String[] args) { Boolean b = false;
    Object a = null;
    Object c =10;
        assert b= (a.equals(null));
    System.out.println(b);//false 还是b的值没有改变
    assert b = c.equals(10);
    System.out.println(b);//false 还是b的值没有改变
    b = c.equals(10);
    System.out.println(b);//判断了c是否和10相等 改变了b的赋值
    }
      

  5.   

    assert 我确实像看看他的源码,但不知道这个关键字在什么地方定义的?
      

  6.   

    Object#equals 的代码是这样的:    public boolean equals(Object obj) {
            return (this == obj);
        }Object 默认的 equals 实现是采用 == 运算符进行比较,也就是比较内存中所引用的地址是否相同。e.equals(null) 如果这个对象的 equals 没有实现的话就相当于 e == null 这段代码,因此不会抛出空指针异常。
      

  7.   


    这个问题没什么好追踪,默认assert是关闭的, 你写这代码时,JVM是默认没开断言支持,在assert处所有错误都忽略掉, 你可以在命令行上 java -ea 来执行程序,就会报错误了。
      

  8.   

    这个是虚拟机支持的,不是在JDK里面,你看不到源码的。JVM源码是C/C++代码。