如何从不同的类运行方法 - JAVA

时间:2017-10-07 02:09:56

标签: java class static-variables method-call towers-of-hanoi

我试图从我的主类(Driver)调用toh方法。当我进行调用时,它给了我一个空指针异常。如何从驱动程序类调用河内的toh方法?当我将这些类合并为一个时它工作正常,但我需要它们是两个独立的类。另外,我在两个类中包含的全局变量是必要的吗?欢迎任何帮助。谢谢!

public class Hanoi {

 public static int N;
 public static int cycle = 0;
 /* Creating Stack array  */
 public static Stack<Integer>[] tower = new Stack[4]; 
 public static void toh(int n)
 {
     for (int d = n; d > 0; d--)
         tower[1].push(d);
     display();
     move(n, 1, 2, 3);         
 }
 /* Recursive Function to move disks */
 public static void move(int n, int a, int b, int c)
 {
     if (n > 0)
     {
         move(n-1, a, c, b);     
         int d = tower[a].pop();                                             
         tower[c].push(d);
         display();                   
         move(n-1, b, a, c);     
     }         
 }
 /*  Function to display */
 public static void display()
 {

     System.out.println("T"+cycle + "  Pillar 1  |  Pillar 2  |  Pillar 3");
     System.out.println("-------------------------------------");
     for(int i = N - 1; i >= 0; i--)
     {

         String d1 = " ", d2 = " ", d3 = " ";
         try
         {
             d1 = String.valueOf(tower[1].get(i));
         }
         catch (Exception e){
         }    
         try
         {
             d2 = String.valueOf(tower[2].get(i));
         }
         catch(Exception e){
         }
         try
         {
             d3 = String.valueOf(tower[3].get(i));
         }
         catch (Exception e){
         }

         System.out.println("  "+d1+"         |  "+d2+"         |    "+d3);
     }
     System.out.println("\n");
     cycle++;
 }
}

主类(司机):

public class Driver{
 public static int N;
 public static int cycle = 0;
 /* Creating Stack array  */
 public static Stack<Integer>[] tower = new Stack[4]; 
 public static void main(String[] args)
 {
   int num = 0;
     Scanner scan = new Scanner(System.in);
     tower[1] = new Stack<>();
     tower[2] = new Stack<>();
     tower[3] = new Stack<>();
     /* Accepting number of disks */         

     while(num <=0){
         System.out.println("Enter number of disks(greater than 0):");
         num = scan.nextInt();
     }
     N = num;
     Hanoi.toh(num);
  }
 }

3 个答案:

答案 0 :(得分:0)

尝试初始化tower数组,如下所示:

public static Stack<Integer>[] tower;

public static void toh( int n )
{
    tower = new Stack[n];
    for ( int d = 0 ; d < n ; d++ )
    {
        tower[d]=new Stack<>();
    }

答案 1 :(得分:0)

您正在tower课程中初始化Driver数组,但是,您尚未在Hanoi课程中对其进行初始化。

正如我在评论中所说,请不要在不同的类中写两次全局变量。这是因为不同的类不共享相同的全局变量。 (当我们说全局变量时,我们的意思是它们只是Driver类的全局变量。要访问这些变量,请使用点运算符)

例如,摆脱N

中的cycle towerHanoi声明

然后使用dot运算符访问这些变量。

tower将变为Driver.towerN将变为Driver.N,依此类推。

注意:仅当您的驱动程序类为static时才有效,否则您需要将其作为object属性进行访问。

答案 2 :(得分:0)

删除班级中的重复静态值(DriverHanoi) 然后在不再具有静态值的类中将该类添加到所有缺少的类的开头。

例如:

class A{
    public static int MyVar;
    public int aMethod(){
        return MyVar-2;
    }
}
class B{
    public static int MyVar;
    public void bMethod(){
        ++MyVar;
    }
}

↓到↓

class A{
    public static int MyVar;
    public int aMethod(){
        return MyVar-2;
    }
}
class B{
    public void bMethod(){
        ++A.MyVar;
    }
}