null指针异常的2D建议

时间:2014-03-18 06:24:45

标签: java arrays nullpointerexception multidimensional-array

我提前道歉,我是一个java菜鸟。

我在声明中有这个

if(a==0 && b<4)
{
value = ((elev[a][b]-elev[a+1][b])*0.00001* double "variable" ) ; 
}

所以我的主要问题是以下......

(elev[a][b]-elev[a+1][b])

返回一个int值(假设数组已初始化并使用int值填充,而对于== 0且b <4,则没有任何引用为空。

如果这很愚蠢,请提前抱歉。请不要发表评论,但我们将不胜感激。我还没有完成很多这样的java东西。

当我填充数组时,我打印了它的内容,以确保我正确填充,一切都应该是...

唉,无论在哪里(elev [a] [b] - elev [a + 1] [b])首次被引用,我都会得到一个空指针错误....但我知道这些值是放在那里的。

下一个问题。当我填充数组时,如果我想引用这些值,

while(input.hasNextInt())
           {
            elev[i][j] = input.nextInt(); <-- this is how i was doing it 
                        }

of elev [] [] ...我需要说

elev[i][j] = new input.nextInt();

或者我是如何做得足够的。当我从文件中填充ArrayList时,我必须使用&#34; new&#34;前缀所以我试图找出为什么我会在那里得到一个null。

就像我说的那样,我在从文件中读取数据后打印出来并打印出所有内容都取而代之。

谢谢大家。

修改 对不起,为了简单起见,我没有提供实际的代码&#34; value&#34;

实际上是

double randKg = getRandKg(avgKgNitrogen[z]); 
 double gradient = 0.00001

double under = ((randKg *(elev[a][b] - elev[a+1][b]) * gradient));

第二次修改

这是我填充的代码。

try{
                File file = new File(filename);
                Scanner input = new Scanner(file);

                int rows = 30;
                int columns = 10;
                int elev[][] = new int[30][10];

                for(int i = 0; i < rows; ++i){
                    for(int j = 0; j < columns; ++j)
                    {
                        while(input.hasNextInt())
                        {
                            elev[i][j] = input.nextInt();
                        }
                    }

                }
                input.close();
            }
            catch (java.io.FileNotFoundException e) {
                System.out.println("Error opening "+filename+", ending program");
                System.exit(1);

            }

第3次修改 所以我在这里得到空指针.....

(elev[a][b] - elev[a+1][b]) > 0 ) 

这就是我最初问的原因。我在填充之前已经打印过阵列,而且一切都在应该的位置。

2 个答案:

答案 0 :(得分:0)

您将获得空指针异常,因为double“variable”不指示任何整数或双精度值。编译器只是试图将String'变量'转换为double,这是不可能的。所以,尝试从“变量”中删除双引号。此外,您尚未声明值变量的数据类型。

答案 1 :(得分:0)

忽略代码中的其他问题(由其他答案涵盖),这是关于您的实际问题:

如果代码

if(a==0 && b<4) {
    value = (elev[a][b] - elev[a+1][b]); 
}

NullPointerException崩溃,表示elev为空。假设ab的类型为int,则没有其他方法可以生成该异常(数组超出范围的异常会有所不同)。原因有两种选择:

  1. 在执行int elev[][] = new int[30][10];之前执行上述代码,以便elev仍具有初始空值。
  2. 崩溃行中的
  3. elev与问题中显示的初始化中的elev不同。
  4. 在您的代码中,它似乎是2.您在初始化中创建本地elev。它超出范围而被遗忘。您可能应该在方法中使用此初始化行:

    elev = new int[30][10];
    

    然后你应该在方法中使用一个类成员变量而不是局部变量:

    private int[][] elev;