关于输出null对象,以及try/catch/finally比较好玩的一段代码

    先上代码,如果知道输出的就可以不用往下看啦~~~先声明一下,是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”字符串再做处理的。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值