检查现有文本时,自定义控制台nullPointerException

时间:2013-01-31 00:42:16

标签: java swing nullpointerexception jtextarea

我为程序创建了一个自定义控制台。我有一个方法,向控制台添加一个名为toConsole的消息,它要求检查字符串,并将时间添加到字符串中。然后转到我的函数addConsole,它检查现有文本是否存在,如果是这样,它会将预先存在的文本添加到新文本中,否则它只是将新文本放入。所以这里是错误。我还可能会指出,如果我在控制台输入文本框中手动输入文本,则不会产生此错误。

Exception in thread "main" java.lang.NullPointerException
    at com.michael.tech.api.console.RunConsole.addConsole(RunConsole.java:188)
    at com.michael.tech.api.console.RunConsole.toConsole(RunConsole.java:204)
    at com.michael.tech.api.console.RunConsole.toConsole(RunConsole.java:223)
    at com.michael.tech.api.testerFile.main(testerFile.java:25)

这是addConsole方法

private static void addConsole(String s){
    console.setText( ( console.getText().isEmpty()) ? s : (console.getText() + "\n" + s) );
}

toConsole方法

public static void toConsole(String s, boolean timeStamp, boolean classPath, String className){
        if(s.startsWith("/")){
            doCommand(s);
            return;
        }
        Time t = new Time();
        t.getSYSPrint();
        String time = "[" + t.toMilitary() + "] ";
        if(EchoTime || timeStamp){
            addConsole(time + s);
        }
        else if(classPath){
            addConsole(className);
        }
        else{ 
            addConsole(s);
        }
    }

最后是testerFile类中的Main方法

public static void main(String[] args) {            
        RunConsole.startConsole();
        RunConsole.toConsole("test");
    }

提前感谢您的帮助。我认为这是我忽略的一个小错误(我也希望如此)。

编辑: 粘贴bin以查看行号

RunConsole类 http://pastebin.com/2yUAwQc5

testerFile类 http://pastebin.com/R5ViLekp

1 个答案:

答案 0 :(得分:2)

问题是JTextArea console仍然有默认的null值,因为它尚未实例化。这是因为没有创建RunConsole实例 - 而是以static方式访问此类的方法:

RunConsole.startConsole();
RunConsole.toConsole("test");

使用static方法设计很差,特别是因为您的应用程序需要 state 。在static实例方法中创建所有RunConsole方法,并将上述行替换为:

RunConsole runConsole = new RunConsole();
runConsole.startConsole();
runConsole.toConsole("test");

此外,执行此操作时,请不要忘记删除在startConsole中创建的实例,否则您将看不到来自toConsole的初始消息。变化:

new RunConsole().setVisible(true);

setVisible(true);