日期:2014-05-20  浏览次数:20847 次

新人请教!S123 jvm分别是怎么处理的?
   public class StringTest{
        static  String  s1;       
        publicstatic void main(String[] args) {
           String s2;              
           String s3 = "";      
           System.out.print(s1.isEmpty());     //运行时异常
           System.out.print(s2.isEmpty());     //编译出错
           System.out.print(s3.isEmpty());     //ok!输出true
        }
    }

------解决方案--------------------
空串分配了空间,但长度为0。 null没有分配空间。但两者都声明了变量名,好比给了一个装地址或值的盒子。
静态变量在加载的时候已经默认被初始化,String s3 = "";执行main时候被赋值显然也被初始化了。  String s2;既没有默认,也没有手动,所以未初始化。
------解决方案--------------------

/**
 * <pre>
 *  @author kanpiaoxue
 * 
 * 未初始化、空串""与null。它们是不同的概念。对未初始化的对象操作会被编译器挡在门外;null是一个特殊的初始化值,
 * 是一个不指向任何对象的引用,对引用为null的对象操作会在运行时抛出异常NullPointerException; 
 * 而空串是长度为0的字符串,和别的字符串的唯一区别就是长度为0。
 * 
 * 但是s1  s2   是怎么分配的?
 * S1  S2  为什么一个为null   一个未初始化???
 * </pre>
 */
public class StringTest {
/**
 * <pre>
 * s1在 StringTest.class 被JVM加载的时候,就被赋予了 null 值。
 * s1 是 static ,也就是静态的类属性,会在 JVM 加载该类的时候进行初始化,如果没有指定初始化的具体值,将会被赋予默认值:null
 *  
 *  例如:
 *  static int n1; //默认的初始化值: 0
 *  static long n1; //默认的初始化值: 0L
 *  static Date d1; //默认的初始化值: null
 * </pre>
 */
static String s1;

public static void main(String[] args) {
/**
 * <pre>
 * 这里的 s2 是方法内的局部变量,在Java里面规定,局部变量一定要被“初始化”之后才能引用。局部变量是不会被编译器赋予默认值的。
 * </pre>
 */
String s2;
/**
 * <pre>
 * s3 的这个局部变量,很明显被指定了初始化的数值,符合Java的规定,是不会报错的。
 * </pre>
 */
String s3 = "";

/**
 * <pre>
 * isEmpty() 这个函数,你可以参考一下JDK的源码。可以清晰的看到
 * 
 * public boolean isEmpty() {
 *  return count == 0; 
 * }
 * 
 * 里面的 count,看过JDK的源码之后,知道它是组成String的字节的个数。
 * </pre>
 */
System.out.print(s1.isEmpty()); // 运行时异常
System.out.print(s2.isEmpty()); // 编译出错 -- 在现有的Java的IDE里面,这是报错的,提醒你会有编译的错误。
System.out.print(s3.isEmpty()); // ok!输出true
}
}