java - 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 方法吗?
解决方案
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 的真正来源。
推荐阅读
- r - 如何计算 GJRM 函数/包估计的边际效应
- excel - 我的代码有问题。我想更改数据透视图的颜色
- dart - Http.get 返回 null
- android - LiveData 和 Coroutines - 属性必须被初始化或抽象
- c - arr 和 *arr 有什么区别?
- java - 在 Logstash 7.0 中定义常量
- html - 容器上的高度相等,但使用 Display Flex
- c# - How do i dynamically name Linklabels?
- c - 结构内的数组;如何让我的代码更简洁?
- javascript - 将 JSFiddle 与基于 React 的外部库一起使用