在静态初始值设定项中返回

这不是有效的代码:

public class MyClass
{
    private static boolean yesNo = false;

    static
    {
        if (yesNo)
        {
            System.out.println("Yes");
            return; // The return statement is the problem
        }
        System.exit(0);
    }
}

这是一个愚蠢的例子,但在静态类构造函数中,我们不能。为什么?这有充分的理由吗?有人对此有更多的了解吗?return;

所以我应该这样做的原因是结束在那里的建设。return

谢谢


答案 1

我认为原因是初始值设定项与字段初始化一起携带(在实例初始值设定项的情况下,与构造函数一起携带)。换句话说,JVM只识别一个初始化静态字段的地方,因此所有初始化 - 无论是否在块中 - 都必须在那里完成。

因此,例如,当您编写类时:

class A {
    static int x = 3;
    static {
        y = x * x;
    }
    static int z = x * x;
}

然后它实际上就像你写了:

class A {
    static int x, y, z;
    static {
        x = 3;
        y = x * x;
        z = x * x;
    }
}

如果您查看拆卸,则可以确认这一点:

static {};
  Code:
   0:   iconst_3
   1:   putstatic       #5; //Field x:I
   4:   getstatic       #5; //Field x:I
   7:   getstatic       #5; //Field x:I
   10:  imul
   11:  putstatic       #3; //Field y:I
   14:  getstatic       #5; //Field x:I
   17:  getstatic       #5; //Field x:I
   20:  imul
   21:  putstatic       #6; //Field z:I
   24:  return

因此,如果您在静态初始值设定项中间的某个位置添加“return”,它也会阻止计算 z。


答案 2
  • 程序流始终可以结构化为无需 .(在您的示例中,放入子句将实现所需的结果)returnSystem.exit(0)else

  • 在你真正需要它的时候,你可以在静态方法中移动代码,并从初始值设定项中调用它:

.

static {
    staticInit();
}

private static void staticInit() {
    if (yesNo) {
        System.out.println("Yes");
        return;
    }
    System.exit(0);
}

请注意,这不是一个静态构造函数,而是一个静态初始值设定项。没有任何东西被构造出来。