使用Runtime.getRuntime().exec()执行脚本发生空指针

使用Runtime.getRuntime().exec()执行脚本发生空指针

一、原因

传递的参数中包含Null,使exec() 执行的时候发生空指针。通常在封装的时候会将参数封装为可变参数列表,这样在传递参数的时候稍不注意就会传递null进去。如下代码:

  • 出错代码
public static String execShell(String cmd, String... args){
	// 伪代码
	// 将cmd和args封装到数组中
	String[] cmds = new String[3];
	cmds[0] = "python";
	cmds[1] = cmd;
	if(null!=args) {
		cmds = new String[args.length + 2];
		cmds[0] = "python";
		cmds[1] = cmd;
		System.arraycopy(args, 0, cmds, 2, args.length);
	}
	Runtime.getRuntime().exec(cmds, null, file.getParentFile());
}
  • 经过定位源码报错位置
public Process start() throws IOException {
        // Must convert to array first -- a malicious user-supplied
        // list might try to circumvent the security check.
        String[] cmdarray = command.toArray(new String[command.size()]);
        cmdarray = cmdarray.clone();

        for (String arg : cmdarray)
            if (arg == null)
                throw new NullPointerException();
        // Throws IndexOutOfBoundsException if command is empty
        ......
 }

二、解决方案

  1. 在调用方法时进行参数判空
  2. 将参数中的null去除(原理同1)
Arrays.asList(cmds).stream().filter(e -> StringUtils.isEmpty(e)).collect(Collectors.toList());

你可能感兴趣的:(java)