【问题标题】:Strange null pointer exception奇怪的空指针异常
【发布时间】:2010-07-12 13:18:58
【问题描述】:

我有以下全局数组...

public static float camObjCoord[] = new float[8000];

我有一个方法将值输入到它的索引中,我正在像这样发送它们......

layers.addcube(-6, -2, -6, -2);

i 是一个声明为..的类变量。

int i = 0;

并且层被声明为...

GLLayer layers = new GLLayer(this);

但是当我这样做时,我会在...处得到一个 NullPointerException。

public void addcube(float highx, float lowx, float highz, float lowz){
    //Constructing new cube...

    cubes++;
    float highy = 4.5f;
    float lowy = 2.5f;

    //FRONT
    Global.camObjCoord[i] = highx; //null pointer here.

有谁知道为什么它给了我一个空指针?还有更多代码,但我认为只给你相关的就足够了。

谢谢

【问题讨论】:

  • 发布你得到的堆栈跟踪。
  • i(以及扩展名Global.camObjCoord.length)的值是多少?
  • @ChrisF 如果您查看 if / else i 被声明为 0Global.camObjCoord 的结尾,具体取决于条件
  • 这是什么全局?看起来它是空的。 start 的价值是什么?
  • “还有更多的代码,但我认为只给你相关的就足够了。”这总是很难判断。如果你知道什么是相关的(即问题到底出在哪里),你可能已经找到了。如果确实是 NullPointerException,那么我怀疑您在未发布的代码中某处更改了 camObjCoord。

标签: java nullpointerexception


【解决方案1】:

尝试将其更改为:

public final static float camObjCoord[] = new float[8000];

我假设您在此处更新 camObjCoord 并将其设置为 null。否则,我看不出您如何在该行中获得 NullPointerException。

【讨论】:

  • @DaveJohnston:我引用:“我假设您在此处更新 camObjCoord 并将其设置为 null。否则我看不出您如何在该代码中获得 NullPointerException。”
  • @DaveJohnston - 可能是因为您不能稍后将 camObjCoord 设置为 null,因为它是最终版本?
  • 我在您更新答案以包含解释之前发表了我的评论,这很公平。
  • 看起来编辑历史不完整;)无论如何 - 如果它是 NPE,那么我也看不到任何其他原因。
  • @DaveJohnston:是的,我知道这不是你的问题,我引用了我写给原始海报的内容。是的,我从一开始就没有那个解释,所以你要求澄清是公平的。
【解决方案2】:

您确定这是 NullPointerException 而不是 ArrayIndexOutOfBoundsException?如果start != 0,则 i 是数组的长度。但是,数组索引从 0 到 length - 1 - 因此您需要 i = Global.camObjCoord.length - 1; 在您声称引发异常的行中获取有效索引。

【讨论】:

    【解决方案3】:

    最高数组索引应该是array.length - 1。所以

    if(start != 0){
            i = Global.camObjCoord.length - 1;
        } 
    

    【讨论】:

      【解决方案4】:

      请注意,如果在分配camObjCoord 的值之前执行此行可能会引发异常。强制这种情况非常困难,但有可能(例如,如果先前的初始化程序包含方法调用并且您在该方法中访问 camObjCoord):

       public class NPEThrower {
          Object x = initX();
          float[] foo = new float[8000];
      
          private Object initX() {
              int l = foo.length;
              return "x";
          }
      }
      

      请注意,将 final 添加到字段定义并不能解决此问题(这意味着您可以在执行期间观察到 final 字段的 2 个不同值:null 和实际值!)。

      【讨论】:

        【解决方案5】:

        鉴于您显示的代码,不可能有 NullPointerException。异常发生在不同的行,或者是不同的异常,或者您在其他地方将数组设置为 null。

        【讨论】:

          【解决方案6】:

          您正在分配 i = array.length,然后分配给 i 处的元素。这将访问数组的末尾。

          【讨论】:

            【解决方案7】:

            您应该发布堆栈跟踪,因为我认为它不是NullPointerException,而是ArrayIndexOutOfBoundsException。如果您设置了i = Global.camObjCoord.length,那么您不能使用i 来索引该数组,因为它将超出数组的末尾。想想看,如果你有一个大小为 1 的数组,那么你可以使用的唯一索引是 0,如果你尝试访问元素 1,你将离开数组的末尾,因此会出现异常。

            【讨论】:

              【解决方案8】:

              就像 inflagranti 已经指出的那样 - 唯一 在这里获得真正的 NPE 的方法是将 camObjCoord 设置为 null

              这是一种测试方法:

              // DEBUG Code - start
              if (camObjCoord == null) {
                System.out.println("Who the F*** played with comObjCoord! NPE comeing next.");
              }
              if (i >= camObjCoord.length) {
                System.out.println("There's nothing outside the array. AIOOBE thrown ... now!");
              }
              // DEBUG Code - end
              
              Global.camObjCoord[i] = highx; //null pointer here.
              

              【讨论】:

                【解决方案9】:

                我认为当您使用i = Global.camObjCoord.length; 时,它会设置i = 8000,因此当您尝试推送您的值时,它会将其放在索引8000 上,这对于从0 到7999 的表来说是不可能的。

                试试这个以确保:

                //FRONT
                    System.out.println('Value of index i : '+i);
                    Global.camObjCoord[i] = highx; //null pointer here.
                

                然后,你应该看到 i 的值,看看它是否超出了数组边界。

                希望我有所帮助。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-10-31
                  相关资源
                  最近更新 更多