Java checked 异常 和 RuntimeException

RuntimeException

RuntimeException是非常特殊的子类,你可以不用throw和throws。
哪怕你throw了,也没必要throws,即使你throws了,调用者也没必要try-catch。


之所以不用在函数上声明,是因为不需要让调用者处理,当该异常发生,希望程序停止,
因为在运行时,出现了无法继续运算的情况,希望程序停止后由程序员对代码进行修正。

自定义异常时,如果该异常的发生,无法继续进行运行,就让自定义异常类继承RuntimeException


ArithmeticException - 算术运算中,被0除或模除。

ArrayIndexOutOfBoundsException - 数组越界访问。

BufferOverflowException - 缓冲区溢出异常。

NullPointerException - 试图访问一空对象的变量、方法或空数组的元素。

ArrayStoreException - 数据存储异常,写数组操作时,对象或数据类型不兼容。

ClassCastException - 类型转换异常。

IllegalArgumentException - 方法的参数无效。

IllegalThreadStateException - 试图非法改变线程状态,比如试图启动一已经运行的线程。

运行时异常和ckecked异常的区别

对于异常分两种:检查异常和非检查异常(运行时异常)

检查异常 : 
    编译时被检测的异常(throw后,方法有能力处理就try-catch处理,没能力处理就必须throws)。

运行时异常 : 
    编译时不被检查的异常(运行时异常。RuntimeException及其子类)。


1、机制上

主要表现在以下两个方面 : 
(1)如何定义方法 
(2)如何处理抛出的异常

运行时异常:
    不需要用 throws 声明抛出异常对象所属类,也可以不用 throw 抛出异常对象或异常引用。
    对于调用该方法,也不需要放于 try-catch 代码块中。
    (如果你捕获它,就会冒这么一个风险:程序代码错误被掩盖在运行中无法察觉)

检查异常: 
    一旦 用throw 抛出异常,如果当前方法可处理异常,那么直接在该方法内用try-catch去处理。
    如果当前方法不具备处理该异常的能力,那么就必须在参数列表后方法体前用 throws 声明异常所属类,
    交给调用该方法的调用者(方法)去处理 。


2、逻辑上

从逻辑的角度来看,checked异常 和 RuntimeException 有着不同的使用目的:
    检查性异常用来指示一种调用方能够直接处理的异常情况(例如: 用户输入错误,程序可以直接捕获并处理,提示用户输入错误), 
    而 RuntimeException 是用来指调用方本身无法处理或回复的程序错误
    (例如,你封装个库给别人用,当别人调用你库中某个方法是,需要传入某些参数,
    如果用户传入的参数不合法,你自己没办法处理,那么你抛出的就应该是运行时异常)。


ckecked异常包括:
    IOException
    SQLException
    ClassNotFoundException
    InterruptedException(中断异常-调用线程睡眠时候)
    DataFormatException

Exception一自定义异常

https://www.cnblogs.com/loveer/p/11314089.html

猜你喜欢

转载自www.cnblogs.com/loveer/p/11666601.html