class NoWater extends Exception {}
class NoDrinkableWater extends NoWater {}
public class FinallyWorks {
static int count = 0;
public static void main(String[] args) throws NoWater {
while ( true ) {
try {
count++;
if ( count == 1 ) {
System.out.println("OK");
} else if ( count == 2 ) {
System.out.println("Exception raised: NoDrinkableWater");
throw new NoDrinkableWater();
} else if ( count == 3 ) {
System.out.println("Exception raised: NoWater");
throw new NoWater();
}
} catch (NoDrinkableWater e) {
System.out.println(e);
} finally {
System.out.println("finally");
if ( count == 3 )
break;
}
}
}
}
输出如下
OK
finally
Exception raised: NoDrinkableWater
NoDrinkableWater
finally
Exception raised: NoWater
finally
分析如下:
第一次循环(count = 1):
count
被增加到 1。- 输出
"OK"
。 - 没有异常被抛出,因此不进入
catch
块。 finally
块被执行,输出"finally"
。
第二次循环(count = 2):
count
被增加到 2。- 输出
"Exception raised: NoDrinkableWater"
。 - 抛出
NoDrinkableWater
异常。 - 异常被
catch
块捕获并处理,输出异常对象的字符串表示(默认调用toString()
方法),即"NoDrinkableWater"
。 finally
块被执行,输出"finally"
。
第三次循环(count = 3):
count
被增加到 3。- 输出
"Exception raised: NoWater"
。 - 抛出
NoWater
异常。 - 由于
catch
块只捕获NoDrinkableWater
异常,所以该异常不会被捕获,直接被抛出到方法签名中的throws NoWater
。 finally
块被执行,输出"finally"
。if (count == 3)
条件为真,break
语句终止循环。