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

时间:2011-12-22 14:15:11

标签: java

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

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

10 个答案:

答案 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.runFinalizersOnExitRuntime.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)

Reference

答案 9 :(得分:0)

实际上它在java 8的最新更新中不起作用。你可以根据它们把它称为bug修复,但据我相信我目前的知识,这不能被称为错误修复,因为它也导致在java编程中几乎没有概念上的变化。