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