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

时间:2015-04-17 15:49:59

标签: java

在我的任务中,我应该创建一个程序,该程序使用switch case来访问来自不同类的方法来执行某些操作。第一种情况是用户输入,该输入用于另一个类的构造函数。但是如果我在第一种情况下初始化类对象,我会从其他情况中获得错误,因为该对象可能尚未初始化。我如何为具有我的方法的类创建该对象,并仍然将在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;
      }

说这是我的类,有一个移位数组元素的方法。我的主要方法是

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

所以,如果我在切换情况下创建NumberList对象,我得到错误“变量可能尚未初始化”,但它需要在那里,所以我可以添加构造函数的用户输入。如何初始化对象,同时仍然能够在开关案例中添加构造函数的信息?

4 个答案:

答案 0 :(得分:3)

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

在进入案例2之前,你没有任何东西可以强制你通过案例1。

如果有人在没有选择1的情况下选择2,则程序将失败。

有许多方法可以解决这个问题 - 包括在switch语句之外创建一个“默认”numasbrah。可能最简单的只是完全删除case 2并从案例1中进入它。

答案 1 :(得分:1)

问题是您要在case 1范围内实例化一个类,该范围之外的任何内容都不能访问该对象。有关范围的更多信息here

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

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;
}

注意

这里的逻辑似乎有缺陷。如果用户选择案例2会是什么,是否会有默认的numbasbrah?

答案 2 :(得分:0)

你不能在不创建对象的情况下使用它,这就是你需要知道的全部内容!所以要么你在开关的情况下声明它不是在第一种情况下,你必须确保用户将在案例2之前找到一个案例,或者你可以添加一个新的布尔变量来告诉对象是否已经是否创建并在使用该对象的情况下使用它以确保它已被创建!这就是我要做的。

或者使用if(numbasbrah != null)作为Eduardo说

答案 3 :(得分:0)

我认为这里不需要切换大小写,因为这里总是需要case 1步骤。例如,如果你将对象定义为null(如@Eduardo Dennis的回答)然后你选择case 2它会给你一个空指针,另一方面,如果你chosse case 1你已经在初始化对象,所以在这两种情况下都需要对象初始化,为什么不删除case 1并在switch之外定义它最好的方法是删除开关并使用if else