我可以不这样做吗?得到一个例外'错误

时间:2014-04-14 00:53:40

标签: java error-handling

获取以下错误:“。”主题“main”java.lang.NullPointerException中的.Exception “

    // Creates 10 accounts
         Account[] AccArray = new Account[10];
// Data fields
        double atmVal;

// Sets each account's discrete id and initial balance to 100
         for (int i=0;i<10;i++){
            AccArray[i].setId(i); // this line is specified in the error
            AccArray[i].setBalance(100);
         }

这个编译好了,但我得到了一个“例外”(不确定那些是什么)。

我根本没有看到什么是错的,至少在这里没有。如果认为是这种情况,我会添加更多代码。

4 个答案:

答案 0 :(得分:1)

当你创建一个对象数组时,你得到的只是一个大小正确但充满null s的数组。您需要通过说new Account()并将其分配给数组来创建每个对象。你甚至可以在同一个循环中完成它。

答案 1 :(得分:1)

您的数组已初始化为包含10个帐户,但它们仍为空。将你的循环改为:

 for (int i=0;i<10;i++){
        ArrArray[i] = new Account(); // whatever constructor parameters are needed
        AccArray[i].setId(i); // this line is specified in the error
        AccArray[i].setBalance(100);
     }

话虽如此,我建议您使用小写名称命名变量(例如accArray)。

答案 2 :(得分:1)

你需要实例化一个Account,假设你有一个空的构造函数Account你会使用这样的东西 -

 for (int i=0;i<10;i++) {
   AccArray[i] = new Account(); // <-- like so.
   AccArray[i].setId(i); // this line is specified in the error
   AccArray[i].setBalance(100);
 }

此外,您应该尝试遵循Java命名约定......所以可能更像是,

Account[] accounts = new Account[10];

 for (int i=0;i<10;i++) {
   accounts[i] = new Account(); // <-- like so.
   accounts[i].setId(i); // this line is specified in the error
   accounts[i].setBalance(100);
 }

答案 3 :(得分:0)

正如其他人所指出的那样,创建Account的新数组并不会实际创建任何Accounts;你必须自己用new来做。 Java 8为您提供了一种很好的方法:

Account[] accounts = new Account[10]; 
Arrays.setAll(accounts, i -> new Account());

setAll的第二个参数是一个lambda表达式,它接受一个整数参数i(正在设置的元素的索引)并将数组元素设置为new Account()。表达式实际上并不使用索引,但如果需要,可以使用使用i的表达式(或块)。