异常相关问题

1、Java中的两种异常是什么?它们之间的差别?
Java有两种类型的异常:checked与unchecked(检查与未检查) 异常. 假设unchecked异常可能会在方法或构造函数的运行时被抛出从而蔓延到方法或构造函数的外部, 它们也不须要要在方法或构造函数中声明throws子句. 然而, checked异常必须通过方法或构造函数的throws子句声明. 关于java异常处理的建议请參考这里Java exception handling.
 2、Java中异常与错误的差别?
Exception和Error都是Throwable类的子类. Exception用于用户程序须要捕获的异常条件. Error定义了用户程序不可预见的异常
 3、throw与throws的差别 ?
keywordthrow用于在程序中显式地抛出一个异常. 相反, throws子句用于指出在该方法中没有处理的异常. 每一个方法必须显式指明哪些异常没有处理, 以便该方法的调用者能够预防可能发生的异常. 最后, 多个异经常使用逗号分隔.
 4、异常处理中finally语句块的重要性?
无论程序是否发生了异常, finally语句块都会被运行. 甚至当没有catch声明但抛出了一个异常时, finally语句块也会被运行. 最后要说一点: finally语句块通经常使用于释放资源, 如I/O缓冲区, 数据库连接等等.
5、、异常被处理后异常对象会发生什么?
异常对象会在下次gc运行时被回收.
 6、、如何区分finally语句块与finalize()方法?
无论是否抛出异常finally语句块都会被运行, 它通经常使用于释放程序持有的资源. finalize是Object类中的一个protected方法, 当一个对象被gc回收前它会被jvm调用.
7、假设是可恢复错误,使用检查型异常;假设是编程错误,使用非检查型异常。
很多Java编程人员都非常苦恼,究竟是该选择检查型异常还是非检查型异常。检查型异常是一种从语言到强制你编写代码的一种方式,能够保证你对错误条件提供异常处理代码,但同一时候也会引入大量杂乱的代码导致其不可读。假设你有恢复策略的话,这样做看起来似乎也能够。
8、在finally程序块中关闭或者释放资源
Java
程序猿对此都有所了解,在处理网络和IO类的时候,相当于一个标准。在finally块中关闭资源, 在正常和异常运行的情况下,保证之前和稀缺资源的合
理释放,这由finally块保证。从Java7開始,该语言有了一项更好的功能:资源管理自己主动化或者ARM块能实现这一功能。虽然如此,我们仍然要记住
在finally块中关闭资源,这是对于释放像FileDescriptors这类,应用在socket和文件编程的情况下的有限资源非常重要的。
9、在堆栈跟踪中包括引起异常的原因
非常
多时候,当一个异常由还有一个异常导致异常而被抛出的时候,Java库和开放源码会将一种异常包装成还有一种异常。这时,日志记录和打印根异常就变得很重
要。Java异常类提供了 getCause()方法来检索导致异常的原因,这些能够对异常根层次的原因提供很多其它的信息。该Java实践对代码的调试或故
障排除有非常大的帮助。另外,假设你要把一个异常包装成还有一种异常,构造一个新异常就要传递源异常。
10、始终提供关于异常的有意义的完整信息
异常信息很重要,由于这是Java程序猿最先看到的一个地方,在这里会有很精确而且真实的信息,他们能够找到问题产生的根本原因。
11、避免过度使用检查型异常 
检查型异常在强制运行方面有一定的优势,但同一时候它也破坏了代码,通过掩盖业务逻辑使代码可读性降低。所以,Java程序猿要注意,不能过度使用检查型异常,你能够最大程度的降低这类情况,这样你会得到更精准、简洁的代码。
12、将检查型异常转为执行时异常

个像是Spring之类的多数框架中,用来限制使用检查型异常的技术之中的一个,大部分出自于JDBC的检查型异常,都被包装
进 DataAccessException中,而(DataAccessException)异常是一种非检查型异常。特定的异常限制到特定的模块,像
SQLException 放到DAO层,将执行时异常明白的说明然后抛到客户层。
13、记住对性能而言,异常代价比較高
异常
代价比較高,还会让你的代码执行变得缓慢。假设你有方法从ResultSet(结果集)中进行读取,这时常会抛出SQLException 异常而不会移
到下一元素,这将会比不抛出异常的正常代码运行速度慢非常多。因此Java程序猿要最大限度的降低不必要的异常捕捉和移动。假设你能使用boolean变量
去表示运行结果,而不只不过抛出和捕捉异常,你就有可能得到更简洁、更高性能的解决方式。
14、避免catch块为空
没有什么会比空的catch块更糟糕的了,由于它不仅隐藏了错误和异常,还可能导致你的对象处于不可使用的状态。空的catch块没有不论什么意义,假设你很肯定异常不会继续以不论什么方式影响对象状态,在程序运行期间,用日志记录错误依旧是最好的方法。
15、使用标准异常
java
程序猿应该学会使用标准异常,而不是每次都创建自己的异常。对于维护性和一致性,无论是如今还是以后,都是最好的选择。重用标准异常使代码更具可读性,因
为大部分Java开发者对标准,像源自于JDK的RuntimeException 异常,IllegalStateException 异
常,IllegalArgumentException 异常或者NullPointerException异常,他们能一眼就知道每种异常的目的,而不
是在代码里查找或者在文档里查找用户定义的异常的目的。
16、记录不论什么方法抛出的异常
Java提供了throw和throwskeyword来抛出异常,在javadoc中用@throw记录不论什么方法可能会抛出的异常。假设你编写API或者公共接口,这就变得很重要。不论什么方法抛出的异常都有对应的文档记录,这样你就能下意识的提醒不论什么使用(该方法)的人。

原文地址:https://www.cnblogs.com/mengfanrong/p/3951256.html