在发点开源代码出来。
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);
}
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);
}
在任何情况下面都行,就是s==null,null==s第一个会出现空指针。你能证明吗?
在任何情况下面都行,就是s==null,null==s第一个会出现空指针。你能证明吗?
Boolean b = ...;
if(b = null){
...
}可以通过编译。
String str = "" ;
if(str = null) {
System.out.println("test");
}
}这样写的话eclipse会报错的。
Boolean b = null
if(b = null)
b.booleanValue();
运行时就抛空指针异常了,如果习惯null写在前面:null = b就会编译不通过,可以提早发现.可是是在想不出什么时候会想检测一个Boolean是否为null,所以那种情况基本不可能发生.
if (null == b) {
b.booleanValue();
}
难道就不会NPE了???!!!
比如某个检索条件,Boolean flag = true只包含激活的数据,false只包含逻辑删除的数据,null两者都要
我打一个简单的比方,Boolean -> boolean两者是可以自动转换的。如果你想使用Boolean == null来表示两者都要,假设在你的程序中已经有这样的实现。这代码有意义吗?
假设我用boolean来接收Boolean,这时候已经自动转换,还可以把null赋值给boolean吗?
这种代码太无聊了。
但是作为程序员的我们,应该是尽量去遵守规范,而不是去打破规范,让自己的程序个性化。
需要注意的是抛空指针异常的不是b.booleanValue()这句,而是if里面出现null而抛出的。例如下面的逻辑如果把==写成=就会出问题了哈。Boolean b=null;if(b==null) //这里写成b=null就出问题了
System.out.printf("b是空值。\n");
但是作为程序员的我们,应该是尽量去遵守规范,而不是去打破规范,让自己的程序个性化。对于你上面说的情况我不知道有没有,但是我知道有过工作经验的是绝对不会这样来做的。挑战极端,让自己的程序变得个性化,而失去了大众化的东西是不会长久的。只是不过拿来演示演示,炫耀一下罢了。
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");
}
布尔判断,而且还是基础类型的boolean,用if (test==true),if (test==false)本就不是什么好的代码习惯,直接if (test)和if (!test)就好了
抓着Java这点小辫子不放有意义没有,这实际上就算是初学者也不会去犯的错误。
而且你说会出现NEP,但是我没有发现你的程序里面有这样问题。ok。
关于你这里所说的Boolean特殊情况在楼上早已有了回答。
那您是否也会因为手误把null == Boolean 写成 null = Boolean 呢,那么你可能会说null = Boolean会在编译时报错,OK,确实是这样,那么写成 null == Boolean的好处也就到此了,只能防止把 == 写成 =,但决不能防止NPE。null == Boolean 只能检验是否把==误写成=,如果是错误把==写成=,那么请改过来,改过来就是null == Boolean,那么"null == Boolean"这句什么时候报NPE呢?
[b]
所以,null == Boolean不能预防空指针异常。
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);
}
对于boolean类型来说,推荐前者:后者与前者相比多了步比较运算,效率较低(非0的比较在汇编级都是用减法来实现的),当工程大到有必要优化的时候像后者这样的代码风格是首先须要优化的。与其到了后期再一个个改,还不如写的时候就养成一个好的习惯。
对于Boolean类型来说,个人感觉倒是后者比较好,因为它避免了test值为null这种极端的情况引起的问题。(其实本来在下就不喜欢容器类这种设计,特别是Boolean,本来“布尔类型”的逻辑定义应该是“二值”,到了它这里却多了个null,变成“三值”了。但是Java里没有结构体这种设计,只能将就用它了)
“规则存在的目的就是等待着人去打破它。”(可能和原文不太一样,因为是道听途说的)
哥伦布打破当时“天圆地方”的常识而歪打正着的发现了新大陆(虽然没有到达他的真正目的地印度);
爱因斯坦打破了牛顿经典力学体系的规则而提出了相对论;李四光对国际上经典的地质理论提出质疑从而使大庆油田被发现……
这样的例子多得数不胜数。(好像话题有点扯远了……)对程序员来说也是一样的。规规矩矩的按照规范去编码是可以的,而且在一个团队中这也是必须的。成熟的规范对提高开发效率是很有帮助的。但是任何事物都有两面性,任何先进的技术都是一把双刃剑。成熟的规范往往很容易让人形成固定的思维模式,在一定程度上会扼杀人的创造性。
LZ说打破代码的规范是为了代码的个性化,这点也不全面。的确,有些情况下程序员不希望别人看懂自己的代码,特别是自己开发的组件之类的。但在下觉得大多数不按规矩写代码的程序员目的并不是这个。一般不按规范编码的有两个目的:一是效率,一是能力。关于效率方面不用多说,我想大多数人都遇到过。至于能力方面,有时需要实现一些很难实现的功能,这里首要考虑的就是实现它,编码规范什么的都得靠边站。
而当你想要打破这个标准时,并不是在现有的基本之上。
相信用Java开发出的新语言这么多,与Java的不同之处也多的数不胜数,这种才有意义。
至于你所说的哥伦布打破天圆地方,这个在先前人们只是凭借自己的认识而这样认为的。
与这种人为的规定和期望根本就是不同的概念,你说是吧。
我可以很负责地告诉你,不管写成 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真是无语了!
呵呵,朋友的精神可贵,对与错,优与良我们自己应该可以判断。
if(b == true)这代码本身运行没有任何问题。也没有人说这种写法不正确。
只是有更简单方便的写法我们为什么还要去追求一些可有可无的呢?
是不是表示写过com.sun包源码的人就一定是神人?一定都是完美的呢?代码就是至高无上的呢?
if(b == true)
if(b)
这两种写法在最后编译的字节码是一样的,不信朋友可以试一下。
优化一定是指性能优化。代码优化难道不是一种优化吗???
难道你认为第二者不属于一种优化吗?不讨论这个了,偏离主题了。
而NULL == str就不会了!NULL = str 报错
Boolean b;
if(b = null)这样可以编译通过。不过这只是唯一的一种情况。不会现有其它相同的情况了。
所以说关于防止写错了,这个理由是不是也太牵强了。
你不要把思路局限在一个类型
我要是有一个逻辑
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);
}上面这样处理 少了一个=号 就直接编译报错了````
呵呵,有要真有本事给哥在找一个实例出来。
如果你的业务逻辑对应的(变量)都是由Boolean类型组成的。谁是2货谁不是,自有分晓。
也亏你说的出来。你认为if(boolean) if(boolean==true)哪个更容易出错了,呵呵。
你所说的降低风险,好像是你个人无知的认知而已吧。
c 里面 c++ 里面都是可以在if里用非boolean类型判断的很多习惯都是从其他语言继承下来的```
呵呵,把C,C++拿出来有意思吗?
我看你大概对什么都是一知半解。
怎么不继续你的大道理了,我这个人最喜欢和别人理论了。我看你刚才神气的。
你不会想承认你是2货吧。
如果是从其它语言继承下来的,没问题请不要用你的破道理去告诉新手误导别人。
我只懂Java没错,很多人都像我一样只懂Java。
少乱扯就会不懂装懂,其实自己一点都不懂。
这里是java版,当然讨论的是java的语言规范,C/C++可以去隔壁至于代码习惯什么的,最简单的一个例子,左大括号,java和linux编程规范都是行尾,ms则是独立成行,你说该怎么继承呢?
pObj = NULL之类的问题,所以即使在C/C++里,这样的习惯也不是必须的。
我觉得这完全不是一个概念。String str = new String("aaa")创建了几个对象。至少大多数人都能正确的回答。
是否继承了这个我不知道。
不过对于原帖的回答,我相信像你这种继承C习惯的这种回答,好像我没有看到。也许在你的世界中你认为没有问题,但是好像还有很多人存在各种误解。我想第一是他们自己不愿意去理解,第二就是被其它人误导了。
你好像没明白我的意思,我是个人是反对null==str这种写法的
基础的说法,只是我对他们这样写的原因的一个分析而已,不代表我赞成这种做法