java中空指针异常例子-java空指针异常解决
如何避免 Java 中的空指针异常
更新时间:2022-03-28 08:59:04 作者:学习Java
Null PointerException (NPE) 是 Java 中最常见的异常。 尽管原因很明显,但开发人员往往忽视它或未能及时采取措施。 下面这篇文章主要介绍Java中的空指针异常。 关于如何避免的相关信息,有需要的朋友可以参考下面
Java中如何避免空指针异常也是初级程序员成长为中级程序员经常遇到的问题。
程序员不知道或不信任正在使用的约定,因此会小心检查是否为 null。 还有,程序员在写代码的时候,总是依赖于返回NULL来表示某种意义,所以要求调用者检查是否为Null。
有两种空指针检查场景:
第二种很简单,可以使用assert或者让程序报错,比如抛出NullPointerException。 断言是 Java 1.4 中添加的一个未被充分利用的特性,语法是:
assert
或者
assert:
condition 是一个布尔表达式,object 是一个对象(其 toString() 方法的输出将包含在错误中)。
校对笔记:我测试过,JDK1.4及以上版本java中空指针异常例子,运行前设置vm参数-ea
public static void main(String[] args) {String name = null;assert (name != null) : "name为空null";} Exception in thread "main"; java.lang.AssertionError: 变量name为空nullat LogUtil.main(LogUtil.java:37)
如果条件为假,断言将抛出一个错误(AssertionError)。 默认情况下,Java 忽略断言。 您可以通过将 -ea 参数传递给 JVM 来启用断言。
您可以为单个包或类启用和禁用断言。 这意味着您可以在开发和测试期间使用断言验证代码,并在发布到生产环境时将其关闭,尽管我在下面的测试中没有显示断言的性能损失。 在这段代码中,不需要断言,因为它会运行失败,就像添加断言一样。 唯一的区别是断言可能发生得更快,更有意义,并附上一些额外的信息,可以帮助您找出失败的原因。
第一个有点棘手。 如果您无法控制被调用的代码,您就会陷入困境。 如果 Null 是一个合理的返回值,您应该检查它。 如果它是您可以控制的代码,那将是一个完全不同的故事情节。 尽量避免使用 NULL 作为返回值。 对于返回 Collections 的集合,很容易返回 Empty(一个空集合或数组),而不是总是返回 null。 对于不返回 Collections 的方法来说稍微复杂一些。 考虑以下示例:
public interface Action { void doSomething();}public interface Parser { Action findAction(String userInput);}
解析器将用户输入作为参数java中空指针异常例子,然后执行某些操作(例如模拟命令行)。 现在,如果没有找到输入的操作,您可以返回 null,这会导致刚才提到的空指针检查。
另一种解决方案是永远不返回 null,而是返回一个空对象
public class MyParser implements Parser { private static Action DO_NOTHING = new Action() { public void doSomething() { /* do nothing */ } }; public Action findAction(String userInput) { // ... if ( /* we can't find any actions */ ) { return DO_NOTHING; } }}
比较这段代码:
Parser parser = ParserFactory.getParser();if (parser == null) { // now what? // this would be an example of where null isn't (or shouldn't be) a valid response}Action action = parser.findAction(someInput);if (action == null) { // do nothing} else { action.doSomething();}
这一段:
ParserFactory.getParser().findAction(someInput).doSomething();
这是一个更好的设计,因为它足够简洁,避免了多余的判断。
即便如此,也许更合适的设计是让 findAction() 方法抛出异常并显示一些有意义的错误消息——尤其是在您依赖用户输入的情况下。
让 findAction() 方法抛出异常而不是简单地抛出 NullPointerException 而不做任何解释会好得多。
try { ParserFactory.getParser().findAction(someInput).doSomething();} catch(ActionNotFoundException anfe) { userConsole.err(anfe.getMessage());}
或者你觉得 try/catch 机制太丑了,你的 action 应该给用户提供反馈而不是什么都不做:
public Action findAction(final String userInput) { /* Code to return requested Action if found */ return new Action() { public void doSomething() { userConsole.err("Action not found: " + userInput); } }}
补充:本人在做项目时,对NullPointerException的一些总结,请朋友们多多指教! ! ! 很多评论,
1、对于别人接口返回的对象,我们需要判断它是否为空,因为我们不知道获取到的对象是否会为空。 对于Collection Map,我一般调用CollectionUtils MapUtils。 对于返回的String对象,我会调用StringUtils.isNotEmpty()进行非空判断。 其中isNotEmpty不仅判断NULL,还判断空集合和空字符串。 例如从数据中查询的结果。 工作流中返回的定价 URL
2.自己创建的对象,要注意对对象进行了哪些操作,对象中间会不会为空,有条件的话加上非空判断,尤其是集合类操作,很容易报错空指针! ! ! 所以我每次操作一个集合的时候,都会非常小心。
3. 非常小心前端域对象,因为这些对象是由框架创建的。 如果我在前端的文本框中不输入值,虽然提交时后端得到的是空字符串,但是NullPointerException的概率很高。
4、对于String的操作,尽量使用apache的StringUtils类,相对于String来说是非常安全的。 对于集合操作,使用了 Apache 的 CollectionUtils 和 MapUtils。 与Apache工具相比,执行效率也很高,比如StringUtils.split();
有人说过多的判断会影响性能。 我个人认为这里的性能牺牲与系统的安全性相比是微不足道的。
总结
关于Java中如何避免空指针异常的文章到此结束。 更多关于Java空指针异常的内容,请搜索脚本之家以往文章或继续浏览以下相关文章。 希望大家以后多多支持脚本。 家!