【问题标题】:Why static block is not getting executed (if I do not use main() method)?为什么没有执行静态块(如果我不使用 main() 方法)?
【发布时间】:2020-01-27 09:28:20
【问题描述】:

以下是我的程序:

public class Statico {
    static{
        System.out.println("Rarara");
        System.exit(0);
    }
}

当我使用 Java 6 编译和运行程序时:

C:\D>"c:\Program Files\Java\jdk1.6.0_19\bin\java" Statico
Rarara //Output is displayed

它并没有说它需要 Main()(即线程“main”java.lang.NoSuchMethodError: main 中的异常)没有被抛出,因为我们正在使用 System.exit(0)

但是,当我在 Java 8 中执行上述代码时,我们总是会遇到异常:

C:\D>"c:\Program Files\Java\jdk1.8.0_141\bin\java.exe" Statico
Error: Main method not found in class Statico, please define the main method as:
   public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application

这背后的原因是什么?

我们是否也可以在 Java 8 中实现如上所示的 Java 6 类型的功能?

如果是,怎么做?

【问题讨论】:

  • @RObby 这个问题没有回答这背后的原因是什么?异常中未解释差异。它只回答第二部分
  • @RobbyCornelissen 回答 - “要放置在堆栈上的第一个元素本身应该是主线程。我们知道执行控制是如何流动的,甚至重要的是要注意静态块,即使它们包含它们块的局部变量它们永远不会作为激活记录放置在堆栈上而是放在方法区域中。因此从 java 7 开始,JVM 检查堆栈上是否存在主线程记录,然后将控制权交给静态块,之后它按顺序执行所有静态块。而它在 java 6 和更早版本中执行相反的操作”。是吗?
  • @fatherazrael 当然不是。回答者以一种完全荒谬的方式组合了许多技术术语,例如。说明堆栈上的线程或“激活记录”或方法区域中的局部变量。试着忘记你曾经读过……
  • @Holger 够公平的。我太仓促地把那件事联系起来,并道歉。我还将重新提出问题。不太确定OP期望什么样的答案。为什么语言/VM 设计者决定在执行静态块之前首先检查 main 方法?可能只是为了摆脱违反直觉的边缘情况?
  • @RobbyCornelissen 我想这只是启动器的责任,既不是语言也不是 JVM。由于从未指定为可能,因此他们可以随时更改它。

标签: java java-8 main java-6 static-block


【解决方案1】:

仅 Java 1.6 及以下版本支持不带 main 方法的静态块执行。以上不支持,需要main方法。

【讨论】:

    猜你喜欢
    • 2018-10-27
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 2014-08-01
    • 2014-12-16
    相关资源
    最近更新 更多