Stack Overflow 上最热门的问题:什么是NullPointerException

在逛 Stack Overflow 的时候,发现最火的问题竟然是:什么是 NullPointerException(java.lang.NullPointerE

其实Stack Overflow 上最热门的问题:什么是NullPointerException的问题并不复杂,但是又很多的朋友都不太了解,因此呢,今天小编就来为大家分享Stack Overflow 上最热门的问题:什么是NullPointerException的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

假如有一段这样的代码:

public void doSomething(SomeObject obj) { //do some to obj} 在这种情况下,我们不创建对象obj,而是假设它是在调用doSomething() 方法之前创建的。

现在假设它不是在此之前创建的。我们这样调用doSomething() 方法:

做某事(空);这意味着doSomething()方法的参数obj为null。如果该方法继续对obj 执行某些操作,最好提前抛出NullPointerException,因为开发人员需要此信息进行调试。

还有另一种选择,判断obj是否为null,如果是,小心做一些不会引发NullPointerException的事情;如果没有,就大胆去做。

/** * @param obj ____ 的可选foo。可能为null,在这种情况下* 结果将为____。 */public void doSomething(SomeObject obj) { if(obj !=null) { //do some } else { //do Something else }} 那么如果程序中真的发生了NullPointerException,如何跟踪堆栈信息并查找错误的根源?

简单来说,堆栈信息就是抛出Exception时应用程序调用的方法列表,可以准确定位错误的来源。就像下面这样。

线程“main”java.lang.NullPointerException 中出现异常,位于com.example.myproject.Book.getTitle(Book.java:16),位于com.example.myproject.Author.getBookTitles(Author.java:25),位于com.example.myproject.Bootstrap。 main(Bootstrap.java:14) 就上面的堆栈信息来看,错误发生在“at.”列表中,第一个“at”就是最初发生错误的位置。

Stack Overflow 上最热门的问题:什么是NullPointerException

在com.example.myproject.Book.getTitle(Book.java:16) 为了调试,我们可以打开Book.java 类的第16 行,它可以是:

15 public String getTitle() {16 System.out.println(title.toString());17 return title;18 } 从这段代码可以看出,错误的原因很可能是因为title 为null。

有时,应用程序捕获异常并将其作为另一种类型的异常抛出。像这样:

34 public void getBookIds(int id) {35 尝试{36 book.getId(id); //这里可能会抛出NullPointerException37 } catch (NullPointerException e) {38 throw new IllegalStateException(‘A book has a null property’, e) 39 }40 } 此时的堆栈信息可能如下:

线程“main”中的异常java.lang.IllegalStateException: 一本书在com.example.myproject.Author.getBookIds(Author.java:38) 和com.example.myproject.Bootstrap.main(Bootstrap.java:14) 处具有null 属性,由: java 引起.lang.NullPointerException at com.example.myproject.Book.getId(Book.java:22) at com.example.myproject.Author.getBookIds(Author.java:36) . 1 more 与之前堆栈信息的区别在于,这里有又是一个“由……引起”;有时有更多的“引起”。这种情况下,我们通常需要追根溯源,找到最深层的“原因”——,也就是堆栈信息中的最底层。

Caused by: java.lang.NullPointerException — Root Cause at com.example.myproject.Book.getId(Book.java:22) 同样,我们需要查看Book.java 的第22 行以查找NullPointerException 的可能原因。

有时堆栈信息比上面的例子要混乱得多。请参考下面这个。

javax.servlet.ServletException: com.example.myproject.OpenSessionInViewFilter.doFilter(OpenSessionInViewFilter.java:60) 在org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在com.example.myproject.ExceptionHandlerFilter 发生了一些不好的事情.doFilter(ExceptionHandlerFilter.java:28) 位于org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 位于com.example.myproject.OutputBufferFilter.doFilter(OutputBufferFilter.java:33) 位于org.mortbay.jetty.Server。处理(server.java:326)在org.mortbay.jetty.httpconnection.handlerequest(httpconnection.java:542)在org.mortbay.httpconnection $ RequestHandler.Content(httpconnection.java:943)在org.mortbay.jetty.httpparser.parsenext(httpparser .java:756) )在org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)在org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)在org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:228)在org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 由: com.example.myproject.MyProjectServletException 在com.example.myproject.MyServlet.doPost(MyServlet.java:169) 在javax.servlet.http 引起。 HttpServlet.service(HttpServlet.java:727)在javax.servlet.http.HttpServlet.service(HttpServlet.java:820)在org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)在org.mortbay.jetty.servlet.ServletHandler $CachedChain.doFilter(ServletHandler.java:1166) 在org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2822) 在org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71) 在org.hibernate.engine。动作队列。执行(ActionQueue.java:268)在org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321)在org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)在sun.reflect.DelegatingMethodAccessorImpl .invoke(DelegatingMethodAccessorImpl .java:25)在java.lang.reflect.Method.invoke(Method.java:597)在org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:344)在$Proxy19.save(未知来源)在com.example.myproject .MyEntityService.save(MyEntityService.java:59) — com.example.myproject.MyServlet.doPost(MyServlet.java:164) . 32 moreCaused by: java.sql.SQLException: 违反唯一约束MY_ENTITY_UK_1: 重复语句[.] 中MY_COLUMN 的值,位于org.hsqldb.jdbc.Util.throwError(未知来源),位于org.hsqldb.jdbc.jdbcPreparedStatement.executeUpdate(未知来源),位于com.mchange。 v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105) at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:57) . 54 more 这个例子中的堆栈信息确实太多了,令人困惑眼花缭乱。如果按照前面提供的方法(堆栈信息最下面的那个)找到最深层的“原因”,那就是:

用户评论

Stack Overflow 上最热门的问题:什么是NullPointerException
早不爱了

每次调试都遇到这个错误啊!感觉NullPointerException就是Java语言中最烦人的坑了,总是不知道哪里出了问题,浪费好多时间!

    有14位网友表示赞同!

Stack Overflow 上最热门的问题:什么是NullPointerException
古巷青灯

看到这篇文章我都想笑,这个问题真的是太常见了,我们学习Java的时候被它坑惨了!哈哈,写代码还要注意null值的判断,不然这NullPointerException就会跑出来找你麻烦。

    有8位网友表示赞同!

Stack Overflow 上最热门的问题:什么是NullPointerException
权诈

感觉像是在讲一个笑话一样,NullPointerException简直是程序员的噩梦。明明代码看起来没问题,却总是会突然报错,让人真的抓狂啊!

    有16位网友表示赞同!

Stack Overflow 上最热门的问题:什么是NullPointerException
心贝

其实这篇文章写的挺不错的,清晰地解释了NullPointerException是什么,以及为什么会发生。对新手来说很有帮助!我记得我自己刚学的时候也是经常犯这个错误

    有15位网友表示赞同!

Stack Overflow 上最热门的问题:什么是NullPointerException
黑夜漫长

这篇博客真是太棒啦!以前对这个异常总是很懵,现在终于明白了! 感谢作者的分享,让我学习到了很多!

    有6位网友表示赞同!

Stack Overflow 上最热门的问题:什么是NullPointerException
不忘初心

Stack Overflow上最火的这个问题确实有点无奈。我觉得对于新手来说,理解引用和变量很重要,才能避免NullPointerException这种简单的错误

    有20位网友表示赞同!

Stack Overflow 上最热门的问题:什么是NullPointerException
高冷低能儿

看到这么多人讨论这个,我反而觉得安心了,因为我知道我不是一个人在受折磨!谁还没犯过这样的低级错误呢?重要的是总结教训,提高代码质量!

    有18位网友表示赞同!

Stack Overflow 上最热门的问题:什么是NullPointerException
留我一人

文章分析得比较全面,包括了各种可能导致 NullPointerException 的场景,很有参考价值。当然,更重要的是实践和积累经验,才能避免在实际开发中遇到类似问题

    有16位网友表示赞同!

Stack Overflow 上最热门的问题:什么是NullPointerException
涐们的幸福像流星丶

对于一个Java程序员来说,NullPointerException 算是必备的应急技能吧!毕竟,你永远不知道你的代码里什么时候会出现不必要的null值引用。

    有18位网友表示赞同!

Stack Overflow 上最热门的问题:什么是NullPointerException
青袂婉约

我感觉这篇文章没有解释清楚 NullPointerException 发生的原因。例如,为什么某些情况下变量会变为 null?希望作者能补充一些更具体的例子和分析

    有12位网友表示赞同!

Stack Overflow 上最热门的问题:什么是NullPointerException
残留の笑颜

我也是对这篇博客的内容非常感兴趣!在实际开发中也常常遭遇NullPointerException,希望能学习到更多方法来解决这个问题。

    有10位网友表示赞同!

Stack Overflow 上最热门的问题:什么是NullPointerException
我家的爱豆是怪比i

我觉得这篇文章忽略了一点,就是如何使用调试工具来定位 NullPointerException 的位置。调试工具能够帮助我们快速找到问题所在,从而提高效率

    有19位网友表示赞同!

Stack Overflow 上最热门的问题:什么是NullPointerException
﹎℡默默的爱

Stack Overflow上确实有很多关于NullPointerException的问题,可见这个错误在Java开发中是非常常见的!其实只要注意代码逻辑和数据流,就能尽量避免这类错误

    有9位网友表示赞同!

Stack Overflow 上最热门的问题:什么是NullPointerException
等量代换

我反而觉得NullPointerException并不是一个坏的东西!它提醒我们要注意代码细节,确保每个变量都有合理的引用。这是一种程式设计中不可忽视的思维方式。

    有9位网友表示赞同!

Stack Overflow 上最热门的问题:什么是NullPointerException
栀蓝

每次遇到 NullPointerException 我都会先看下代码注释,看看有没有对变量类型的说明。有时候作者会留下提示,帮助我们排查问题

    有10位网友表示赞同!

Stack Overflow 上最热门的问题:什么是NullPointerException
夏以乔木

这篇博客让我明白了一种避免NullPointerException的方法:使用Optional或者其他类似的机制来处理可能为空的引用。这是一种更加健壮的设计模式!

    有18位网友表示赞同!

Stack Overflow 上最热门的问题:什么是NullPointerException
迁心

这个 NullPointerException 可真是太坑了!有时候代码修改了好几遍,愣是找不到问题原因!只能寄希望于Stack Overflow上的大神们能解惑

    有9位网友表示赞同!

Stack Overflow 上最热门的问题:什么是NullPointerException
残花为谁悲丶

对于开发人员来说,学习如何正确处理Null是一种必备的技能。只有这样才能写出更加稳定和可维护的代码

    有5位网友表示赞同!

原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/123993.html

(0)
小su's avatar小su
上一篇 2024年9月1日 下午6:09
下一篇 2024年9月1日 下午6:14

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注