在此代码行上获取空指针异常。什么是空指针?我该如何解决?

时间:2013-05-27 21:10:29

标签: java

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

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

2 个答案:

答案 0 :(得分:4)

Java允许对象引用为null,这意味着引用不是指真实对象。

您通常使用对象引用的方式与null无关:

  1. 您不能在不引用实现这些方法的实际对象的引用上调用方法。
  2. 您无法通过不引用带字段的实际对象的引用来读取或写入字段。
  3. 关于使用null值唯一可以做的事情是检查它是null还是名义类型(通过instanceof)。

    当您尝试使用上述NullPointerException的引用时,会出现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失败
    5. 我会为每一个添加日志记录,以确定哪些是问题的哪些,哪些不是问题的一部分。


      Tony Hoare调用null他的“十亿美元错误”,因为空的解除引用错误非常频繁。

        

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

      他实现了它,因为使语言保证指向实际值的所有指针经常给用户带来负担,并且使得在急切语言中构建循环数据类型变得棘手。

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

答案 1 :(得分:0)

NullPointerException”表示您的目标是“empy”,通常是因为它不存在。首先必须声明变量AND initialize。

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

但是你提供的唯一一条线我无法帮助你,抱歉。