java避免出现NullPointerException(空指针)的⽅法总结
java 避免出现NullPointerException(空指针)的⽅法总结
Java应⽤中抛出的空指针异常是解决空指针的最好⽅式,也是写出能顺利⼯作的健壮程序的关键。俗话说“预防胜于治疗”,对于这么令⼈讨厌的空指针异常,这句话也是成⽴的。值得庆幸的是运⽤⼀些防御性的编码技巧,跟踪应⽤中多个部分之间的联系,你可以将Java中的空指针异常控制在⼀个很好的⽔平上。顺便说⼀句,这是Javarevisited上的第⼆个空指针异常的帖⼦。在上个帖⼦中我们讨论了Java中导致空指针异常的常见原因,⽽在本教程中我们将会学习⼀些Java的编程技巧和最佳实践。这些技巧可以帮助你避免Java中的空指针异常。遵从这些技巧同样可以减少Java代码中到处都有的⾮空检查的数量。作为⼀个有经验的Java程序员,你可能已经知道其中的⼀部分技巧并且应⽤在你的项⽬中。但对于新⼿和中级开发⼈员来说,这将是很值得学习的。顺便说⼀句,如果你知道其它的避免空指针异常和减少空指针检查的Java技巧,请和我们分享。
这些都是简单的技巧,很容易应⽤,但是对代码质量和健壮性有显著影响。根据我的经验,只有第⼀个技巧可以显著改善代码质量。如我之前所讲,如果你知道任何避免空指针异常和减少空指针检查的Java技巧,你可以通过评论本⽂来和分享。
1) 从已知的String对象中调⽤equals()和equalsIgnoreCa()⽅法,⽽⾮未知对象。
总是从已知的⾮空String对象中调⽤equals()⽅法。因为equals()⽅法是对称的,调⽤a.equals(b)和调⽤b.equals(a)是完全相同的,这也是为什么程序员对于对象a和b这么不上⼼。如果调⽤者是空指针,这种调⽤可能导致⼀个空指针异常
Object unknownObject = null;
//错误⽅式 – 可能导致 NullPointerException
if(unknownObject.equals("knownObject")){
}
//正确⽅式 - 即便 unknownObject是null也能避免NullPointerException
if("knownObject".equals(unknownObject)){大公司小老板
}
这是避免空指针异常最简单的Java技巧,但能够导致巨⼤的改进,因为equals()是⼀个常见⽅法。
2) 当valueOf()和toString()返回相同的结果时,宁愿使⽤前者。
因为调⽤null对象的toString()会抛出空指针异常,如果我们能够使⽤valueOf()获得相同的值,那宁愿使⽤valueOf(),传递⼀个null给valueOf()将会返回“null”,尤其是在那些包装类,像Integer、Float、Double和BigDecimal。
BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd)); //不会抛出空指针异常
System.out.String()); //抛出 "Exception in thread "main" java.lang.NullPointerException"
3) 使⽤null安全的⽅法和库有很多开源库已经为您做了繁重的空指针检查⼯作。其中最常⽤的⼀个的是Apache commons 中的StringUtils。你可以使⽤StringUtils.isBlank(),isNumeric(),isWhiteSpace()以及其他的⼯具⽅法⽽不⽤担⼼空指针异常。//StringUtils⽅法是空指针安全的,他们不会抛出空指针异常
System.out.println(StringUtils.isEmpty(null));
System.out.println(StringUtils.isBlank(null));
吹捧拼音System.out.println(StringUtils.isNumeric(null));
System.out.println(StringUtils.isAllUpperCa(null));
Output:
true
红楼梦人物介绍true
fal
凋碧树
fal
但是在做出结论之前,不要忘记阅读空指针⽅法的类的⽂档。这是另⼀个不需要下⼤功夫就能得到很⼤改进的Java最佳实践。
4) 避免从⽅法中返回空指针,⽽是返回空collection或者空数组。
这个Java最佳实践或技巧由Joshua Bloch在他的书Effective Java中提到。这是另外⼀个可以更好的使⽤Java编程的技巧。通过返回⼀个空collection或者空数组,你可以确保在调⽤如size(),length()的时候不会因为空指针异常崩溃。Collections类提供了⽅便的空List,Set和Map: Collections.EMPTY_LIST,Collections.EMPTY_SET,Collections.EMPTY_MAP。这⾥是实例。
public List getOrders(Customer customer){
List result = Collections.EMPTY_LIST;
return result;
人体艺术写}
你同样可以使⽤Collections.EMPTY_SET和Collections.EMPTY_MAP来代替空指针。
5) 使⽤annotation@NotNull 和 @Nullable
在写程序的时候你可以定义是否可为空指针。通过使⽤像@NotNull和@Nullable之类的annotation来声明⼀个⽅法是否是空指针安全的。现代的编译器、IDE或者⼯具可以读此annotation并帮你添加忘记的空指针检查,或者向你提⽰出不必要的乱七⼋糟的空指针检查。IntelliJ和findbugs已经⽀持了这些a
nnotation。这些annotation同样是JSR 305的⼀部分,但即便IDE或⼯具中没有,这个annotation本⾝可以作为⽂档。看到@NotNull和@Nullable,程序员⾃⼰可以决定是否做空指针检查。顺便说⼀句,这个技巧对Java程序员来说相对⽐较新,要采⽤需要⼀段时间。
6) 避免你的代码中不必要的⾃动包装和⾃动解包。
且不管其他如创建临时对象的缺点,如果wrapper类对象是null,⾃动包装同样容易导致空指针异常。例如如果person对象没有电话号码的话会返回null,如下代码会因为空指针异常崩溃。
Person ram = new Person("ram");
int phone = Phone();
当使⽤⾃动包装和⾃动解包的时候,不仅仅是等号,< > 同样会抛出空指针异常。你可以通过这篇⽂章来学习更多的Java中的⾃动包装和拆包的陷阱。
7) 遵从Contract并定义合理的默认值。
在Java中避免空指针异常的⼀个最好的⽅法是简单的定义contract并遵从它们。⼤部分空指针异常的出现是因为使⽤不完整的信息创建对象或者未提供所有的依赖项。如果你不允许创建不完整的对象并
优雅地拒绝这些请求,你可以在接下来的⼯作者预防⼤量的空指针异常。类似的,如果对象允许创建,你需要给他们定义⼀个合理的默认值。例如⼀个Employee对象不能在创建的时候没有id和name,但是是否有电话号码是可选的。现在如果Employee没有电话号码,你可以返回⼀个默认值(例如0)来代替返回null。但是必须谨慎选择,哟有时候检查空指针⽐调⽤⽆效号码要⽅便。同样的,通过定义什么可以是null,什么不能为null,调⽤者可以作出明智的决定。failing fast或接受null同样是⼀个你需要进⾏选择并贯彻的,重要的设计决策
止痛药牙疼8)定义数据库中的字段是否可为空。
面瘫是由什么引起的如果你在使⽤数据库来保存你的域名对象,如Customers,Orders 等,你需要在数据库本⾝定义是否为空的约束。因为数据库会从很多代码中获取数据,数据库中有是否为空的检查可以确保你的数据健全。在数据空中维护null约束同样可以帮助你减少Java代码中的空指针检查。当从数据库中加载⼀个对象是你会明确,哪些字段是可以为null的,⽽哪些不能,这可以使你代码中不必要的!= null检查最少化。
9) 使⽤空对象模式(Null Object Pattern)
还有⼀种⽅法来避免Java中的空指针异常。如果⼀个⽅法返回对象,在调⽤者中执⾏⼀些操作,例如Collection.iterator()⽅法返回迭代器,其调⽤者执⾏遍历。假设如果⼀个调⽤者并没有任何迭代器,其鱼塘租赁合同
可以返回空对象(Null object)⽽⾮null。空对象是⼀个特殊的对象,其在不同的上下⽂中有不同的意义。例如⼀个空的迭代器调⽤hasNext()返回fal时,可以是⼀个空对象。同样的在返回Container和Collection类型⽅法的例⼦中,空对象可以被⽤来代替null作为返回值。我打算另写⼀篇⽂章来讲空对象模式,分享⼏个Java空对象的例⼦。
这就是全部了,这是⼏个易于遵从的避免空指针异常的Java技巧和最佳实践。你可以欣赏到这些技巧将⾮常有⽤,且不太难实现。如果你有其他⽐秒这个异常的技巧,⽽⼜没包含在这⾥,请通过评论来和我们分享,我将收录在这⾥。
如有疑问请留⾔或者到本站社区交流讨论,感谢阅读,希望能帮助到⼤家,谢谢⼤家对本站的⽀持!