测试代码块
public String getGameName()
{
String name="";
if(name==null)
{
System.out.println("equals null");
}
try
{
name=gameManager.getOfficalGameName();
return name;
}
catch (GameInfoLossException e)
{
//System.out.println(e.getMessage());
return name+"catch";
}
finally
{
if(name=="")
{
System.out.println("name info loss");
return "GhostGame:UNKNOWN"++" "+"finally";
}
else
{
System.out.println("name info exists");
return "GhostGame:"+name+" "+"finally";
}
}
return name;
}
@Test
public void testGame()
{
System.out.println(getGameName());
}
第一种情况:出现异常时
对于如上这段代码,当gameManger的name为空时,getOfficalGameName会抛出一个异常,此时会输出:
name info loss
GhostGame:UNKNOWN finally
原因:
finally会在catch块的
return name+“catch”;
之后执行,并将其返回的字符串catch用GhostGame:UNKNOWN finally覆盖掉,最终会返回GhostGame:UNKNOWN finally。
第二种情况:未出现异常时
输出:
name info exists
GhostGame:flywithwind finally
即finally返回的GhostGame:flywithwind finally会将try返回的flywithwind覆盖掉。
总结:
finally不论出现异常都会在最后执行,即使try或者catch有return语句,也会在try或者catch的return语句执行完之后执行,并将函数的返回值覆盖掉,如果finally也有return语句的话。
第三种情况
如果try语句块变成这样:
try
{
if(1==0)
{
name=gameManager.getOfficalGameName();
return name;
}
}
显然,try语句块不会执行,此时finally还会执行吗?
最终输出:
name info loss
GhostGame:UNKNOWN
所以即使try不执行,finally还是执行。除非在finally之前有
System.exit(0);
此时程序直接退出,不会再执行后面的finally。