当前位置: 首页 > 面试题库 >

什么是NullPointerException,我该如何解决?

应涵容
2023-03-14
问题内容

什么是空指针异常(java.lang.NullPointerException),什么原因导致它们?

可以使用哪些方法/工具确定原因,以阻止异常导致程序过早终止?


问题答案:

声明引用变量(即对象)时,实际上是在创建指向对象的指针。考虑以下代码,在其中声明基本类型的变量int:

int x;
x = 10;

在此示例中,变量x是an int,Java会0为你初始化它。当你10在第二行为其分配值时,你的值将10写入所指的存储位置x。

但是,当你尝试声明引用类型时,会发生一些不同的事情。采取以下代码:

Integer num;
num = new Integer(10);

第一行声明了一个名为的变量num,但实际上尚未包含原始值。相反,它包含一个指针(因为类型是Integer引用类型)。由于你尚未说出要指向的内容,因此Java将其设置为null,表示“ 我什么都没有指向 ”。

在第二行中,new关键字用于实例化(或创建)一个类型的对象,Integer并将指针变量num分配给该Integer对象。

NullPointerException当你声明变量但未创建对象并在尝试使用变量的内容之前将其分配给变量时,就会发生这种情况(称为dereferencing)。因此,你指向的是实际上不存在的东西。

当.用于访问方法或字段或[用于索引数组时,通常会发生解除引用。

如果num在创建对象之前尝试取消引用,则会显示NullPointerException。在大多数情况下,编译器会发现问题,并让你知道“” num may not have been initialized,但是有时你可能会编写不直接创建对象的代码。

例如,你可能具有如下方法:

public void doSomething(SomeObject obj) {
   //do something to obj
}

在这种情况下,你不是在创建对象obj,而是假设它是在doSomething()调用方法之前创建的。注意,可以这样调用方法:

doSomething(null);

在这种情况下objnull。如果该方法旨在对传入的对象做某事,则最好抛出,NullPointerException因为这是程序员错误,程序员将需要该信息来进行调试。请在异常消息中包括对象变量的名称,例如

Objects.requireNonNull(a, "a");

替代地,在某些情况下,该方法的目的不仅是对传入的对象进行操作,因此null参数是可以接受的。在这种情况下,你将需要检查null参数并表现不同。你还应该在文档中对此进行解释。例如,doSomething()可以写成:

/**
  * @param obj An optional foo for ____. May be null, in which case 
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj == null) {
       //do something
    } else {
       //do something else
    }
}


 类似资料:
  • 问题内容: 请解释以下有关Spring中的异常的信息: 这是什么意思? 在什么情况下会抛出? 我该如何预防? 问题答案: 当询问a找不到其定义的bean实例时引发异常。这可能指向不存在的bean,不唯一的bean或没有关联的bean定义的手动注册的单例实例。 A 基本上是代表Spring的容器反转的抽象。它在内部和外部向你的应用程序公开bean。当找不到或检索到这些bean时,将抛出。 以下是一个

  • 问题内容: 我一直在搜索,但仍然不确定“盐”是什么以及如何使用/实现它。对不起这个问题,我是自学php。 问题答案: 我绝对不是专家,但是真正简短的答案是“涂一行”文本意味着在其末尾添加一些额外的字符。您可以将“ salt”和“ abcdefg”加盐以获得“ saltabcdefg”。如果“盐”恰好是您想要使其更难猜测的密码,则这可能很有用。 通常,密码+盐会通过一些难以逆转的过程转换(“散列”)

  • 问题内容: 我目前正在尝试使用Java作为大学项目来创建井字游戏。到目前为止,我所做的只是创建了gameBoard方法的框架代码。我已经遇到一个错误,说: 我也不确定如何总体上完成该项目。我的基本想法是使用gameBoard方法在每个回合上打印棋盘。我试图将变量设置为全局变量,以便在玩家移动时可以更改它们。如何做到这一点,以及如何解决我遇到的错误?任何帮助将不胜感激,这是我当前的代码: 问题答案:

  • 正在启动lib\main。在调试模式下为x86构建的Android SDK上的dart。。。正在运行Gradle任务“assembleDebug”。。。 失败:生成失败,出现异常。 错误:任务“:app:compileFlutterBuildDebug”的执行失败 JAVAlang.NullPointerException(无错误消息) > 尝试:使用--stacktrace选项运行以获取堆栈跟踪

  • 当我试图通过heroku打开我正在处理的应用程序时,我得到了一个应用程序错误。我查看了heroku日志,发现以下错误: “错误H10(应用程序崩溃)- 我不确定错误指的是什么,或者我如何解决导致错误的问题。你能给的任何帮助都会很棒!

  • 问题内容: 我有以下代码: 当我在Python shell中运行它时,它返回: 我已经搜索过了,这似乎叫做列表理解,但是它如何工作? 问题答案: 我有以下代码: 当我在Python shell中运行它时,它返回: 我已经搜索过了,这似乎叫做列表理解,但是它如何工作?