【问题标题】:Error in Creating Java array with Multiple Data Types创建具有多种数据类型的 Java 数组时出错
【发布时间】:2017-12-19 14:46:12
【问题描述】:

有人可以解释为什么它不起作用吗?错误位于obj[0][0]=1;。它说 GPA 不能转换为 int,String 变量赋值 s 也是如此。

public class GPA {        
        public String s;
        public int n;
        public GPA[][] a;

        //constructor
        public GPA(GPA[][] a){}    

        public static void main(String[] args) {
            GPA[][] obj=new GPA[2][2];
            obj[0][0]=1; //error here
        }
}

【问题讨论】:

  • 是的,错误是正确的。你不能那样转换。
  • 在java中,一个数组中不能有多种数据类型。如果将数组声明为 GPA 对象数组,则它必须只包含 GPA 对象。如果将数组声明为 int 数组,则它必须只包含 int 的。
  • @SureshAtta 那我该怎么做呢?
  • @KylonTyner 我确实创建了 obj 作为 GPA 对象。
  • @Maya 是的,你做到了。但是,当您调用“obj[0]=1;”时,您正试图在 GPA 数组中存储一个 int。相反,您需要执行“obj[0] = new GPA(string, int);”之类的操作其中 string 和 int 是填充值。

标签: java arrays class oop object


【解决方案1】:

obj 是一个 GPA 对象数组。 obj[0] = 1 表示您将该数组的第一个元素分配给 intvalue。它应该是 GPA 类型的 object。 你可以这样做

obj[0] = new GPA("John Doe", 6);

我还建议使用 Java 约定,通过 setter()s 等公共方法将 variables 设为私有和 set()

问题发生了变化,使得答案变得无关紧要。

【讨论】:

  • 我会推荐 lombok @Data,但这有点无关紧要,因为即使是虚拟构造器也没有任何意义
【解决方案2】:

它不起作用并给你编译时错误,因为 GPA 是类类型,你正在尝试为它分配 int 值。

你有两个选择。

选项 1:

GPA[] obj = new GPA[4];
obj[0] = new GPA();
obj[0].n = 1;

选项 2:

您可以将 GPA 的成员设为私有并使用 setter 来设置值。下面是例子。

public class GPA {

    private String s;
    private int n;
    private GPA[] a;

    public GPA() {}

    public GPA(GPA[] a) {}

    public String getS() {
        return s;
    }

    public void setS(String s) {
        this.s = s;
    }

    public int getN() {
        return n;
    }

    public void setN(int n) {
        this.n = n;
    }

    public GPA[] getA() {
        return a;
    }

    public void setA(GPA[] a) {
        this.a = a;
    }

}

然后使用 setter 设置。

obj[0].setN(1);

将您的成员公开并不是一种好的编程习惯。始终建议使用 setter。

【讨论】:

  • 在这两种情况下,第一行不会出现 NullPointerException 吗?
【解决方案3】:

您实际上正在尝试将 int 和/或字符串分配给期望 GPA 类对象的变量。 你不想做吗

obj[0].n=1;
obj[0].s="text;"

【讨论】:

  • 那不会在您的第一行给出NullPointerException 吗?
  • 好吧,如果你把它与提供的源代码联系起来,npe 将是最少的问题,我的意思是更多地为它们指定的变量正确分配值。
【解决方案4】:

对于对象数组,您始终必须首先在该位置的对象上创建。否则你总是会得到一个NullPointerException。 所以你需要的是这样的

 GPA[][] obj = new GPA[2][2];
obj[0][0] = new GPA();
obj[0][0].s="text";
obj[0][0].n=1;
...

每个位置都以此类推。

【讨论】:

    【解决方案5】:

    Java 数组是同构的(Javascript 数组是异构的)。这意味着您只能存储创建数组时使用的元素类型。

    ex: `int intArray[];` //We can store only int type elements(it also accepts Integer etc.. types but java converts to int then store it)
    

    现在,对public GPA[] a; 应用相同的规则,这里 a 是 GPA 类型的数组。所以它只接受 GPA 类型的对象。

    也就是说,你可以像下面这样存储值

    a[0] = 新 GPA("nameHere", 6);

    如果我想存储一个字符串或一个整数,一次一个(我有 制作学生姓名与GPA的表格),我该怎么做?

    解决此要求的一种方法是,使用构造函数或 setter 方法分配变量。

    GPA[] obj = new GPA[2];
    
    obj[0] = new GPA("first", 6); // here you need to create a new constructor
    or 
    obj[1] = new GPA(); // Here default constructor will work and you need to have setter methods
    
    obj[1].setName("second");
    

    希望对您有所帮助...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 2013-08-04
      • 2014-04-13
      相关资源
      最近更新 更多