2013-07-12 151 views
3

我一直在为Java 7中的OCP考试做准备。我正在阅读的书中,我遇到了一些我完全不理解的东西。Java中的后台进程

即,

如果JVM通过IDE间接调用,或者如果JVM从 调用的后台进程,则该方法调用System.console()将 失败并返回空。

在什么情况下以及如何从后台进程调用JVM?有人可以详细说明吗? 此致

回答

3

假设您在UNIX系统上,并且运行一个程序可以询问两个操作数并生成它们的总和。如果你调用它为:

/home/ucas> java -jar add.jar 
Please enter the first summand: 
42 
Please enter the second summand: 
17 
The sum is 59. 

现在假设你在后台运行它:

/home/ucas> java -jar add.jar & 
java.lang.NullPointerException at Add.main(Add.java:17) 
.... 

在Add.java看,你看:

Console console = System.console(); // 16 
Reader reader = console.reader(); // 17 

过程从分离终端,所以console将是null。堆栈跟踪将打印到标准错误,该错误不会重定向。

1

这是因为每docs

无论是虚拟机具有控制台取决于底层平台,也取决于在其中虚拟机被调用的方式。如果虚拟机从交互式命令行启动而不重定向标准输入和输出流,则其控制台将存在,并且通常会连接到启动虚拟机的键盘和显示器。 如果虚拟机是自动启动的,例如通过后台作业调度程序,那么它通常没有控制台。

IDE之类的IDE将您的应用程序作为后台进程运行,而不是作为系统控制台的顶级进程运行。

1

这只是说,如果从IDE或作为主Java进程的子进程启动JVM,它将不会附加控制台。

  • 在IDE的情况下,IDE的控制台被使用。
  • 在子进程的情况下,如果您希望子进程使用主进程的控制台,则需要将输入/输出流重定向到主进程。
0

如果从另一个进程调用JVM。您无法访问控制台。例如。您可以使用Runtime.exec(...)运行另一个java程序中的java程序(...)