Checked:继承java.lang.Exception类,可以预料到的,catch or specific 必须被显式地捕获或者传。
Unchecked:继承java.lang.RuntimeException(),不需要再方法上声明的异常。
比如: IllegalArgumentException extends RuntimeException
throw new Error(); 运行时异常
try catch 执行完,不管有没有异常,都会执行finally
finally 代码块中,最好不要return / throw,可能会隐藏try / catch的异常
运行时,虚拟机会复制finally语句块里面的内容在try catch里面,确保退出的时候一定会先执行
try (Close close = new Close();
AnotherCloseable close1 = new AnotherCloseable()){
}
离开try块时将自动调用close()方法,释放资源,这些资源必须实现 java.lang.AutoCloseable 接口
close1会先被关闭,如果有异常也会先抛出
如果两个close方法都会抛出异常,会将它们放在Suppressed数组里
https://stackoverflow.com/questions/47964866/how-to-rewrite-try-with-resources-with-two-resources-using-only-try-catch-finall
throw 用来抛出一个异常,在方法体内。语法格式为:throw 异常对象。
throws用来声明方法可能会抛出什么异常,在方法名后。语法格式为:throws 异常类型1...异常类型n。
避免过大的try块,不要把不会出现异常的代码放到try块里面,尽量保持一个try块对应一个或多个异常。
细化异常的类型,不要不管什么类型的异常都写成Excetpion。
catch块尽量保持一个块捕获一类异常,不要忽略捕获的异常,捕获到后要么处理,要么转译,要么重新抛出新类型的异常。
不要把自己能处理的异常抛给别人。
不要用try...catch参与控制程序流程,异常控制的根本目的是处理程序的非正常情况。
https://blog.csdn.net/top_code/article/details/39638467