如何 运行 来自不同 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
cycle
和 tower
声明
然后使用 dot
运算符访问这些变量。
tower
会变成 Driver.tower
而 N
会变成 Driver.N
等等。
注意:这仅在您的驱动程序 class 为 static
时有效,否则您需要将其作为 object
属性访问。
删除 class 中重复的静态值(Driver
或 Hanoi
)
然后在不再具有静态值的 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;
}
}
我正在尝试从我的主 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
cycle
和 tower
声明
然后使用 dot
运算符访问这些变量。
tower
会变成 Driver.tower
而 N
会变成 Driver.N
等等。
注意:这仅在您的驱动程序 class 为 static
时有效,否则您需要将其作为 object
属性访问。
删除 class 中重复的静态值(Driver
或 Hanoi
)
然后在不再具有静态值的 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;
}
}