如何 运行 来自不同 class 的方法 - JAVA

How to run a method from a different class - JAVA

我正在尝试从我的主 class(Driver) 调用 toh 方法。当我打电话时,它给了我一个空指针异常。如何从 driver class 调用河内的 toh 方法?当我将 classes 合并为一个时,它工作正常,但我需要它们是两个单独的 classes。另外,我在 classes 中包含了我正在使用的全局变量,有必要吗?欢迎任何帮助。谢谢!

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

主要class(driver):

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

尝试初始化 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<>();
    }

您正在 Driver class 中初始化 tower 数组,但是,您尚未在 Hanoi class 中初始化它。

正如我在评论中所说,请不要在不同的 classes 中两次编写全局变量。这是因为不同的 classes 不共享相同的全局变量。 (当我们说全局变量时,我们的意思是它们仅对驱动程序 class 是全局的。要访问这些变量,请使用点运算符)

例如,从 Hanoi class

中删除 N cycletower 声明

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

tower 会变成 Driver.towerN 会变成 Driver.N 等等。

注意:这仅在您的驱动程序 class 为 static 时有效,否则您需要将其作为 object 属性访问。

删除 class 中重复的静态值(DriverHanoi) 然后在不再具有静态值的 class 中,将 class 添加到所有缺失的 classes.

的开头

例如:

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