使用Runtime.getRuntime().exec时waitFor()行出现NullPointerException问题排查
为什么调用
Subprocess[i].waitFor()会抛出NullPointerException? 我来帮你梳理下可能导致这个空指针异常的几个常见原因,都是这类多进程场景里容易踩的坑:
数组元素未被正确初始化:
如果你只是声明了Process[] Subprocess数组(比如Process[] Subprocess = new Process[5];),但在循环创建子进程时,某个索引i对应的Subprocess[i]没有被赋值——比如循环逻辑漏了某个i,或者exec调用失败后没处理赋值——那这个位置的元素还是null。当你后续调用Subprocess[i].waitFor()时,自然会触发NPE。Runtime.exec()异常未处理导致赋值中断:
注意Runtime.getRuntime().exec()如果执行失败(比如指定的命令不存在、路径错误、权限不足),不会返回null,而是会抛出IOException。但如果你在代码里捕获了这个异常,却没有给Subprocess[i]设置任何值,也没有跳过这个索引的waitFor调用,那这个位置的元素依然是数组初始化时的null,后续调用waitFor就会出问题。比如下面这种错误写法:Process[] Subprocess = new Process[3]; for (int i = 0; i < 3; i++) { try { Subprocess[i] = Runtime.getRuntime().exec("invalid-command"); } catch (IOException e) { e.printStackTrace(); // 这里没有处理Subprocess[i],它还是null } } // 后续调用waitFor时就会NPE for (int i = 0; i < 3; i++) { if (Subprocess[i].waitFor() == 0) { // 这里Subprocess[i]可能是null // ... } }索引操作逻辑错误:
比如你创建的数组长度和实际要启动的子进程数量不匹配,或者循环时索引计算错误,导致访问了一个从来没有被赋值过的数组位置。这个位置的元素就是null,调用waitFor时自然会触发NPE。
内容的提问来源于stack exchange,提问作者Samin Heydarian
相关产品推荐
相关产品推荐

