java 避免出现NullPointerException(空指针)的方法总结 今天药忘吃喽~ 2022-05-21 07:10 163阅读 0赞 **java 避免出现NullPointerException(空指针)的方法总结** Java应用中抛出的空指针异常是解决空指针的最好方式,也是写出能顺利工作的健壮程序的关键。俗话说“预防胜于治疗”,对于这么令人讨厌的空指针异常,这句话也是成立的。值得庆幸的是运用一些防御性的编码技巧,跟踪应用中多个部分之间的联系,你可以将Java中的空指针异常控制在一个很好的水平上。顺便说一句,这是Javarevisited上的第二个空指针异常的帖子。在上个帖子中我们讨论了Java中导致空指针异常的常见原因,而在本教程中我们将会学习一些Java的编程技巧和最佳实践。这些技巧可以帮助你避免Java中的空指针异常。遵从这些技巧同样可以减少Java代码中到处都有的非空检查的数量。作为一个有经验的Java程序员,你可能已经知道其中的一部分技巧并且应用在你的项目中。但对于新手和中级开发人员来说,这将是很值得学习的。顺便说一句,如果你知道其它的避免空指针异常和减少空指针检查的Java技巧,请和我们分享。 这些都是简单的技巧,很容易应用,但是对代码质量和健壮性有显著影响。根据我的经验,只有第一个技巧可以显著改善代码质量。如我之前所讲,如果你知道任何避免空指针异常和减少空指针检查的Java技巧,你可以通过评论本文来和分享。 **1) 从已知的String对象中调用equals()和equalsIgnoreCase()方法,而非未知对象。** 总是从已知的非空String对象中调用equals()方法。因为equals()方法是对称的,调用a.equals(b)和调用b.equals(a)是完全相同的,这也是为什么程序员对于对象a和b这么不上心。如果调用者是空指针,这种调用可能导致一个空指针异常 [?][Link 1] <table style="border-spacing:0px;border:1px solid rgb(204,204,204);text-align:center;clear:both;background:none;line-height:1.1em;margin-left:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;font-size:1em;min-height:auto;"> <tbody style="background:none;line-height:1.1em;text-align:left;vertical-align:baseline;font-size:1em;min-height:auto;"> <tr style="background:none;border-top:0px;line-height:1.1em;vertical-align:baseline;font-size:1em;min-height:auto;"> <td style="border-color:rgb(204,204,204);background:none;line-height:1.1em;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;font-size:1em;min-height:auto;color:rgb(175,175,175);"> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 1 </div> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 2 </div> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 3 </div> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 4 </div> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 5 </div> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 6 </div> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 7 </div> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 8 </div> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 9 </div> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 10 </div> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 11 </div></td> <td style="border-color:rgb(204,204,204);background:none;line-height:1.1em;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;font-size:1em;min-height:auto;"> <div style="line-height:15.4px;background:none;border:0px;vertical-align:baseline;min-height:auto;"> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">Object unknownObject = </code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;font-weight:bold;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:rgb(0,102,153);">null</code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">;</code> </div> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> </div> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:rgb(0,130,0);">//错误方式 – 可能导致 NullPointerException</code> </div> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;font-weight:bold;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:rgb(0,102,153);">if</code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">(unknownObject.equals(</code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#0000FF;">"knownObject"</code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">)){ </code> </div> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;"> </code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">System.err.println(</code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#0000FF;">"This may result in NullPointerException if unknownObject is null"</code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">);</code> </div> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">}</code> </div> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> </div> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:rgb(0,130,0);">//正确方式 - 即便 unknownObject是null也能避免NullPointerException</code> </div> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;font-weight:bold;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:rgb(0,102,153);">if</code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">(</code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#0000FF;">"knownObject"</code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">.equals(unknownObject)){ </code> </div> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;"> </code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">System.err.println(</code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#0000FF;">"better coding avoided NullPointerException"</code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">);</code> </div> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">}</code> </div> </div></td> </tr> </tbody> </table> 这是避免空指针异常最简单的Java技巧,但能够导致巨大的改进,因为equals()是一个常见方法。 **2) 当valueOf()和toString()返回相同的结果时,宁愿使用前者。** 因为调用null对象的toString()会抛出空指针异常,如果我们能够使用valueOf()获得相同的值,那宁愿使用valueOf(),传递一个null给valueOf()将会返回“null”,尤其是在那些包装类,像Integer、Float、Double和BigDecimal。 [?][Link 1] <table style="border-spacing:0px;border:1px solid rgb(204,204,204);text-align:center;clear:both;background:none;line-height:1.1em;margin-left:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;font-size:1em;min-height:auto;"> <tbody style="background:none;line-height:1.1em;text-align:left;vertical-align:baseline;font-size:1em;min-height:auto;"> <tr style="background:none;border-top:0px;line-height:1.1em;vertical-align:baseline;font-size:1em;min-height:auto;"> <td style="border-color:rgb(204,204,204);background:none;line-height:1.1em;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;font-size:1em;min-height:auto;color:rgb(175,175,175);"> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 1 </div> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 2 </div> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 3 </div></td> <td style="border-color:rgb(204,204,204);background:none;line-height:1.1em;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;font-size:1em;min-height:auto;"> <div style="line-height:15.4px;background:none;border:0px;vertical-align:baseline;min-height:auto;"> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">BigDecimal bd = getPrice();</code> </div> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">System.out.println(String.valueOf(bd)); </code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:rgb(0,130,0);">//不会抛出空指针异常</code> </div> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">System.out.println(bd.toString()); </code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:rgb(0,130,0);">//抛出 "Exception in thread "main" java.lang.NullPointerException"</code> </div> </div></td> </tr> </tbody> </table> **3) 使用null安全的方法和库 有很多开源库已经为您做了繁重的空指针检查工作。**其中最常用的一个的是Apache commons 中的StringUtils。你可以使用StringUtils.isBlank(),isNumeric(),isWhiteSpace()以及其他的工具方法而不用担心空指针异常。 [?][Link 1] <table style="border-spacing:0px;border:1px solid rgb(204,204,204);text-align:center;width:643px;clear:both;background:none;line-height:1.1em;margin-left:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;font-size:1em;min-height:auto;"> <tbody style="background:none;line-height:1.1em;text-align:left;vertical-align:baseline;font-size:1em;min-height:auto;"> <tr style="background:none;border-top:0px;line-height:1.1em;vertical-align:baseline;font-size:1em;min-height:auto;"> <td style="border-color:rgb(204,204,204);background:none;line-height:1.1em;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;font-size:1em;min-height:auto;color:rgb(175,175,175);"> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 1 </div> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 2 </div> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 3 </div> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 4 </div> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 5 </div> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 6 </div> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 7 </div> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 8 </div> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 9 </div> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 10 </div> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 11 </div></td> <td style="border-color:rgb(204,204,204);width:603.5px;background:none;line-height:1.1em;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;font-size:1em;min-height:auto;"> <div style="line-height:15.4px;background:none;border:0px;vertical-align:baseline;min-height:auto;"> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:rgb(0,130,0);">//StringUtils方法是空指针安全的,他们不会抛出空指针异常</code> </div> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">System.out.println(StringUtils.isEmpty(</code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;font-weight:bold;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:rgb(0,102,153);">null</code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">));</code> </div> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">System.out.println(StringUtils.isBlank(</code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;font-weight:bold;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:rgb(0,102,153);">null</code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">));</code> </div> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">System.out.println(StringUtils.isNumeric(</code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;font-weight:bold;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:rgb(0,102,153);">null</code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">));</code> </div> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">System.out.println(StringUtils.isAllUpperCase(</code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;font-weight:bold;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:rgb(0,102,153);">null</code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">));</code> </div> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> </div> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">Output:</code> </div> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;font-weight:bold;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:rgb(0,102,153);">true</code> </div> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;font-weight:bold;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:rgb(0,102,153);">true</code> </div> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;font-weight:bold;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:rgb(0,102,153);">false</code> </div> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;font-weight:bold;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:rgb(0,102,153);">false</code> </div> </div></td> </tr> </tbody> </table> 但是在做出结论之前,不要忘记阅读空指针方法的类的文档。这是另一个不需要下大功夫就能得到很大改进的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。这里是实例。 [?][Link 1] <table style="border-spacing:0px;border:1px solid rgb(204,204,204);text-align:center;width:643px;clear:both;background:none;line-height:1.1em;margin-left:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;font-size:1em;min-height:auto;"> <tbody style="background:none;line-height:1.1em;text-align:left;vertical-align:baseline;font-size:1em;min-height:auto;"> <tr style="background:none;border-top:0px;line-height:1.1em;vertical-align:baseline;font-size:1em;min-height:auto;"> <td style="border-color:rgb(204,204,204);background:none;line-height:1.1em;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;font-size:1em;min-height:auto;color:rgb(175,175,175);"> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 1 </div> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 2 </div> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 3 </div> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 4 </div></td> <td style="border-color:rgb(204,204,204);width:611px;background:none;line-height:1.1em;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;font-size:1em;min-height:auto;"> <div style="line-height:15.4px;background:none;border:0px;vertical-align:baseline;min-height:auto;"> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;font-weight:bold;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:rgb(0,102,153);">public</code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">List getOrders(Customer customer){ </code> </div> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;"> </code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">List result = Collections.EMPTY_LIST;</code> </div> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;"> </code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;font-weight:bold;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:rgb(0,102,153);">return</code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">result;</code> </div> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">}</code> </div> </div></td> </tr> </tbody> </table> 你同样可以使用Collections.EMPTY\_SET和Collections.EMPTY\_MAP来代替空指针。 **5) 使用annotation@NotNull 和 @Nullable** 在写程序的时候你可以定义是否可为空指针。通过使用像@NotNull和@Nullable之类的annotation来声明一个方法是否是空指针安全的。现代的编译器、IDE或者工具可以读此annotation并帮你添加忘记的空指针检查,或者向你提示出不必要的乱七八糟的空指针检查。IntelliJ和findbugs已经支持了这些annotation。这些annotation同样是JSR 305的一部分,但即便IDE或工具中没有,这个annotation本身可以作为文档。看到@NotNull和@Nullable,程序员自己可以决定是否做空指针检查。顺便说一句,这个技巧对Java程序员来说相对比较新,要采用需要一段时间。 **6) 避免你的代码中不必要的自动包装和自动解包。** 且不管其他如创建临时对象的缺点,如果wrapper类对象是null,自动包装同样容易导致空指针异常。例如如果person对象没有电话号码的话会返回null,如下代码会因为空指针异常崩溃。 [?][Link 1] <table style="border-spacing:0px;border:1px solid rgb(204,204,204);text-align:center;width:643px;clear:both;background:none;line-height:1.1em;margin-left:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;font-size:1em;min-height:auto;"> <tbody style="background:none;line-height:1.1em;text-align:left;vertical-align:baseline;font-size:1em;min-height:auto;"> <tr style="background:none;border-top:0px;line-height:1.1em;vertical-align:baseline;font-size:1em;min-height:auto;"> <td style="border-color:rgb(204,204,204);background:none;line-height:1.1em;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;font-size:1em;min-height:auto;color:rgb(175,175,175);"> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 1 </div> <div style="line-height:15.4px;background-image:none;border-width:0px 3px 0px 0px;border-right-style:solid;border-right-color:rgb(108,226,108);text-align:right;vertical-align:baseline;min-height:auto;"> 2 </div></td> <td style="border-color:rgb(204,204,204);width:611px;background:none;line-height:1.1em;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;font-size:1em;min-height:auto;"> <div style="line-height:15.4px;background:none;border:0px;vertical-align:baseline;min-height:auto;"> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">Person ram = </code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;font-weight:bold;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:rgb(0,102,153);">new</code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">Person(</code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#0000FF;">"ram"</code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">);</code> </div> <div style="line-height:15.4px;background-image:none;border:0px;vertical-align:baseline;min-height:auto;"> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;font-weight:bold;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:rgb(0,102,153);">int</code> <code style="background:rgb(255,255,255);border-left:3px solid rgb(108,226,108);width:640px;font-size:14px;clear:both;border-top:0px;border-right:0px;border-bottom:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;min-height:auto;color:#000000;">phone = ram.getPhone();</code> </div> </div></td> </tr> </tbody> </table> 当使用自动包装和自动解包的时候,不仅仅是等号,< > 同样会抛出空指针异常。你可以通过这篇文章来学习更多的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()返回false时,可以是一个空对象。同样的在返回Container和Collection类型方法的例子中,空对象可以被用来代替null作为返回值。我打算另写一篇文章来讲空对象模式,分享几个Java空对象的例子。 这就是全部了,这是几个易于遵从的避免空指针异常的Java技巧和最佳实践。你可以欣赏到这些技巧将非常有用,且不太难实现。如果你有其他比秒这个异常的技巧,而又没包含在这里,请通过评论来和我们分享,我将收录在这里。 想要更多干货、技术猛料的孩子,快点拿起手机扫码关注我,我在这里等你哦~ ![70][] [Link 1]: https://www.jb51.net/article/123049.htm# [70]: /images/20220521/90cd1f82699844a09d28721fef0c653d.png
相关 如何避免Java空指针异常 Java中的空指针异常(NullPointerException)通常发生在尝试访问或操作null对象时。以下是一些避免空指针异常的方法: 1. **充分检查对象**: 今天药忘吃喽~/ 2024年09月12日 17:36/ 0 赞/ 20 阅读
相关 简化Java方法调用,避免空指针问题 在Java中,避免空指针问题主要通过以下几种方式来简化方法调用: 1. **null检查**:在访问对象属性或调用方法之前,先判断对象是否为null。例如: ```java 爱被打了一巴掌/ 2024年09月11日 10:36/ 0 赞/ 19 阅读
相关 Java内部培训:有哪些避免空指针的方法? 在Java中,有几种方法可以避免空指针异常(NullPointerException)。下面是其中一些常见的方法,并附带一些示例代码: 1.使用条件判断 使用 妖狐艹你老母/ 2023年10月13日 14:36/ 0 赞/ 23 阅读
相关 Java中避免空指针的几个方法 equals Object类中的equals 方法在非空对象引用上实现相等关系,具有对称性 x.equals(y) 和 y.equals(x) 结果是一样的,但当x = 本是古典 何须时尚/ 2022年09月22日 13:58/ 0 赞/ 108 阅读
相关 Java开发技术总结!java避免空指针异常 ![蚂蚁金服4面Java高级开发岗(拿offer):看看阿里都问些什么?][4_Java_offer] 蚂蚁金服一面(技术面) JVM 内存分哪几个区,每个区的作用是什 亦凉/ 2022年08月31日 09:47/ 0 赞/ 138 阅读
相关 小谈空指针异常:java.lang.NullPointerException 在我所遇到的所有异常中,空指针是最好解决的,因为只需要查看是哪里报空指针,就知道是哪里的值是null的,只要保证那处的值非null,就能解决. 1.第一种空指针情况 比如: ゝ一世哀愁。/ 2022年06月01日 01:12/ 0 赞/ 238 阅读
相关 java 避免出现NullPointerException(空指针)的方法总结 java 避免出现NullPointerException(空指针)的方法总结 Java应用中抛出的空指针异常是解决空指针的最好方式,也是写出能顺利工作的健壮程序的关键。俗话 今天药忘吃喽~/ 2022年05月21日 07:10/ 0 赞/ 164 阅读
相关 Java中避免空指针的几个方法 equals Object类中的equals 方法在非空对象引用上实现相等关系,具有对称性 x.equals(y) 和 y.equals(x) 结果是一样的,但当x == 谁践踏了优雅/ 2022年03月15日 02:24/ 0 赞/ 387 阅读
相关 java 空指针异常java.lang.NullPointerException Java 空指针异常(java.lang.NullPointerException),顾名思义,即对象没有进行实例化便进行了使用。实例化的意义,就是将对象实例的地址赋值给对象符 绝地灬酷狼/ 2021年09月27日 11:04/ 0 赞/ 468 阅读
还没有评论,来说两句吧...