尝试在空对象引用上调用虚拟方法'java.io.OutputStream java.lang.Process.getOutputStream()'
这就是我要做的:
protected void runProc(String[] args) {
ProcessBuilder processBuilder = new ProcessBuilder(args);
try {
Process process = processBuilder.start(); // or was it processBuilder
BufferedWriter stdin = new BufferedWriter(new OutputStreamWriter(process.getOutputStream())); // stdin
BufferedReader stdout = new BufferedReader(new InputStreamReader(process.getInputStream())); // stdout
BufferedReader stderr = new BufferedReader(new InputStreamReader(process.getErrorStream())); // stderr
} catch (IOException e) {
e.printStackTrace();
}
}
我在java文档中找不到我需要的东西。在我看来,null对象由start()
方法返回。
还有其他方法可以调用start方法吗?
ProcessBuilder.start()何时返回null…
根据javadoc,start()
不返回null
。javadoc说它返回一个Process
,并没有提到返回null
。如果在任何情况下start()
可以返回null
,那么应该在javadoc的"Returns:"中显式地提到。方法
这是他们遵循的约定。
我看了看Java 11中ProcessBuilder.start()
的源代码,根据我的阅读,结果实际上不可能是null
。
实际代码在static Process start()
方法中,该方法在包私有ProcessImpl
类中声明。如果该方法返回,它返回一个新创建的ProcessImpl
实例…扩展了Process
.
(ProcessImpl
在Unix和Windows平台上有不同的版本。我检查了两个版本)
所以问题是:你是怎么得到NPE的?
我猜你误读了堆栈跟踪(你还没有给我们看!),中没有抛出调用getOutputStream()
的异常。或者你正在运行的编译代码与你正在查看的源代码不匹配。
无论如何,我们都需要你为了提供一个适当的最小可重复的例子,如果我们要进一步研究的话。一个"minrepex">实际上可以编译和运行,而且实际上会抛出一个NPE供我们诊断。
(不管它的价值是什么,我不愿意相信javadocs或Java SE实现是不正确的。)
我可以调用
start()
方法的任何其他方式?
我不知道。但这可能是一条死胡同。真正的解决方案将包括弄清楚NPE的真正来源。