2015-04-17 56 views
0

在我的任务中,我应该创建一个程序,该程序使用开关盒访问不同类的方法来执行某些操作。第一种情况需要用户输入,并且该输入用于其他类的构造函数中。然而,如果我在第一种情况下初始化类对象,我从其他情况下得到错误,因为对象可能尚未初始化。我如何为拥有我的方法的类创建该对象,并仍然将开关案例中提示的用户输入获取到构造函数中?我知道构造函数的参数之前如何初始化类对象?

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对象,但它需要有这样我就可以在添加用户输入构造函数。我如何初始化对象,同时仍然能够在开关情况下添加构造函数的信息?

+0

这是所有的代码? NumberList如何在没有任何数字声明[]的情况下编译? –

+0

不,我试图压缩......它可能是总代码的1/8,实际的NumberList总共有6种方法 –

+0

所以如果用户选择案例2,那么应该移动什么?那里会有默认值吗? –

回答

3

的问题是,你正在使用numasbrah的情况下,2但如果创建它1.

你有什么尽管这是迫使你之前进入的情况下要经过的情况下1 2

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

有很多方法可以解决这个问题 - 包括在switch语句之外创建一个“default”numasbrah。可能最简单的方法就是将case 2完全删除,并从案例1中将其彻底移除。

+0

我有指示要这样做!这就是为什么即时通讯如此困惑 –

+0

@TylerWeber在启动时,你应该让用户立即插入值,因为用户仍然必须选择案例1才能运行该程序,使案例2毫无意义1没有案件1 – Joseph118

+0

我的问题是一个由计算机自动分级的学校作业,它被编程为首先按下第一个案例,然后输入信息 –

1

问题是您正在实例化案例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?

+0

这将编译但仍然抛出空指针异常,如果他们先选择案例2。至少你应该空检查numbasbrah –

+0

这将创建一个空错误......这意味着他回到了1 .. – Joseph118

0

如果不创建对象,就不能使用对象,这就是你需要知道的一切!因此,无论您是否在第一种情况下都在switch case中声明它,并且您必须确保用户将在案例2之前处理案例1,或者您可以添加一个新的布尔变量来告知对象是否已经创建与否,并在使用该对象的情况下使用它,以确保它已被创建!这就是我会做的。

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

+0

你能解释你将如何使用布尔值?它会允许程序编译并运行,同时保留“NumberList numbasbrah = new NumberList(size,offset);”在第一种情况下? –

+0

当你创建你的'NumberList'时赋值为一个布尔值,在第二种情况下,添加'if(theBoolean)'然后执行你所需要的操作,并在else语句中向用户表明该对象还没有被创建 –

0

我想是因为case 1总是需要一步这里开关的情况下在这里不需要。例如,如果您将对象定义为空(如@Eduardo Dennis答案),然后您将它们指定为case 2,则它将为您提供空指针,另一方面,如果您已经初始化对象,则在两种情况下都需要对象初始化为什么不删除case 1并将其定义在switch之外或者最好是删除开关并使用if else

相关问题