那是因为String
类中的这段代码:
public static String valueOf(char data[]) {
return new String(data);
}
您的代码(抛出NullPointerException
)调用上述方法,因此该data
字段为null
. 实际上,这个调用是由String
构造函数上的类抛出的。
使用JDK 6,异常如下:
java.lang.NullPointerException
at java.lang.String.<init>(String.java:177)
at java.lang.String.valueOf(String.java:2840)
at org.bfs.data.SQLTexter.main(SQLTexter.java:364)
至于你的线路:
System.out.println(as+":"+as.length()); // prints: "null:4"
这在调用以下方法时起作用:
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
显然,a
是类型Object
,所以String.valueOf(Object)
方法被调用。
如果您特别想调用String.valueOf(Object obj)
方法,请按如下方式对 null 进行类型转换:
System.out.println (String.valueOf((Object)null));
您正在经历方法重载(其中有多个具有相同名称和方法签名的方法,但具有不同的方法参数)。在您的情况下(发生 NPE),JVM 根据最具体的静态类型确定要调用的方法。如果声明了类型,那么最具体的方法是与声明的变量的参数类型相同的方法,否则, JVM使用最具体的方法规则来查找调用哪个方法。
我希望这有帮助。