Java-根底-异样解决
reference:
1. Throwable 类
Throwable 有两大子类:Exception和Error;对应个别异样和运行谬误(个别不捕捉运行谬误)。在 Java 中只有 Throwable
类型的实例才能够被抛出(throw
)或者捕捉(catch
),它是异样解决机制的根本组成类型。
1.1 Throwable
Throwable
蕴含了其线程创立时线程执行堆栈的快照,它提供了 printStackTrace()
等接口用于获取堆栈跟踪数据等信息。
次要办法:
fillInStackTrace
– 用以后的调用栈档次填充Throwable
对象栈档次,增加到栈档次任何先前信息中。getMessage
– 返回对于产生的异样的详细信息。这个音讯在Throwable
类的构造函数中初始化了。getCause
– 返回一个Throwable
对象代表异样起因。getStackTrace
– 返回一个蕴含堆栈档次的数组。下标为 0 的元素代表栈顶,最初一个元素代表办法调用堆栈的栈底。printStackTrace
– 打印toString()
后果和栈档次到System.err
,即谬误输入流。toString
– 应用getMessage
的后果返回代表Throwable
对象的字符串。
1.2 Exception
1.3 Error
1.4 RuntimeException
RuntimeException 继承于 Exception ,与 Exception 不一样的是,编译器不会查看是否捕捉了 RuntimeException 及其子类。
2 抛出&异样捕捉
-
抛出异样
throw new Exception("抛出一个异样");
-
异样捕捉
try{ do something }catch (Exception1 e){ do something }catch (Exception2 e) { do something }finally{ do something }
代码样例
class BasicException extends Exception { public BasicException() { super("BasicException throw"); } public BasicException(String msg) { super(msg); } } class ChildException extends BasicException { @Override public String getMessage() { /** * 除非要笼罩、改写父类信息才须要重写 getMessage 办法; */ System.out.println(super.getMessage()); return "ChildException throw"; } } public class ArrayTest { public static void main(Stri<i style="color:transparent">来源gaodai$ma#com搞$$代**码网</i>ng[] args) throws Exception { // throw new BasicException(); // Exception in thread "main" BasicException: BasicException throw // at ArrayTest.main(ArrayTest.java:29) // throw new BasicException("basic"); // Exception in thread "main" BasicException: basic // at ArrayTest.main(ArrayTest.java:33) // 父子类异样同时呈现在异样中,优先依照程序捕捉子类 try { throw new ChildException(); } catch (ChildException e2) { // 留神必须是父类在后,不然编译报错 System.out.println("ChildException catch"); } catch (BasicException e) { System.out.println("BasicException catch"); } //ChildException catch } }
- 反射对异样捕捉的影响
反射中的异样继承 ReflectiveOperationException 类
反射中的异样,因为反射包裹了一层堆栈,因而要获取精确的异样信息应该利用getTargetException获取实在的异样信息。
- 多线程与异样
如果子线程不捕捉异样,会导致该线程退出。
3 异样链(深层异样抛出,反射包裹)
4. 小倡议
- 对可复原的状况应用查看性异样(Exception),对编程谬误应用运行时异样(RuntimeException)。
- 优先应用 Java 规范的异样。
- 抛出与形象绝对应的异样。
- 在细节音讯中蕴含能捕捉失败的信息。
- 尽可能减少 try 代码块的大小。
- 尽量放大异样范畴。例如,如果明知尝试捕捉的是一个
ArithmeticException
,就应该catch
ArithmeticException
,而不是catch
范畴较大的RuntimeException
,甚至是Exception
。 - 尽量不要在
finally
块抛出异样或者返回值。 - 不要疏忽异样,一旦捕捉异样,就应该解决,而非抛弃。
- 异样解决效率很低,所以不要用异样进行业务逻辑解决。
- 各类异样必须要有独自的日志记录,将异样分级,分类管理,因为有的时候仅仅想给第三方运维看到逻辑异样,而不是更细节的信息。
-
如何对异样进行分类:
- 逻辑异样,这类异样用于形容业务无奈依照预期的状况解决上来,属于用户制作的意外。
- 代码谬误,这类异样用于形容开发的代码谬误,例如 NPE,ILLARG,都属于程序员制作的 BUG。
- 专有异样,多用于特定业务场景,用于形容指定作业出现意外状况无奈事后解决。