-1
if (methodCall.getClassName(cg.getConstantPool()).contains(ALLATORI_CLASS.getClassName())) {

我试图修复一个 java 应用程序,但我不断收到一个空指针异常。究竟是什么?我将如何修复这行代码?

4

2 回答 2

4

Java 允许对象引用null意味着引用不引用真实对象。

您通常使用对象引用的方式均不适用于null

  1. 您不能在不引用实现这些方法的实际对象的引用上调用方法。
  2. 您不能通过不引用具有字段的实际对象的引用来读取或写入字段。

关于一个值,你唯一能做的null就是检查它是否是null或者它是否有一个名义类型(通过instanceof)。

NullPointerException当您尝试使用上述引用时会发生A null—— 调用或操作字段。


通常出现问题的原因是您在填充之前尝试使用引用,因此您经常需要查找无序的操作。您可能会尝试识别创建您尝试使用的任何内容的代码,并在使用它之前查看它为什么没有运行。

如果引用的类型是一个interface类型,通常您可以实现一个实际上具有方法的类似 null 的值。例如,如果没有配置非必要的数据库驱动组件,您可能只是创建一个没有任何用处但不会崩溃并阻止系统其余部分工作的组件。


if (methodCall.getClassName(cg.getConstantPool())
    .contains(ALLATORI_CLASS.getClassName())) {

有几个地方可能会出现问题。

  1. methodCall可能为 null 导致调用getClassName失败
  2. cg可能为 null 导致调用getConstantPool失败
  3. ALLATORI_CLASS可能为 null 导致调用getClassName失败,这可能表明类初始化循环
  4. methodCall.getClassName(cg.getConstantPool())可能返回 null 导致调用contains失败

我会为每一个添加日志记录,以确定哪些是问题的一部分,哪些不是问题的一部分。


Tony Hoarenull他为“十亿美元的错误”,因为 null 取消引用错误如此频繁。

我称之为我的十亿美元错误。它是 1965 年空引用的发明。当时,我正在为面向对象语言 (ALGOL W) 中的引用设计第一个综合类型系统。我的目标是确保所有引用的使用都应该是绝对安全的,并由编译器自动执行检查。但我无法抗拒加入空引用的诱惑,仅仅是因为它很容易实现。这导致了无数的错误、漏洞和系统崩溃,在过去的四十年中可能造成了十亿美元的痛苦和损失。

他之所以实现它,是因为让语言保证所有指向真实值的指针通常会给用户带来负担,并使在急切的语言中构造循环数据类型变得棘手。

其他语言使用联合类型(如选项)来解决此问题。

于 2013-05-27T21:13:38.067 回答
0

NullPointerException” 表示您的目标是“空的”,通常是因为它不存在。您首先必须声明变量并初始化。

据我所知,您正在调用您的代码无法访问的方法,因此 Java 认为您想要指向“无”。首先,如果该方法预计会给出该异常(即:从用户获取字符串(直接输入),因为用户可以给出一个空条目。),向方法添加 throw 声明(即public void method1() throws NullPointerException { }

但是,您提供的唯一线路,我无法为您提供进一步的帮助,抱歉。

于 2013-05-27T21:19:39.070 回答