2011-12-22 83 views
42

我在采访中被问到了这个问题。在不使用main()方法的情况下在控制台上打印消息

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

+3

你如何开始你没有一个主要方法的应用程序? – RoflcoptrException 2011-12-22 14:17:37

+14

我不认为这是一个很好的面试问题。当然,你想测试申请人的问题解决能力,而不是Java的少量使用方面的知识? – 2011-12-22 15:50:17

+14

@CallumRogers +1琐事是最糟糕的问题,任何提出这些问题的人都不配当我的老板。 – 2011-12-22 20:26:20

回答

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

的JVM之前System.exit(0)退出程序开始寻找main()

Ideone link

(注:即使它与JDK 7的javac它不能与它java运行编译,因为它预计main(String[])方法。)

+1

@Roflcoptr'$ java Foo'就像任何其他 – 2011-12-22 14:23:07

+1

@Roflcoptr'java -cp。 Foo就像一个主要的程序。 ;) – 2011-12-22 14:23:37

+0

@Roflcoptr只是编译类并运行'java Foo'它会加载类,打印消息;并且在它开始找到执行的入口点之前我们退出。 – 2011-12-22 14:24:13

10

在一个名为的文件

class Con { 
    String hi = "\n\nHello World\n\n"; 
} 

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

+2

这是可行的,因为'CON'在Windows上有特殊含义,对吧? – 2011-12-22 14:23:44

+3

这也打印了很多其他的东西。顺便说一下,什么是“Con”?它不会将该文件命名为“Con.java”。 +1。 – 2011-12-22 14:32:17

+10

-1为与平台无关的语言中的问题提供平台特定的解决方案是不正确的。 – 2011-12-22 14:37:56

6
class MainMethodNot 
{ 
    static 
    { 
     System.out.println("Hello World"); 
     System.exit(0); 

    } 
} 

因为静态初始化块执行第一次加载类时,我们可以打印出的“Hello World”,而无需编写一个主要方法。使用“System.exit()”命令停止执行。所以,我们防止“主要方法未找到”错误。 这是一个相当棘手的问题

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外部的资源很有用。使用关闭挂钩进行虚拟机退出前必须发生的行为。

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

总之,System.exit立即停止所有程序线程;它不会造成 最终阻止执行,但它会在停止虚拟机之前运行关闭挂接。当关闭虚拟机关闭 时,使用关闭挂钩来终止外部资源。通过调用 System.halt可以暂停虚拟机而不执行关机挂钩,但此方法很少使用。

6

你可以自定义一个类加载器,打印您的留言:

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

(不需要添加类作为参数)

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)

输出:错误:Main方法在类A3不存在,请定义的主要方法为: 公共静态无效的主要(字串[] args)

Reference

2

这是可能的java直到6使用的System.out.println();没有main()。 从Java 7开始,用静态块就无法做到这一点。它仍然会要求主要课程的主要方法。

+0

是的,我在很多地方见过,但我不清楚为什么不在jdk7和更高版本中执行,如果你可以给出更详细的信息,那就太好了。 – 2017-11-28 10:27:39

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,它仍然不能正常工作

0

实际上,它不适用于Java 8的最新更新。您可以称它为根据他们的错误修复,但据我相信我目前的知识,这不能称为错误修复,因为它也导致在java编程中的概念性变化也很少。

0

是的,您可以在不使用main()的情况下将消息打印到控制台。

创建使用JUnit测试,并执行它:

@Test 
public printTest() { 
    System.out.println("myprint"); 
} 
相关问题