Java 为什么检索系统信息时返回空异常点?

Java 为什么检索系统信息时返回空异常点?,java,swing,runtime,nullpointerexception,swingworker,Java,Swing,Runtime,Nullpointerexception,Swingworker,我必须使用Runtime.getRuntime().exec(cmd)获取系统信息 我发现以下错误: java.lang.NullPointerException at java.lang.Runtime.exec(Runtime.java:422) at java.lang.Runtime.exec(Runtime.java:326) at mytest.SystemInfoToTextArea.doInBackground(SystemInfoToTextArea.j

我必须使用
Runtime.getRuntime().exec(cmd)获取系统信息

我发现以下错误:

java.lang.NullPointerException
    at java.lang.Runtime.exec(Runtime.java:422)
    at java.lang.Runtime.exec(Runtime.java:326)
    at mytest.SystemInfoToTextArea.doInBackground(SystemInfoToTextArea.java:31)
    at mytest.SystemInfoToTextArea.doInBackground(SystemInfoToTextArea.java:16)
欢迎任何建议

类别代码

public class SystemInfoToTextArea extends SwingWorker<String, Void> {
private JTextArea textArea;
private String cmd;

public SystemInfoToTextArea(JTextArea textArea, String cmd) {
    textArea = textArea;
    cmd = cmd;
}

@Override
protected String doInBackground() throws Exception {
    String outputMem = null;
    try {
        String lineMem;
        outputMem = "";
        Process procMem = Runtime.getRuntime().exec(cmd);
        BufferedReader input =
                new BufferedReader
                        (new InputStreamReader(procMem.getInputStream()));
        while ((lineMem = input.readLine()) != null) {
            outputMem = (lineMem + "\n");

        }

        input.close();
    } catch (Exception err) {
        err.printStackTrace();
    }
    return outputMem;
}

@Override
protected void done() {
    super.done();
    try {
        textArea.append(get());
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }

}

public static void main(String... args){
    JFrame frame = new JFrame();
    frame.setSize(700,500);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel panel = new JPanel();
    JTextArea textArea = new JTextArea("System info");

    panel.add(textArea);
    frame.setContentPane(panel);

    frame.setVisible(true);

    SystemInfoToTextArea systemInfoToTextArea = new SystemInfoToTextArea(textArea,"cmd /C dir");
     systemInfoToTextArea.execute();

}
}
公共类SystemInfoToTextArea扩展SwingWorker{
私人JTEXTEXTAREA textArea;
私有字符串cmd;
公共系统infototextarea(JTextArea textArea,String cmd){
textArea=textArea;
cmd=cmd;
}
@凌驾
受保护的字符串doInBackground()引发异常{
字符串outputMem=null;
试一试{
字符串lineMem;
outputMem=“”;
Process procMem=Runtime.getRuntime().exec(cmd);
缓冲读取器输入=
新的缓冲读取器
(新的InputStreamReader(procMem.getInputStream());
而((lineMem=input.readLine())!=null){
outputMem=(lineMem+“\n”);
}
input.close();
}捕获(异常错误){
err.printStackTrace();
}
返回outputMem;
}
@凌驾
受保护的void done(){
超级。完成();
试一试{
append(get());
}捕捉(中断异常e){
e、 printStackTrace();
}捕获(执行例外){
e、 printStackTrace();
}
}
公共静态void main(字符串…参数){
JFrame=新JFrame();
框架设置尺寸(700500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel面板=新的JPanel();
JTextArea textArea=新JTextArea(“系统信息”);
面板。添加(文本区域);
frame.setContentPane(面板);
frame.setVisible(true);
SystemInfoToTextArea SystemInfoToTextArea=新的SystemInfoToTextArea(textArea,“cmd/C dir”);
systemInfoToTextArea.execute();
}
}

您的
cmd
显然是
null
,因为您的构造函数代码是错误的。写

this.cmd = cmd;

textArea也一样。

您的构造函数不会按照您的想法执行:

public SystemInfoToTextArea(JTextArea textArea, String cmd) {
    textArea = textArea;
    cmd = cmd;
}
这只是将参数重新分配(到它们自己的值!),并且不使用相同的名称设置字段。您要做的是在它们前面加上以下前缀:

public SystemInfoToTextArea(JTextArea textArea, String cmd) {
    this.textArea = textArea;
    this.cmd = cmd;
}

一个好的IDE会警告你这个错误。

甚至没有重新分配,这是一个禁止操作:)我使用Intellij,他没有警告或抱怨。在更正构造函数后,我发现了这个错误:''java.io.IOException:CreateProcess:free-m-t-o error=2 at java.lang.ProcessImpl.create(本机方法)at java.lang.ProcessImpl.(ProcessImpl.java:81)在java.lang.Runtime.exec(Runtime.java:591)在java.lang.Runtime.exec(Runtime.java:591)在java.lang.Runtime.exec(Runtime.java:429)在java.lang.Runtime.exec(Runtime.java:326)在mytest.SystemInfoToTextArea.doInBackground(SystemInfoToTextArea.java:31)在java.lang。我把main中的String命令改为“cmd/cdir”,它就可以工作了。我已经在代码中更正了它。