我在接受采访时被问到这个问题。
如何在不使用main()
方法的情况下在控制台上打印消息?
答案 0 :(得分:63)
public class Foo {
static {
System.out.println("Message");
System.exit(0);
}
}
jvm开始寻找System.exit(0)
之前main()
退出程序
(注意:这仅适用于java 6.即使它使用JDK 7的javac
进行编译,也无法使用java
运行,因为它需要main(String[])
方法。)子>
答案 1 :(得分:12)
public final class Main {
static {
System.out.println("Hello World");
System.exit(0);
}
}
在调用main();
方法之前加载类时,首先执行静态块,因此在调用main()
之前,System.exit(0)
会启动VM关闭。
System.exit
方法停止当前线程的执行,其他所有线程都停在其轨道上。当调用System.exit
时,虚拟机在关闭之前执行两个清理任务下。
首先,它执行所有已注册Runtime.addShutdownHook
的关闭挂钩。这对于释放VM外部的资源很有用。使用shutdown hooks来解决在VM退出之前必须发生的行为。
调用System.exit
时VM执行的第二个清理任务
关注终结者。如果System.runFinalizersOnExit
或其邪恶的双胞胎
已调用Runtime.runFinalizersOnExit
,VM运行终结器
所有尚未最终确定的对象。这些方法已被弃用了很长时间
时间以前,有充分的理由。切勿致电System.runFinalizersOnExit
或
Runtime.runFinalizersOnExit
因任何原因:他们是最多的
Java库中的危险方法。调用这些方法可能导致终结器在活动对象上运行,而其他线程同时进行操作
他们,导致不稳定的行为或僵局。
总之,System.exit
会立即停止所有程序线程;它不是
导致finally块执行,但它会在暂停之前运行shutdown hooks
VM。当VM关闭时,使用shutdown hooks终止外部资源
下。可以在不通过调用执行关闭挂钩的情况下暂停VM
System.halt
,但很少使用此方法。
答案 2 :(得分:11)
在名为A.java
class Con {
String hi = "\n\nHello World\n\n";
}
您只需在Windows上编译该程序即可。不运行它。 :-P
答案 3 :(得分:7)
您可以定义打印邮件的自定义类加载器:
public class MyClassLoader extends ClassLoader {
public MyClassLoader(ClassLoader other) {
super(other);
System.out.println("Hi there");
System.exit(0);
}
}
然后运行java命令:
java -Djava.system.class.loader=MyClassLoader
(不需要添加类作为参数)
答案 4 :(得分:6)
class MainMethodNot
{
static
{
System.out.println("Hello World");
System.exit(0);
}
}
因为静态初始化程序块是在首次加载类时执行的,所以我们可以打印出“Hello World”而无需编写main方法。使用“System.exit()”命令停止执行。因此,我们防止“找不到主要方法”错误。 这是一个非常棘手的问题
答案 5 :(得分:3)
直到java 6才有可能使用System.out.println();没有main()。 从java 7开始,不可能使用静态块。它仍然会在主类中要求主要方法。
答案 6 :(得分:2)
如果您也不想使用静态块,可以按照以下方式进行操作
public class NoMain {
private static final int STATUS = getStatus();
private static int getStatus() {
System.out.println("Hello World!!");
System.exit(0);
return 0;
}
}
但请注意,这是针对Java 6版本的。它的not working in Java 7据说在Java 8中得到支持。我尝试使用JDK 1.8.0_77-b03,但仍无法正常工作
答案 7 :(得分:2)
是的,您可以在不使用main()的情况下将消息打印到控制台。
使用JUnit创建测试并执行它:
$roles = AllUserRoles::find()->all();
$userdata = [];
foreach ($roles as $role) {
$name = array('name' => $role["description"]);
$trucks = TblTrucks::find()->where(['role_id'=>$role["id"]])->count();
$totals = array('y'=>$trucks);
array_push($userdata, array($name => $totals));
}
return json_encode($userdata);
答案 8 :(得分:1)
是的,其中一种方法是静态阻止,但在以前版本的JDK中,不在JDK 1.7中。
class Withoutmain{
static{
System.out.println("Message: Your message can be print on console without main() method");
System.exit(0);
}
}
输出:消息:您的消息可以在没有main()方法的控制台上打印(如果不是JDK7)
输出:错误:在A3类中找不到主要方法,请将主方法定义为: public static void main(String [] args)
答案 9 :(得分:0)
实际上它在java 8的最新更新中不起作用。你可以根据它们把它称为bug修复,但据我相信我目前的知识,这不能被称为错误修复,因为它也导致在java编程中几乎没有概念上的变化。