为了账号安全,请及时绑定邮箱和手机立即绑定

什么是空指针异常,我该如何解决?

什么是空指针异常,我该如何解决?

长风秋雁 2019-05-20 10:11:19
什么是空指针异常(java.lang.NullPointerException)以及它们的原因是什么?可以使用哪些方法/工具来确定原因,以便停止异常导致程序过早终止?
查看完整描述

12 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

NullPointerExceptions是当您尝试使用指向内存中没有位置的引用(null)时发生的异常,就好像它引用了一个对象一样。在空引用上调用方法或尝试访问空引用的字段将触发a NullPointerException。这些是最常见的,但NullPointerExceptionjavadoc页面上列出了其他方式。

可能是我能想出的最快的示例代码来说明NullPointerException

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }}

在内线的第一行main,我明确地将Object引用设置为obj等于null。这意味着我有一个引用,但它没有指向任何对象。之后,我尝试将引用视为通过调用其上的方法指向对象。这导致a NullPointerException因为没有代码在引用指向的位置执行。

(这是一个技术性问题,但我认为值得一提的是:指向null的引用与指向无效内存位置的C指针不同。空指针实际上并不指向任何位置,这与指向恰好无效的位置。)


查看完整回答
反对 回复 2019-05-20
?
郎朗坤

TA贡献1921条经验 获得超9个赞

这就像你试图访问一个对象null。考虑下面的例子:

TypeA objA;

此时您刚刚声明了此对象但未初始化或实例化。每当你试图访问其中的任何属性或方法时,它都会抛出NullPointerException有意义的东西。

请参阅以下示例:

String a = null;System.out.println(a.toString()); // NullPointerException will be thrown


查看完整回答
反对 回复 2019-05-20
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

一个null指针是一个指向无处。当你解引用一个指针p,你说“给我的数据在存储中的位置‘P’,当p是一个null指针,该位置存储在p就是nowhere,你说‘给我的数据在位置‘无处’。’显然,它不能这样做,所以它抛出一个null pointer exception

一般来说,这是因为某些东西尚未正确初始化。


查看完整回答
反对 回复 2019-05-20
?
狐的传说

TA贡献1804条经验 获得超3个赞

已经有很多解释来解释它是如何发生的以及如何解决它,但你也应该遵循最佳实践来避免它NullPointerException

另请参阅: 最佳实践列表

我想补充一点,非常重要的是,要好好利用final修饰语。 在Java中适用时使用“final”修饰符

摘要:

  1. 使用final修饰符强制执行良好的初始化。

  2. 避免在方法中返回null,例如在适用时返回空集合。

  3. 使用注释@NotNull@Nullable

  4. 快速失败并使用断言来避免null对象在不应为null时在整个应用程序中传播。

  5. 首先使用equals与已知对象: if("knownObject".equals(unknownObject)

  6. 喜欢valueOf()toString()。

  7. 使用null安全StringUtils方法StringUtils.isEmpty(null)


查看完整回答
反对 回复 2019-05-20
?
GCT1015

TA贡献1827条经验 获得超4个赞

NullPointerException当一个声明一个对象数组时,会发生另一次出现,然后立即尝试取消引用它内部的元素。

String[] phrases = new String[10];String keyPhrase = "Bird";for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));}

如果比较顺序颠倒,可以避免这种特殊的NPE; 即,.equals在有保证的非null对象上使用。

数组内的所有元素都被初始化为它们的公共初始值 ; 对于任何类型的对象数组,这意味着所有元素都是null

必须初始化数组中的元素之前访问或提领他们。

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};String keyPhrase = "Bird";for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));}


查看完整回答
反对 回复 2019-05-20
  • 12 回答
  • 0 关注
  • 6710 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号