ProcessBuilder.start()何时返回null而不是Process对象?



尝试在空对象引用上调用虚拟方法'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的真正来源。

最新更新