Java 在知道构造函数的参数之前,如何初始化类对象?

Java 在知道构造函数的参数之前,如何初始化类对象?,java,Java,在我的作业中,我应该创建一个程序,该程序使用一个switch case来访问来自不同类的方法来执行某些操作。第一种情况接收用户输入,该输入在另一个类的构造函数中使用。但是,如果在第一种情况下初始化class对象,则会从其他情况中得到错误,因为该对象可能尚未初始化。如何为包含我的方法的类创建该对象,并且仍然将在switch case中提示的用户输入获取到构造函数中 public class NumberList{ int length; int offset; public Numb

在我的作业中,我应该创建一个程序,该程序使用一个switch case来访问来自不同类的方法来执行某些操作。第一种情况接收用户输入,该输入在另一个类的构造函数中使用。但是,如果在第一种情况下初始化class对象,则会从其他情况中得到错误,因为该对象可能尚未初始化。如何为包含我的方法的类创建该对象,并且仍然将在switch case中提示的用户输入获取到构造函数中

public class NumberList{

int length; int offset;

     public NumberList(int length, int offset){       //constructor
        this.length = length; this.offset = offset;
     }

     public void shift(int a){                      //shift method
        temp = numbers[0];
        for (int i = 0; i < length-1; i++) {
        numbers[i] = numbers[i+1];
        }
        numbers[length - 1] = temp;
      }

因此,如果我在switch情况下创建NumberList对象,我会得到错误“variable not have initialized”,但它必须在那里,这样我才能为构造函数添加用户输入。在切换情况下,如何在仍然能够为构造函数添加信息的情况下初始化对象?

问题在于,在情况2中使用的是numasbrah,但在情况1中创建它

你什么都没有,尽管这迫使你在进入案例2之前先经历案例1

如果有人选择2而没有选择1,那么程序将失败


有很多方法可以解决这个问题,包括在switch语句之外创建一个“default”numasbrah。不过,最简单的方法可能是完全删除案例2,并从案例1中运行它。

问题在于,您在案例2中使用numasbrah,但在案例1中创建它

你什么都没有,尽管这迫使你在进入案例2之前先经历案例1

如果有人选择2而没有选择1,那么程序将失败


有很多方法可以解决这个问题,包括在switch语句之外创建一个“default”numasbrah。不过,最简单的方法可能是完全删除案例2,并从案例1中运行它。

问题是您正在案例1范围内实例化一个类,该范围外的任何对象都无法访问该对象。有关作用域的更多信息

但对于您的直接问题,如果您希望在案例1中创建的对象在案例2中可以访问,只需在案例外部但在开关内部创建(使用默认值创建):

注意


这里的逻辑似乎是错误的。如果用户选择案例2,会有默认的numbasbrah吗

问题是,如果您在case1范围内实例化一个类,那么该范围外的任何对象都无权访问该对象。有关作用域的更多信息

但对于您的直接问题,如果您希望在案例1中创建的对象在案例2中可以访问,只需在案例外部但在开关内部创建(使用默认值创建):

注意


这里的逻辑似乎是错误的。如果用户选择案例2,会有默认的numbasbrah吗

不创建对象就不能使用它,这就是您需要知道的全部!因此,要么在开关案例中声明,而不是在第一个案例中声明,并且必须确保用户在案例二之前选择案例一,要么可以添加一个新的布尔变量,告知对象是否已创建,并在使用该对象的案例中使用它,以确保它已创建!那是我应该做的


或者使用
如果(numbasbrah!=null)
如Eduardo所说

不创建对象就不能使用它,这就是您需要知道的全部!因此,要么在开关案例中声明,而不是在第一个案例中声明,并且必须确保用户在案例二之前选择案例一,要么可以添加一个新的布尔变量,告知对象是否已创建,并在使用该对象的案例中使用它,以确保它已创建!那是我应该做的


或者使用
if(numbasbrah!=null)
就像Eduardo说的那样我认为这里不需要开关格,因为
case 1
在这里总是必需的。例如,如果您将对象定义为null(如@Eduardo Dennis answer)然后您选择
case2
它将给您一个空指针,另一方面,如果您选择
case1
您已经在初始化对象,那么在这两种情况下您都需要对象初始化,为什么不删除
case1
并在
开关
之外定义它,或者最好是删除开关并使用
如果else

我认为这里不需要开关大小写,因为这里始终需要
大小写1
。例如,如果您将对象定义为null(如@Eduardo Dennis answer)然后您选择
case2
它将给您一个空指针,另一方面,如果您选择
case1
您已经在初始化对象,那么在这两种情况下您都需要对象初始化,为什么不删除
case1
并在
开关
之外定义它,或者最好是删除开关并使用
如果否则

这就是全部代码吗?在没有任何数字声明的情况下,NumberList如何编译[]?不,我试图压缩。。。它可能是代码总数的1/8,实际的NumberList总共有6个方法,所以如果用户选择案例2,应该移动什么?会有默认值吗?这些都是代码吗?在没有任何数字声明的情况下,NumberList如何编译[]?不,我试图压缩。。。它可能是代码总数的1/8,实际的NumberList总共有6个方法,所以如果用户选择案例2,应该移动什么?是否会有默认值?这将编译,但如果他们首先选择案例2,仍然会抛出空指针异常。至少您应该对将编译的numbasbrah进行null检查,但如果它们首先选择case2,则仍然会抛出null指针异常。至少你应该检查空值,我有这样做的指示!这就是我为什么这么做的原因confused@TylerWeber启动时,您应该让用户立即插入值作为
public class assignment7{
public static void main(String[] args){

int choice;
do{
System.out.println("input choice");
choice = scan.nextInt();
switch(choice){

        case '1':
            System.out.println("input the array size.");
            size = scan.nextInt();
            System.out.println("input the array offset.");
            offset = scan.nextInt();
            NumberList numbasbrah = new NumberList(size, offset);
            numbasbrah.printInfo();
            break;
        case '2':
            numbasbrah.shift();
            numbasbrah.printInfo();
            break;
        case '3':     //quit
            break;
}while(choice!=3);
}} //end main method
switch(choice){

     NumberList numbasbrah =new NumberList(defaultValue, defaultVale);

        case '1':
            System.out.println("input the array size.");
            size = scan.nextInt();
            System.out.println("input the array offset.");
            offset = scan.nextInt();
            numbasbrah = new NumberList(size, offset);
            numbasbrah.printInfo();
            break;
        case '2':

            numbasbrah.shift();
            numbasbrah.printInfo();

            break;
        case '3':     //quit
            break;
}