gpt4 book ai didi

java - 实例初始化程序中的 StackOverflowError

转载 作者:搜寻专家 更新时间:2023-11-01 01:49:45 24 4
gpt4 key购买 nike

这个问题比较理论化。所以我有下面这组代码:

public class Test {

public static void main(String[] args) {
Test test = new Test();
}

{
System.out.println("Instance execution");
}
}

它编译并打印“Instance Execution”。但是当我尝试以这种方式执行其他方法时:

public class Test {

public static void main(String[] args) {
Test test = new Test();
}

{
System.out.println("Instance execution");
}

private void anotherMethod() {
System.out.println("Method execution");
}

{
Test test = new Test();
test.anotherMethod();
}
}

它给我这个错误:

Exception in thread "main" java.lang.StackOverflowError
at Test.<init>(Test.java:15)

我完全相信这个错误有最简单的解释,但我的问题是,是构造函数引发了这个错误吗?或者只有系统方法可以这样执行?可执行实例初始化程序的整个方法对我来说是非常新的,所以任何帮助将不胜感激。谢谢。

最佳答案

这个:

{
Test test = new Test();
test.anotherMethod();
}

是一个实例初始化 block 。它会在您每次创建 Test 实例时运行。在其中,您正在...创建一个新的 Test 实例,它自然会触发该 block ,然后创建一个新的 Test 实例,该实例会触发该 block ...你明白了。

is it the constructor that's throwing this error?

是实例初始化,是的。事实上,在幕后,编译器处理实例初始化 block 的方式是将该代码逐字复制到类中每个构造函数的开头(包括默认构造函数,如果您不提供默认构造函数),就在对 super 的任何调用之后(如果没有明确的调用,则为默认调用)。所以你可以说这是构造函数抛出错误,即使概念上,它是实例初始化,与构造函数本身不同。

Or only System methods can be executed this way?

不确定“系统方法”是什么意思,但问题是初始化程序 block 是按实例运行的。如果您希望它只运行一次,在类初始化时,您可以使用 static 初始化 block :

public class Test {

public static void main(String[] args) {
Test test = new Test();
}

{
System.out.println("Instance execution");
}

private void anotherMethod() {
System.out.println("Method execution");
}

static // <==================
{
System.out.println("Class initialization"); // ***
Test test = new Test();
test.anotherMethod();
}
}

输出:

Class initializationInstance executionMethod executionInstance execution

(We see "Instance execution" twice because there's one new Test in main, and another in the static initializer block.)

But really, the simplest thing is to put the call to anotherMethod in main:

public class Test {

public static void main(String[] args) {
Test test = new Test();
test.anotherMethod();
}

{
System.out.println("Instance execution");
}

private void anotherMethod() {
System.out.println("Method execution");
}
}

哪些输出

Instance executionMethod execution

关于java - 实例初始化程序中的 StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43329474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com