解决方案 »

  1.   

    1、你这个说法有点小问题,methodA由于是static,所以永远只有一个,但是如果多个地方调用methodA,他们的运行环境确实是独立的不同的,也就是说有独立的栈内存,局部变量也当然是不同的,这个去看函数调用原理就知道了。2 3 4属于同一问题,这只是编译器设计上的问题,不同编译器表现可能不同,你完全可以自己写一个Java编译器检查所有明显错误的情况并报错不予以编译,或者你也可以写一个编译器完全不检查任何潜在错误。
    当前版本的官方编译器设计上认为编译器的本职工作只是编译,运行会不会出错和它无关,它在能编译通过的情况下尽量编译,除非是实在无法编译才会报告错误,如果它觉得这个代码可能有问题但可以编译通过,也只会警告,就算在你看来肯定会出错,编译器也是睁一只眼闭一只眼,这一方面是充分相信程序员,另一方面也是效率上的考虑,这类错误太多了,如果所有这些错误你都要去检查,并且做出适当处理,那开销太大,特别是大型项目编译,如果一个项目本来编译只需要一分钟,检查错误却要花上十分钟,那估计没有几个人会喜欢这个编译器,所以有些语言比如C/C++的某些编译器为了效率基本不会检查潜在错误。
      

  2.   

    追问:疑问 1 中的代码:public static void methodA() {
      // 行1
      String s = null;  // 行2
      System.out.println(s.length());
    }
    疑问5:想尽一切的办法,是否有方法能够使在执行 “行2” 代码时,使 s 变量的值不为 null ?我想过多线程,但也认为无法做到,因为这是一个方法,是一个方法中的局部变量,每个线程执行此方法,都会是 “各自单独” 地去执行此方法。