在控制台上打印消息而不使用main()方法

我在接受采访时被问到了这个问题。

如何在不使用main()方法的情况下在控制台上打印消息?


public class Foo {
    static {
         System.out.println("Message");
         System.exit(0);
    } 
}

在jvm开始查找main()之前, System.exit(0)退出程序。

Ideone链接

(注意:即使它用JDK 7的javac它也不能用它的java运行,因为它需要一个main(String[])方法。)


public final class Main {
    static {
        System.out.println("Hello World");
        System.exit(0);
    }
}

一旦类在main();之前加载,静态块将首先执行main(); 方法被调用,因此在调用main()之前, System.exit(0)启动VM关闭。

System.exit方法会暂停当前线程的执行以及其他所有其他线程的执行。 当调用System.exit ,虚拟机在关闭之前执行两个清理任务。

首先,它执行已经用Runtime.addShutdownHook注册的所有关闭钩子。 这对释放VM外部的资源很有用。 使用关闭挂钩进行虚拟机退出前必须发生的行为。

调用System.exit时由VM执行的第二个清理任务涉及终结器。 如果已调用System.runFinalizersOnExit或其恶意双胞胎Runtime.runFinalizersOnExit ,则虚拟机将在尚未完成的所有对象上运行终结器。 这些方法很久以前就被弃用了,理由很充分。 永远不要因为任何原因调用System.runFinalizersOnExitRuntime.runFinalizersOnExit :它们是Java库中最危险的方法之一。 调用这些方法可能会导致终结器在活动对象上运行,而其他线程正在同时操作它们,从而导致不稳定的行为或死锁。

总之, System.exit立即停止所有程序线程; 它不会导致finally块执行,但它会在停止虚拟机之前运行shutdown hook。 VM关闭时使用关闭挂钩来终止外部资源。 通过调用System.halt可以暂停虚拟机而不执行关闭挂钩,但这种方法很少使用。


在一个名为A.java的文件中

class Con {
    String hi = "nnHello Worldnn";
}

你只需要在Windows上编译程序。 不运行它。 :-P

链接地址: http://www.djcxy.com/p/20595.html

上一篇: Printing message on Console without using main() method

下一篇: Are fields initialized before constructor code is run in Java?