簡體   English   中英

運行程序時出現錯誤

[英]Getting error when running the program

我有以下代碼:

ClassA.java

public class ClassA {
    static boolean isDone = false;
    public static void main(String[] args) {
        System.out.println("In class A.");
        if (!isDone) {
            new ClassB();
            isDone = true;
        }
    }
}

ClassB.java

public class ClassB {
    ClassB () {
        ClassA.main(null);
    }
}

運行程序時,我得到以下輸出:

In class A.
In class A.
Exception in thread "main" java.lang.StackOverflowError
    at sun.nio.cs.SingleByte.withResult(Unknown Source)
    at sun.nio.cs.SingleByte.access$000(Unknown Source)
    at sun.nio.cs.SingleByte$Encoder.encodeArrayLoop(Unknown Source)
    at sun.nio.cs.SingleByte$Encoder.encodeLoop(Unknown Source)
    at java.nio.charset.CharsetEncoder.encode(Unknown Source)
    at sun.nio.cs.StreamEncoder.implWrite(Unknown Source)

它正在打印“ A級”。 符合預期,但是為什么我會得到棧溢出錯誤?

您在調用ClassB()之后設置標志isDone 因此,將發生無限遞歸調用,這將在到達內存時導致StackOverFlowError

在調用ClassB();之前設置標志( isDone ClassB();

如下所示:

if (!isDone) {
    isDone = true;
    new ClassB();
}

您的代碼中有一個無限的方法調用鏈,這會導致StackOverflowError。 這是因為您正在從ClassB的構造函數調用ClassA的main方法。 您的main方法中的if塊將永遠無法完成。 代碼中的邏輯錯誤是在創建ClassB實例之后而不是在此之前設置flag( isDone )。

嘗試將if塊從

 if (!isDone) {
         new ClassB();
         isDone = true;
  }

 if (!isDone) {
         isDone = true;
         new ClassB();
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM