java - Java中的堆栈溢出异常

标签 java

我是 Thread 新手。我创建了两个类,名称为 A 和 B,如下 -

public class A {

    private B b;

    public void setB(B b) {
        this.b = b;
    }

    synchronized void foo() {
        b.foo();
        System.out.println("Hi A");
    }
}

public class B {

    private A a;

    public void setA(A a) {
        this.a = a;
    }

    synchronized void foo() {
        a.foo();
        System.out.println("Hi B");
    }
}

现在我创建了另外两个实现 Runnable 接口(interface)的类。

public class AThread implements Runnable{
    private A a;
    public AThread(A a){
        this.a = a;
    }
    @Override
    public void run() {
        a.foo();
    }

}

public class BThread implements Runnable {
    private B b;
    public BThread(B a){
        this.b = b;
    }
    @Override
    public void run() {
        b.foo();
    }

}

在main方法中,我编写了以下代码-

public static void main(String args[]) {
        A a = new A();
        B b = new B();
        a.setB(b);
        b.setA(a);
        Runnable r1 = new AThread(a);
        Runnable r2 = new BThread(b);
        Thread t1 = new Thread(r1);
        t1.start();

    }

当我运行此代码时,出现以下异常。

Exception in thread "Thread-0" java.lang.StackOverflowError
    at student.B.foo(B.java:21)
    at student.A.foo(A.java:21)..

谁能解释一下它的路由原因是什么以及如何解决它?

最佳答案

你期望什么?

您在 A 中有一个 foo() 方法,调用 B 中的 foo() 方法,该方法调用A 中的 foo() 方法,依此类推,直到堆栈溢出。

您可以通过避免循环方法调用来解决这个问题。

关于java - Java中的堆栈溢出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44025689/

相关文章:

java - 为什么 HashMap 和 Hashtable 的 put 方法有区别?

java - 如何在vertx中传递系统属性

java - 当我尝试输出数组时为什么会出现异常错误

java - 试图理解 super 通配符在 Java 泛型中的作用

java - 从java中的List中获取元素的范围

java - 如何知道 List.remove() 是否为 "Unsupported"?

java - Angular 2 : PDF file download

java - Spring AOP 代理没有按预期工作

java - 为什么 Class.getSuperclass() 有时会返回 Object.class?

java - 致命 :gpu_data_manager_impl_private. cc(439)] GPU 进程不可用。再见