先上代码,如果知道输出的就可以不用往下看啦~~~先声明一下,是null对象,不是"null"!
package com.fc.model;
public class TestTryCatch {
public static void main(String[] args) {
System.out.println("i的值为。。。"+new TestTryCatch().test());
}
private String test(){
String s=null;
try {
return s;
}finally{
s="abc";
System.out.println("finally is Executed finally is Executed…");
}
}
}
不卖关子,最后输出是
finally is Executed…
i的值为。。。null
第一行输出“ finally is Executed…”比较好理解吧,在try块中执行return之前是会先去执行finally块的。
第二行输出可能有些费解,主要有两个需要理解一下的吧,
第一,finally是在return表达式运算符后并定下来不变的情况下执行的,所以函数返回值是在finally执行之前就确定下来的,所以test()函数返回的s是null;
第二,关于null对象的输出,可以写个简单的测试代码,String s=null; System.out.println(s); 最后输出的会是null,这一点可能也比较费解,首先要明白System.out的类型是PrintStream, PrintStream.println先是调用PrintStream.print(String s)然后再输出一个换行符。其中print源码是这样子的
public void print(String s){
if(s==null){
s="null";
}
write(s);
}
所以一个null对象输出就是"null"。还有一个问题,两个String相加,其中有一个是null对象,此时首先执行的应该是相加,而在JDK中String a+String b编译后被处理为StringBuilder的append方法(所以如果涉及到String 相加的都建议用StringBuilder,效率更高,有关String/StringBuilder/StringBuffer三者的区别很多博客都有介绍,在此就不再啰嗦)。
public StringBuilder append(String str) {
<span style="white-space:pre"> </span>super.append(str);
<span style="white-space:pre"> </span>return this;
}
public AbstractStringBuilder append(String str) {
<span style="white-space:pre"> </span>if (str == null) str = "null";
<span style="white-space:pre"> </span>int len = str.length();
<span style="white-space:pre"> </span>if (len == 0) return this;
<span style="white-space:pre"> </span>int newCount = count + len;
<span style="white-space:pre"> </span>if (newCount > value.length)
<span style="white-space:pre"> </span>expandCapacity(newCount);
<span style="white-space:pre"> </span>str.getChars(0, len, value, count);
<span style="white-space:pre"> </span>count = newCount;
<span style="white-space:pre"> </span>return this;
}
看了源码答案也就很快就能出来了,在append中,null对象也是会先转为“null”字符串再做处理的。