pattern空指针java_java 避免出现NullPointerException(空指针)的方法总结

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这么不上心。如果调用者是空指针,这种调用可能导致一个空指针异常

object unknownobject = null;

//错误方式 – 可能导致 nullpointerexception

if(unknownobject.equals("knownobject")){

system.err.println("this may result in nullpointerexception if unknownobject is null");

}

//正确方式 - 即便 unknownobject是null也能避免nullpointerexception

if("knownobject".equals(unknownobject)){

system.err.println("better coding avoided nullpointerexception");

}

这是避免空指针异常最简单的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.println(bd.tostring()); //抛出 "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.isalluppercase(null));

output:

true

true

false

false

但是在做出结论之前,不要忘记阅读空指针方法的类的文档。这是另一个不需要下大功夫就能得到很大改进的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已经支持了这些annotation。这些annotation同样是jsr 305的一部分,但即便ide或工具中没有,这个annotation本身可以作为文档。看到@notnull和@nullable,程序员自己可以决定是否做空指针检查。顺便说一句,这个技巧对java程序员来说相对比较新,要采用需要一段时间。

6) 避免你的代码中不必要的自动包装和自动解包。

且不管其他如创建临时对象的缺点,如果wrapper类对象是null,自动包装同样容易导致空指针异常。例如如果person对象没有电话号码的话会返回null,如下代码会因为空指针异常崩溃。

person ram = new person("ram");

int phone = ram.getphone();

当使用自动包装和自动解包的时候,不仅仅是等号,< > 同样会抛出空指针异常。你可以通过这篇文章来学习更多的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技巧和最佳实践。你可以欣赏到这些技巧将非常有用,且不太难实现。如果你有其他比秒这个异常的技巧,而又没包含在这里,请通过评论来和我们分享,我将收录在这里。

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

希望与广大网友互动??

点此进行留言吧!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是Java中的一个异常,表示代码中出现了空指针。通常是因为尝试访问一个空对象或者变量,导致程序无法继续执行。在这个特定的情况下,异常信息中提到了“pattern”,可能是因为在使用正则表达式时,没有正确地初始化或者传递一个空的模式。需要检查代码中的变量和对象是否被正确地初始化,并且确保在使用正则表达式时传递了正确的参数。 ### 回答2: java.lang.nullpointerexception: patternJava程序的一个错误提示信息。NullPointerException空指针异常)是Java程序中常见的一种异常类型,它通常发生在代码中尝试使用null对象或引用没有指向任何对象的实例变量时。 当程序遇到java.lang.nullpointerexception: pattern 错误时,它通常意味着代码中某个变量或对象为空,而程序尝试访问它,从而导致了空指针异常。根据错误提示中的pattern,可以猜测可能是某个模式匹配的正则表达式为空或为null,导致了空指针异常的发生。 为了解决这个问题,开发者需要定位导致空指针异常的代码行,并检查变量或对象是否为空。如果变量或对象为空,开发者需要为其赋值以避免空指针异常的发生。如果是模式匹配的问题,需要检查正则表达式是否为空或null,并做相应的处理。 此外,开发者可以使用Java的异常处理机制来捕获空指针异常并进行相应的处理。在程序中添加try-catch语句可以捕获异常并在异常发生时执行预定义的代码块,这有助于程序更好地处理异常情况。 总之,java.lang.nullpointerexception: pattern错误提示意味着程序中存在空指针异常的情况,开发者需要找到并修复代码中的问题,或者使用Java的异常处理机制进行处理。 ### 回答3: java.lang.nullpointerexception: pattern是指在Java程序中使用了一个null值对象,而程序试图对该对象执行某种操作(比如调用它的方法或访问其某个属性)时,由于该对象没有指向实际的内存地址,因此会抛出NullPointerException异常。这个异常提示中的pattern通常是指一个正则表达式模式,这个模式可能由于程序中的错误或者输入数据的异常而被设置成null值,从而导致该异常的出现。 通常,java.lang.nullpointerexception: pattern异常是由以下原因导致的: 1. 对一个null值对象调用方法或访问属性; 2. 在使用正则表达式的过程中,没有正确的初始化pattern对象或者没有正确的处理输入数据,导致pattern对象被设置成了null值; 3. 在处理字符串或文本时,没有正确的处理空值或不合法的输入数据,导致程序出现空指针异常。 为了解决java.lang.nullpointerexception: pattern异常,我们需要进行以下步骤: 1. 在程序中使用变量时进行非空值检查,确保该对象引用指向了一个实际存在的内存地址; 2. 确保对内存中的对象进行正确的初始化和处理,避免因为数据异常而导致pattern对象被设置成null值; 3. 在处理字符串和文本时,进行输入数据的正确性检查,避免空值和不合法的输入数据; 4. 在程序中合理地使用异常处理机制,避免因为空指针异常导致程序崩溃。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值