在发点开源代码出来。
Spring的:/**
 * Assert that an object is not <code>null</code> .
 * <pre class="code">Assert.notNull(clazz, "The class must not be null");</pre>
 * @param object the object to check
 * @param message the exception message to use if the assertion fails
 * @throws IllegalArgumentException if the object is <code>null</code>
 */
public static void notNull(Object object, String message) {
if (object == null) {
throw new IllegalArgumentException(message);
}
}
JUnit的/**
 * Asserts that an object is null.  If it is not
 * an AssertionFailedError is thrown with the given message.
 */
static public void assertNull(String message, Object object) {
assertTrue(message, object == null);
}

解决方案 »

  1.   

    呵呵,很多jdk的源代码中也是使用obj == null
      

  2.   

    ==null     null==   随你怎么放, 看你个人习惯,  如果是 equals() 那么建议你常来放左边, 可以防止 NullPointException
      

  3.   

    空指针,我倒。为了防止手误写成s=null赋值,所以写成null==s。
      

  4.   

    很多人没学过java或者用Boolean说事。
      

  5.   

    不用编辑器,你的IDE已经就可以把这个问题解决了~!~!~!
      

  6.   

    我要帖里面说了,如果你认为可能报错请帖出实例出来。
    在任何情况下面都行,就是s==null,null==s第一个会出现空指针。你能证明吗?
      

  7.   

    我要帖里面说了,如果你认为可能报错请帖出实例出来。
    在任何情况下面都行,就是s==null,null==s第一个会出现空指针。你能证明吗?
      

  8.   

    说的是这种情况:
    Boolean b  = ...;
    if(b = null){
        ...
    }可以通过编译。
      

  9.   

    楼主细心呀,嘿嘿
    String str = "" ;
    if(str = null) {
    System.out.println("test");
    }
    }这样写的话eclipse会报错的。
      

  10.   

    貌似对于Boolean有这样的:
    Boolean b = null
    if(b = null)
       b.booleanValue();
    运行时就抛空指针异常了,如果习惯null写在前面:null = b就会编译不通过,可以提早发现.可是是在想不出什么时候会想检测一个Boolean是否为null,所以那种情况基本不可能发生.
      

  11.   

    if里面NPE和判空时候NPE,这个是两码事情,况且,你写成了
    if (null == b) {
      b.booleanValue();
    }
    难道就不会NPE了???!!!
      

  12.   

    很少会有,但是不是不可能,
    比如某个检索条件,Boolean flag = true只包含激活的数据,false只包含逻辑删除的数据,null两者都要
      

  13.   

    这种情况我承认会出现NullPointerException。但是你这种情况个人感觉纯粹有专门找查的那种人才会这样来做。
    我打一个简单的比方,Boolean -> boolean两者是可以自动转换的。如果你想使用Boolean == null来表示两者都要,假设在你的程序中已经有这样的实现。这代码有意义吗?
    假设我用boolean来接收Boolean,这时候已经自动转换,还可以把null赋值给boolean吗?
    这种代码太无聊了。
      

  14.   

    从Java出生以来,boolean就只有两个值,只是因为Boolean是一个对象,所以无法限制。
    但是作为程序员的我们,应该是尽量去遵守规范,而不是去打破规范,让自己的程序个性化。
      

  15.   

    这种情况真的很极端,但也不是完全不会遇到哈。
    需要注意的是抛空指针异常的不是b.booleanValue()这句,而是if里面出现null而抛出的。例如下面的逻辑如果把==写成=就会出问题了哈。Boolean b=null;if(b==null)   //这里写成b=null就出问题了
        System.out.printf("b是空值。\n");
      

  16.   

    从Java出生以来,boolean就只有两个值,只是因为Boolean是一个对象,所以无法限制。
    但是作为程序员的我们,应该是尽量去遵守规范,而不是去打破规范,让自己的程序个性化。对于你上面说的情况我不知道有没有,但是我知道有过工作经验的是绝对不会这样来做的。挑战极端,让自己的程序变得个性化,而失去了大众化的东西是不会长久的。只是不过拿来演示演示,炫耀一下罢了。
      

  17.   

    话说楼主把俺也揪来了,俺是25楼说话的,不要一棒子全打死,我对我说的话会有根据的不会睁眼说瞎话的,你去试下下面的代码看看 boolean test=false;
    if(test=false){
    System.out.println("测试test=true条件1");
    }else{
    System.out.println("测试test=true条件2");
    }
    if(test==false){
    System.out.println("测试test==true条件1");
    }else{
    System.out.println("测试test==true条件2");
    }
      

  18.   

    up,up,up!!!每天回帖即可获得10分可用分!
      

  19.   


    布尔判断,而且还是基础类型的boolean,用if (test==true),if (test==false)本就不是什么好的代码习惯,直接if (test)和if (!test)就好了
      

  20.   


    抓着Java这点小辫子不放有意义没有,这实际上就算是初学者也不会去犯的错误。
    而且你说会出现NEP,但是我没有发现你的程序里面有这样问题。ok。
    关于你这里所说的Boolean特殊情况在楼上早已有了回答。
      

  21.   

    http://topic.csdn.net/u/20110424/21/96b752ba-f5af-4dbb-87d5-c3319f73754c.html
      

  22.   

    我还是要说:都一样。大家的争议都在Boolean == null 和null == Boolean到底能不能预防手误写成Boolean = null 而可能导致的NPE,我想说的是:不可以。因为,你可能因为手误可能把Boolean == null 写成 Boolean = null,
    那您是否也会因为手误把null == Boolean 写成 null = Boolean 呢,那么你可能会说null = Boolean会在编译时报错,OK,确实是这样,那么写成 null == Boolean的好处也就到此了,只能防止把 == 写成 =,但决不能防止NPE。null == Boolean 只能检验是否把==误写成=,如果是错误把==写成=,那么请改过来,改过来就是null == Boolean,那么"null == Boolean"这句什么时候报NPE呢?
    [b]
    所以,null == Boolean不能预防空指针异常。
      

  23.   


    Just for your info...
    你可以在JDK里面,查找一下Boolean类的引用,会发现无数java.security.PrivilegedAction<Boolean>实现,就会判断返回值是否是null
    比如java.lang.Thread
        /**
         * Verifies that this (possibly subclass) instance can be constructed
         * without violating security constraints: the subclass must not override
         * security-sensitive non-final methods, or else the
         * "enableContextClassLoaderOverride" RuntimePermission is checked.
         */
        private static boolean isCCLOverridden(Class cl) {
    if (cl == Thread.class)
        return false;
    Boolean result = null;
    synchronized (subclassAudits) {
        result = (Boolean) subclassAudits.get(cl);
        if (result == null) { // <------- 这可不是什么“炫耀”
    /*
     * Note: only new Boolean instances (i.e., not Boolean.TRUE or
     * Boolean.FALSE) must be used as cache values, otherwise cache
     * entry will pin associated class.
     */
    result = new Boolean(auditSubclass(cl));
    subclassAudits.put(cl, result);
        }
    }
    return result.booleanValue();
        }
    其他还有很多,比如java.io.ObjectOutputStream    /**
         * Verifies that this (possibly subclass) instance can be constructed
         * without violating security constraints: the subclass must not override
         * security-sensitive non-final methods, or else the
         * "enableSubclassImplementation" SerializablePermission is checked.
         */
        private void verifySubclass() {
    Class cl = getClass();
    if (cl == ObjectInputStream.class) {
        return;
    }
    SecurityManager sm = System.getSecurityManager();
    if (sm == null) {
        return;
    }
    processQueue(Caches.subclassAuditsQueue, Caches.subclassAudits);
    WeakClassKey key = new WeakClassKey(cl, Caches.subclassAuditsQueue);
    Boolean result = Caches.subclassAudits.get(key);
    if (result == null) { // <<------------------
        result = Boolean.valueOf(auditSubclass(cl));
        Caches.subclassAudits.putIfAbsent(key, result);
    }
    if (result.booleanValue()) {
        return;
    }
    sm.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION);
        }
      

  24.   

    再补充一句,继续说if (o == null)这句会出NPE的,统统下地狱去吧!
      

  25.   

    我从没说过会出现什么NPE错误,我只是针对“==经常会误打成=”顶下,麻烦你看贴看清楚,最烦就是那种发贴但看回复不用心的,我也没有时间去找这代码来证明我的观点,实际编程中的确是出过这样的问题,或许大家都同意if(test),但我更加喜欢if(test==true),因为它和if(test==1)类似的格式一致
      

  26.   

    首先想说明的是if(test)和if(test==true)是不一样的。
    对于boolean类型来说,推荐前者:后者与前者相比多了步比较运算,效率较低(非0的比较在汇编级都是用减法来实现的),当工程大到有必要优化的时候像后者这样的代码风格是首先须要优化的。与其到了后期再一个个改,还不如写的时候就养成一个好的习惯。
    对于Boolean类型来说,个人感觉倒是后者比较好,因为它避免了test值为null这种极端的情况引起的问题。(其实本来在下就不喜欢容器类这种设计,特别是Boolean,本来“布尔类型”的逻辑定义应该是“二值”,到了它这里却多了个null,变成“三值”了。但是Java里没有结构体这种设计,只能将就用它了)
      

  27.   

    LZ的说法并不适用于所有人哈。在下比较欣赏的一句话是:
    “规则存在的目的就是等待着人去打破它。”(可能和原文不太一样,因为是道听途说的)
    哥伦布打破当时“天圆地方”的常识而歪打正着的发现了新大陆(虽然没有到达他的真正目的地印度);
    爱因斯坦打破了牛顿经典力学体系的规则而提出了相对论;李四光对国际上经典的地质理论提出质疑从而使大庆油田被发现……
    这样的例子多得数不胜数。(好像话题有点扯远了……)对程序员来说也是一样的。规规矩矩的按照规范去编码是可以的,而且在一个团队中这也是必须的。成熟的规范对提高开发效率是很有帮助的。但是任何事物都有两面性,任何先进的技术都是一把双刃剑。成熟的规范往往很容易让人形成固定的思维模式,在一定程度上会扼杀人的创造性。
    LZ说打破代码的规范是为了代码的个性化,这点也不全面。的确,有些情况下程序员不希望别人看懂自己的代码,特别是自己开发的组件之类的。但在下觉得大多数不按规矩写代码的程序员目的并不是这个。一般不按规范编码的有两个目的:一是效率,一是能力。关于效率方面不用多说,我想大多数人都遇到过。至于能力方面,有时需要实现一些很难实现的功能,这里首要考虑的就是实现它,编码规范什么的都得靠边站。
      

  28.   

    我想说的是既然你现在用的是Java,那么你就应该遵守Java的规范。
    而当你想要打破这个标准时,并不是在现有的基本之上。
    相信用Java开发出的新语言这么多,与Java的不同之处也多的数不胜数,这种才有意义。
    至于你所说的哥伦布打破天圆地方,这个在先前人们只是凭借自己的认识而这样认为的。
    与这种人为的规定和期望根本就是不同的概念,你说是吧。
      

  29.   

    if(test==true) ->if(test),这不是优化,只是前者是明显的无视语言基本功能进行的劣化。
      

  30.   

    这两种没有什么区别,用equals时才有区别,这些问题都是自己可以用代码来检验的,何必那么争执呢,回家自己去敲代码验证去
      

  31.   

    本人无编译的功底,还真不知道if(test==true) ->if(test) 这个有啥区别的,但特意的去JDK里面的源码找了下 "==\s+true" 神奇的发现原来JDK里面也有很多按楼上说的这么低劣的写法,感觉有点诧异.随便的拿个例子吧com.sun.jmx.remote.internal.ClientNotifForwarder.init(),这里就有二处if (beingReconnected == true) {.........还请楼上高人解释
      

  32.   


    我可以很负责地告诉你,不管写成 null == s 还是 s == null,不管 s 的值是 null 还是各种字符串,都不会产生空指针异常!null == s 与 s == null 稍微有点区别,前者少一条 JVM 指令,但这个可以忽略不计!PS:这里还有一个类似的批评帖子:http://topic.csdn.net/u/20110424/12/1662a38d-5cf2-405c-83e2-3befa4fd832f.html真是无语了!
      

  33.   


    呵呵,朋友的精神可贵,对与错,优与良我们自己应该可以判断。
    if(b == true)这代码本身运行没有任何问题。也没有人说这种写法不正确。
    只是有更简单方便的写法我们为什么还要去追求一些可有可无的呢?
    是不是表示写过com.sun包源码的人就一定是神人?一定都是完美的呢?代码就是至高无上的呢?
      

  34.   


    if(b == true)
    if(b)
    这两种写法在最后编译的字节码是一样的,不信朋友可以试一下。
    优化一定是指性能优化。代码优化难道不是一种优化吗???
    难道你认为第二者不属于一种优化吗?不讨论这个了,偏离主题了。
      

  35.   

    谢谢你的回答,编译后的字节码是一样的,我刚刚检查了,某位大虾刚刚说的有点问题。没有性能问题那就是个人习惯写法了,我更喜欢if(b == true),前面已经有说过了,喜欢它的主要原因是它和if(b == 1)这样是统一的,比起简单我更加喜欢稍微复杂一点但统一的代码
      

  36.   

    这样做的原因主要爱有时忘了写成 str=NULL 编译器不报错,
    而NULL == str就不会了!NULL = str 报错
      

  37.   

    好吧,我承认我发这个帖之前我确实不知道
    Boolean b;
    if(b = null)这样可以编译通过。不过这只是唯一的一种情况。不会现有其它相同的情况了。
    所以说关于防止写错了,这个理由是不是也太牵强了。
      

  38.   

    楼主就一2货```你正确书写当然没有问题```但是你少了一个=号呢```
    你不要把思路局限在一个类型
    我要是有一个逻辑
    booean  = false;
    if(true == ) 
    {
         ...........
    }你这样试试看if( = true)
    {
         ............
    }例如   boolean  = false;
      
      if( = true) {
      System.out.println(1);   //输出1
      }
      
    //   if(true = ) {
    //   System.out.println(4);
    //   }
      
      if(true == ) {
      System.out.println(2);   //会输出 2  因为在开始的时候改变了
      }但是你改变顺序                boolean  = false;
      
      if(true == ) {
      System.out.println(2);
      }
      
      if( = true) {
      System.out.println(1);
      }显然第一个判断是进不去的  这样可以避免逻辑上的错误  你要在上千行 万行的代码里去debug这样的错误
    项目经理不开了你才怪
                      if(true = ) {
      System.out.println(4);
      }上面这样处理 少了一个=号  就直接编译报错了````
      

  39.   


    呵呵,有要真有本事给哥在找一个实例出来。
    如果你的业务逻辑对应的(变量)都是由Boolean类型组成的。谁是2货谁不是,自有分晓。
      

  40.   

    可以通过这样方法降低出错出错风险
    也亏你说的出来。你认为if(boolean) if(boolean==true)哪个更容易出错了,呵呵。
    你所说的降低风险,好像是你个人无知的认知而已吧。
      

  41.   

    都太闲了。当s是Boolean时,null=s 毫无疑问可以在编译阶段防手误。如果觉得Auto Boxing 不爽,叫编译器把它关了就好了
      

  42.   

    你只知道java吧
    c 里面 c++ 里面都是可以在if里用非boolean类型判断的很多习惯都是从其他语言继承下来的```
      

  43.   


    呵呵,把C,C++拿出来有意思吗?
    我看你大概对什么都是一知半解。
    怎么不继续你的大道理了,我这个人最喜欢和别人理论了。我看你刚才神气的。
    你不会想承认你是2货吧。
    如果是从其它语言继承下来的,没问题请不要用你的破道理去告诉新手误导别人。
    我只懂Java没错,很多人都像我一样只懂Java。
      

  44.   

    按照你的说法真正应该神气的人,不是会Java也不是C,而是汇编。
    少乱扯就会不懂装懂,其实自己一点都不懂。
      

  45.   

    这个话题仅次于 String str = new String("aaa")创建了几个对象的月经贴...个人认为完全没有区别,估计是写C的人继承过来的习惯的问题,这样的写法没有问题,但是不符合Java的习惯,个人是看到null==str就想拍桌子的...
      

  46.   


    这里是java版,当然讨论的是java的语言规范,C/C++可以去隔壁至于代码习惯什么的,最简单的一个例子,左大括号,java和linux编程规范都是行尾,ms则是独立成行,你说该怎么继承呢?
      

  47.   

    不一样的东西继承下来只是搞的代码恶心,用java还是考虑java的语法和习惯。c/c++里NULL == pObj之类的用法也是很早的时候有的习惯,但是现代c/c++编译器都可以通过警告来避免
    pObj = NULL之类的问题,所以即使在C/C++里,这样的习惯也不是必须的。
      

  48.   


    我觉得这完全不是一个概念。String str = new String("aaa")创建了几个对象。至少大多数人都能正确的回答。
    是否继承了这个我不知道。
    不过对于原帖的回答,我相信像你这种继承C习惯的这种回答,好像我没有看到。也许在你的世界中你认为没有问题,但是好像还有很多人存在各种误解。我想第一是他们自己不愿意去理解,第二就是被其它人误导了。
      

  49.   

    我只是说经常有人拿出来问,至于大多数人能不能正确回答,你站内搜索一下“几个对象”看看就知道了.
    你好像没明白我的意思,我是个人是反对null==str这种写法的
    基础的说法,只是我对他们这样写的原因的一个分析而已,不代表我赞成这种做法