我一直在为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程序。