如何在下面的代码中避免空指针异常? read()函数会在下面的代码中打印一个字符串吗?

时间:2015-07-08 12:34:45

标签: java stream inputstream

对于下面的代码,编译器在使用read函数时会出现空指针异常。我希望在屏幕上显示任何用户类型。 其次read函数返回一个int,但我想显示用户输入的字符串,这会显示字符串还是这个我必须用来显示字符串的方法?

//This part is in the main method.
InputStream obj=new Task(t);
int c;
    try {
        while((c=obj.read())!=-1){
            System.out.print(""+c);
        }

//This one is another class.

class Task extends InputStream{
byte[] content;
int num=0;
public Task(JTextField t){
    t.addKeyListener(new KeyAdapter() {
        public void keyPressed(KeyEvent e){
            if(e.getKeyCode()==e.VK_ENTER){
                content=t.getText().getBytes();
                t.setText("");
            }
            super.keyPressed(e);
        }
    });

}
public int read(){
    if(num>=content.length){
        return -1;
    }
    else return content[num++];
}}

1 个答案:

答案 0 :(得分:1)

content仅在执行此块时初始化:

if(e.getKeyCode()==e.VK_ENTER){
    content=t.getText().getBytes();
    t.setText("");
}

要解决此问题,您可以使用read方法添加支票:if(content == null) return -1;

编辑:

覆盖方法时,应使用@Override指令。您当前的方法,添加了空检查,符合JavaDoc。如果要获取字符串值,则需要添加一些其他功能。

public String GetContent() { 
    if(content == null)
        return ""; 
    return new String(content);
}

但是,以上将取决于您打算如何使用任务。另一种选择是类似的东西:

public int read(byte[] b, int off, int len) {
    if(b == null) return -1;

    //Use System.Arraycopy to copy `content` within `b`.
}