我试图从我的主类(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);
}
}
答案 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
tower
和Hanoi
声明
然后使用dot
运算符访问这些变量。
tower
将变为Driver.tower
而N
将变为Driver.N
,依此类推。
注意:仅当您的驱动程序类为static
时才有效,否则您需要将其作为object
属性进行访问。
答案 2 :(得分:0)
删除班级中的重复静态值(Driver
或Hanoi
)
然后在不再具有静态值的类中将该类添加到所有缺少的类的开头。
例如:
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;
}
}