0

好的,所以我正在为我的 java 课程部分做作业,我坚持的是:

“实施一项 createparliamentMembers 操作,这将创建一个有 80 名成员的特定议会。”

所以我已经用它的方法创建了构造函数。这就是我编写使用构造函数创建对象的操作的方式:

public static void createparliamentMembers(){
    Member[] array = new Member[75];
    for(int i = 0; i < array.length; i++)
       {
        if (i < 35) array[i] = new Member(i, "Blue");
        else array[i] = new Member(i,"Red");
        }

    Legislator[] leg = new Legislator[3];
    for (int i = 0 ; i < leg.length; i++){
        leg[i] = new Legislator(i, "Impartial");
    }

    Leader[] lead = new Leader[2];
    for (int t = 0; t < lead.length; t++){
        if (t < 1) lead[t] = new Leader(1, "Red");
        else lead[t] = new Leader(2, "Blue");

    }

问题是数组和对象似乎只存在于创建它们的操作中,当我尝试运行创建的对象的方法时,它们不起作用,因为驱动程序类无法识别数组。另一方面,当我将它用作驱动程序的正常部分时,它运行良好并且对象的所有方法都正常工作。

编辑:好的,即使我在 createparliamentMembers(); 之外初始化它们,我仍然遇到与以前相同的问题;

以下代码是我用来测试方法的驱动程序:它一直说有一个:

Driver.main(Driver.java:11) 的线程“main”java.lang.NullPointerException 中的异常,代码数组 [1].FlipCoin(); 因为我试图从创建的对象中使用方法 Flipcoin,但它不起作用。

public static void main(String [] args) {
Commands.createparliamentMembers();
array[1].FlipCoin();
}
4

3 回答 3

0

您的数组仅在本地定义,这意味着它们与该方法一起生存和死亡。当您的方法完成时,它们会被内存耗尽。

解决方案是将这些数组定义为实例变量。我的意思是,您需要为您的类定义数组,然后在您的方法中使用它们:

class someClass {
    int[] myArray = new int[2];

    private void someMethod() {
        myArray[0] = 3;
        myArray[1] = //whatever
    }
 }
于 2013-07-15T02:08:24.187 回答
0

你在评论中说:

我确实有一个议会类,它是独立的,包含议会成员的方法和构造函数。上述方法位于一个名为 Commands 的单独类中。我不完全理解“您可以在创建成员时将成员添加到议会对象吗?” 议会不是一个对象,而是一个包含我想要创建的议会成员的构造函数和方法的类。

议会还不是一个对象,但你实际上应该创建一个,事实上你的指示告诉你:"which will create the particular Parliament with 80 members..."。您需要告诉我们更多关于您的程序结构和具体要求的信息,但我建议:

  • 首先在 createParliamentMembers 方法中创建一个议会对象,并将其命名为议会。
  • 然后以该方法创建议会成员。
  • 在创建这些成员时,将它们添加到议会对象议会。
  • 在方法结束时返回议会变量。
  • 这意味着您的 createParliamentMembers 方法的签名必须更改,以便将void其写入返回Parliament对象而不是返回。
  • 在 main 方法中调用该方法时,将它返回的内容分配给 main 方法中的议会变量。
于 2013-07-15T03:06:03.140 回答
0

看起来您正在编写工厂方法。像这样为议会创建一个构造函数:

public Parliament(Member[] members, Legislator[] legislators, Leader[] leaders) {
    // do whatever with what's passed in
}

然后更改您的方法以返回一个议会对象,并在该方法中将您初始化的数组传递给议会构造函数,如下所示:

// same code as your except the last line
public static Parliament createParliament(){
    Member[] array = new Member[75];
    for(int i = 0; i < array.length; i++)
       {
        if (i < 35) array[i] = new Member(i, "Blue");
        else array[i] = new Member(i,"Red");
        }

    Legislator[] leg = new Legislator[3];
    for (int i = 0 ; i < leg.length; i++){
        leg[i] = new Legislator(i, "Impartial");
    }

    Leader[] lead = new Leader[2];
    for (int t = 0; t < lead.length; t++){
        if (t < 1) lead[t] = new Leader(1, "Red");
        else lead[t] = new Leader(2, "Blue");

    }
    return new Parliament(array, leg, lead);
}
于 2013-07-15T03:57:43.007 回答