在此代码片段中,为什么java在有可能出现错误时不会生成编译时错误。 在下面的代码片段中,我尝试访问新线程内的实例变量,并在主线程中将值更改为null。 有意不提出编译错误吗?
public class AnonymousClass {
private Object str = new Object();
public static void main(String[] args) {
AnonymousClass ac = new AnonymousClass();
ac.testMultiThreading();
}
public void testMultiThreading() {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("string value " + str.toString());
}
});
System.out.println("value of str before changing " + str.toString());
str = null;
t.start();
System.out.println("value of str after changing " + str.toString());
}
}
答案 0 :(得分:2)
从Java的角度来看,该程序没有任何问题:
str
,所有这些都可以看到它。这是合法的null
之前,toString
测试对象不需要您的程序,如果NullPointerException
恰好是{{1},它将获得str
}} 您的程序可能有多种原因可以同时更改实例变量的值。例如,线程可能想要计算某个值,并将结果放入要收集的主线程的实例变量中。 Java为您提供了安全执行的同步工具。因此,Java编译器没有理由坚持实例变量为null
。