Java 中final的代码块不是一定会执行的, 如果遇到了 报错, 但是没有捕捉, 那么不会执行, 如果遇到了System.Exit(0)的话. . 也就不会执行后面的代码了, 这个代码就会终止所有的线程. 除非是调用了
Runtime.getruntime().addshutdownhook(Thread) 那么在System.Exit(0). 执行的时候JVM 会执行 前面注册的hook .
System.Exit(0) 执行的时候 虚拟机退出前要执行两项工作:
1, 执行系统中华所有注册的钩子.
2, 如果程序前面调用了System.RunFinalizerOnExit(true). 那么JVM 会对还没结束的对象调用Finalize 方法.
try
{
throw new RuntimeException("haha");
}
finally
{
return 0;
}
程序在遇到throw 异常的时候 会先去看看是否有finally 代码, 有的话会先执行finally 代码然后再会根据情况是否接着throw. 如果finally 中没有return 就会接着throw如果已经有return了 就不会再去执行throw
try
{
System.out.println("haha");
}catch(IOException e){
}
这个代码是会报错的, 因为try里面的代码不存在任何语句会抛出IOException , 所以编译会报错, 对于catch Exception 来说, 如果catch 一个 运行时异常没有任何问题. 任何代码都可以, 但是如果try代码块中没有可能抛出一个编译时异常的代码, 然后catch 的时候去捕捉了, 那么就会报错. 捕捉Exception 不会报错
不过C# 中是没有这个问题的, try{int a=10}catch(IOException ie){} 这样也是可以通过编译的
子类在重写父类方法的时候不能抛出比父类更大的异常, 只能声明抛出比父类抛出的异常的子类.