我一直在为Java 7中的OCP考试做准备。我正在阅读的书中,我遇到了一些我完全不理解的东西。Java中的后台进程
即,
如果JVM通过IDE间接调用,或者如果JVM从 调用的后台进程,则该方法调用
System.console()
将 失败并返回空。
在什么情况下以及如何从后台进程调用JVM?有人可以详细说明吗? 此致
我一直在为Java 7中的OCP考试做准备。我正在阅读的书中,我遇到了一些我完全不理解的东西。Java中的后台进程
即,
如果JVM通过IDE间接调用,或者如果JVM从 调用的后台进程,则该方法调用
System.console()
将 失败并返回空。
在什么情况下以及如何从后台进程调用JVM?有人可以详细说明吗? 此致
假设您在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
。堆栈跟踪将打印到标准错误,该错误不会重定向。
这是因为每docs
无论是虚拟机具有控制台取决于底层平台,也取决于在其中虚拟机被调用的方式。如果虚拟机从交互式命令行启动而不重定向标准输入和输出流,则其控制台将存在,并且通常会连接到启动虚拟机的键盘和显示器。 如果虚拟机是自动启动的,例如通过后台作业调度程序,那么它通常没有控制台。
IDE之类的IDE将您的应用程序作为后台进程运行,而不是作为系统控制台的顶级进程运行。
这只是说,如果从IDE或作为主Java进程的子进程启动JVM,它将不会附加控制台。
如果从另一个进程调用JVM。您无法访问控制台。例如。您可以使用Runtime.exec(...)运行另一个java程序中的java程序(...)