3

我一直在准备 Java 7 的 OCP 考试。我正在阅读的这本书遇到了一些我完全不理解的东西。

那是,

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

在什么情况下以及如何从后台进程调用 JVM?有人可以详细说明吗?最好的祝福

4

4 回答 4

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. 堆栈跟踪打印到标准错误,不重定向。

于 2013-07-12T13:23:35.547 回答
1

这是根据文档

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

像 Eclipse 这样的 IDE 将您的应用程序作为后台进程运行,而不是作为具有系统控制台的顶级进程。

于 2013-07-12T13:14:34.853 回答
1

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

  • 如果是 IDE,则使用 IDE 的控制台。
  • 在子进程的情况下,如果您希望子进程使用主进程的控制台,则需要将输入/输出流重定向到主进程。
于 2013-07-12T13:15:46.970 回答
0

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

于 2013-07-12T13:19:18.563 回答