下面的代码怎么修改,才能保证线程里不报空指针异常

public class Test {
private String key;

private Thread myThread = new Thread() {
    public void run() {
        String threadKey = key.replace(" ", "").replace("-", "");
        System.out.println(threadKey);
    };
};

public void doTask() {
    key = "aa";
    myThread.start();
    key = null;
}

public static void main(String[] args) {
    Test test = new Test();
    test.doTask();
}

}

提供两种方法 一种利用Thread join,另一种使用线程同步锁 实测可行 有详细注释 望采纳

 public class Test {

    private String key;

    private Thread myThread = new Thread() {
        public void run() {
            String threadKey = key.replace(" ", "").replace("-", "");
            System.out.println(threadKey);
        }
    };

    public void doTask() {
        key = "aa";
        myThread.start();

        // Thread join 可使得多线程间并行执行变为串行执行
        // myThread join 到主线程 必须等 myThread 执行完 主线程才能继续
        try {
            myThread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        key = null;
    }

    public static void main(String[] args) {
        Test test = new Test();
        test.doTask();
    }
}
public class Test {

    private String key;

    private Thread myThread = new Thread() {
        public void run() {
            String threadKey = key.replace(" ", "").replace("-", "");
            System.out.println(threadKey);

            // myThread 执行完毕 释放主线程锁
            synchronized (Test.this) {
                Test.this.notifyAll();
            }
        }
    };

    public void doTask() {
        key = "aa";
        myThread.start();

        // 把主线程锁起来
        synchronized (this) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        key = null;
    }

    public static void main(String[] args) {
        Test test = new Test();
        test.doTask();
    }
}

你先判断可以是否为空,再去进行字符串操作
private Thread myThread = new Thread() {
public void run() {
if(key!=null&&key.length()>0){
String threadKey = key.replace(" ", "").replace("-", "");
System.out.println(threadKey);
}

};

};

public void run() {
if(key!=null&&!"".equals(key))
{
String threadKey = key.replace(" ", "").replace("-", "");
System.out.println(threadKey);
}
};

不能简单判空,因为不是同一个线程。主线程会修改,子线程不确定什么时候会用

你为什么设置为aa之后,又设置为空了呢,你设置为null的时候线程还没运行呢,一般情况下,线程不处于等待状态时,会在主函数结束后运行,你可以在thread.start之后让它睡一下sleep(10)这样就会先执行函数 了,但这也是不安全的,如果线程有个时,就算你在run里面判断为空,可能 也会出错,除非加锁,你这样的代码 我估计加个sleep就可以了

使用JDK1.8新特性吧!Optional类就是专门为了空指针异常而设计的。