首页 > 解决方案 > 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 文档中找到我需要的东西。在我看来,该start()方法返回了一个空对象。

还有其他方法可以调用 start 方法吗?

标签: javaprocessprocessbuilder

解决方案


ProcessBuilder.start() 什么时候返回 null ...

根据 javadoc,start()不返回null. javadoc 说它返回 aProcess并且没有提到返回null。如果有任何情况start() 可以return null,那么应该在 javadoc 的“Returns:”中明确提及该方法。

这是他们遵循的惯例。

我查看了ProcessBuilder.start()Java 11 中的源代码,通过阅读,结果实际上不可能是null.

实际代码位于包私有类static Process start()中声明的方法中。ProcessImpl如果该方法完全返回,它会返回一个新创建的ProcessImpl... extends实例Process

(Unix 和 Windows 平台有不同的版本ProcessImpl。我检查了这两个版本。)


所以问题是:你怎么会得到那个 NPE?

我的猜测是您误读了堆栈跟踪(您没有向我们展示!),并且在调用getOutputStream(). 或者您正在运行的编译代码与您正在查看的源代码不匹配。

无论哪种方式,如果我们要更进一步,我们将需要提供一个适当的最小可重现示例。我们可以实际编译和运行的“minrepex”,它实际上会抛出一个 NPE 供我们诊断。

(对于它的价值,我不愿意相信 javadocs 或 Java SE 实现是不正确的。)


还有其他方法可以调用该start()方法吗?

不是我知道的。但这可能是一条死胡同。真正的解决方案将涉及弄清楚 NPE 的真正来源。


推荐阅读