【问题标题】:How to I acess an Attribute in a Class inside an Array?如何访问数组内的类中的属性?
【发布时间】:2017-01-09 12:28:46
【问题描述】:

我想知道如何访问数组内的类中的属性,如下例所示:

import java.util.*;

public class DogTest{
    public class Dog {
        int Quantity;
    }

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        Dog dogs[] = new Dog[15];

        for ( int i = 1;  i <=15; i++){
            System.out.println("Enter number of Dogs ");
            dogs[i].Quantity = scan.nextInt();
        }
    }
}

上面的代码似乎不起作用。顺便说一句,dogs[i].Quantity 源自我的 C++ 知识。

错误信息:

Exception in thread "main" java.lang.NullPointerException

我的结构错了吗?还是有别的办法?

【问题讨论】:

标签: java arrays class attributes


【解决方案1】:

数组从位置 0 开始。因此,在循环结束时,您尝试访问不存在的 dog[15]。本质上,大小为 15 的数组由数字 0-14 访问。这可能是问题所在。 尝试像这样开始循环

for(int i=0;i<15;i++)
{
}

【讨论】:

  • 这是他在解决 NPE 后会遇到的另一个问题,但不是他现在的问题。
【解决方案2】:

首先为自己声明一个类,而不是像你那样作为一个内部类。永远不要给字段首字母大写,这是命名约定。

public class Dog{
int quantity;
}

而且,您的实际问题是,当您声明一个狗数组时,您声明了一个大小数组,在您的情况下为 15,但它不包含任何对象。您刚刚初始化了一个包含 15 个空值并且可以用 Dog 对象填充的数组。因为你得到一个空指针异常。所以,首先你应该用狗对象填充你的数组,像这样:

for (int i = 0; i < dogs.length; i++){
dogs[i] = new Dog(); // calls a constructor for Dog object
}

然后,您可以通过 for 循环访问您的对象以更改字段数量

for(int i = 0; i < dogs.length; i++){
dogs[i].quantity = i;
}

另外,我建议将您的字段设为私有,并使用 getter 和 setter 方法来访问和更改它们的值。

编辑:是的,mikekane 对数组大小的看法是正确的,在您使用您尝试解决的代码解决此问题后,您会得到一个 ArrayIndexOutOfBoundsException...

【讨论】:

  • 我不能使用“dogs[i] = new Dog();”因为没有可以访问 DogTest 类型的封闭实例。必须使用 DogTest 类型的封闭实例来限定分配(例如 x.new A(),其中 x 是 DogTest 的实例)。
  • 你有没有故意让你的类 Dog 成为 DogTest 的内部类?就像班级中的班级......
  • Dog 类在 DogTest 中。 DogTest 是主文件名
  • 好吧,把它放在外面,除非你正在学习内部类是如何工作的,我不认为你是因为你仍然不确定数组在 java 中是如何工作的。
  • 您可以使用static 修饰符来修饰类Dog,例如public static class Dog。但最好为 Dog 类使用其他文件。
猜你喜欢
  • 2013-10-30
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
相关资源
最近更新 更多