Runtime Exception vs Exception

在java的异常类体系中,Error和RuntimeException是非检查型异常,其他的都是检查型异常。


所有方法都可以在不声明throws的情况下抛出RuntimeException及其子类 

不可以在不声明的情况下抛出非RuntimeException

简单的说,非RuntimeException要自己写catch块处理掉。或者throw



Exception和继承自Exception的RuntimeException有什么区别呢?
Java compiler要求所有的Exception 要么被catch,要么被throw,除非这是一个RuntimeExeption (e instanceof RuntimeException)。也就是说,通常的Exception一定要被处理,也即我们所说的 checked exception,而RuntimeException不强制要求处理,(当然你自己要处理也可以),所以我们称为unchecked exception。
之所以区分 checked/unchecked exception,JAVA的设计思想是区分从类/方法设计者角度来看两种不同的异常:
一种是设计者认为这个方法在使用过程中使用者能够处理的异常,这些往往作为checked exception。比如一个IO系统的设计者会认为诸如物理文件不存在或者介质无法读取等异常时很可能发生,而使用者完全可能捕获这个异常,通过让用户重新输入文件名等方式重新进行这个操作,也就是说,这是一个可恢复的操作。所以我会在诸如 read()/write()等操作中throw 一个 IOException(checked exception)。
第二种是设计者认为使用者不能够处理的异常,比如我写一个函数要求传入的参数是个正数,那么当我发现使用者传了个负数进来时,合理的预期是程序中出bug了。如果我抛出一个异常描述这件事,即使我要求调用者捕获这个异常,他肯定也不知道该怎么办(总不能随便传一个正数进来吧)。这时候我就会抛出一个IllegalArgumentException(uncheck exception),这里面的潜台词是:小子,我知道你也是帮人背黑锅的,处理不了这个,你还是交给你的领导(调用你的程序)去处理这个异常吧。
同理,当JVM发现除数为0时,抛出的ArithmeticException也是一个unchecked exception。

从这里可以看出,checked exception和 unchecked exception的根本区别在于设计者认为使用者是否能够并且应该处理这个异常。不幸的是,由于Java使用者水平的参差不齐,大量的unchecked exception该被设计成了checked exception,而对于真正的checked exception,又有太多被catch了之后啥都不作就悄无声息了。尤其是不声不响吞噬exception的行为,不但达不到设计者本来的要求(进行恢复处理),甚至问题更大(连 unchecked exception那种最后报错的效果都没了)。
所以, C#在异常处理上采用了完全不同的思路,把所有的的exception都设计为 unchecked exception,也就是说,它基于这样一种思路: 我不要求任何人处理任何异常;如果你能处理,那么你就显示catch这种异常;如果某种异常没有人catch,那么系统最终会崩溃。


Runtime Exception: 
在定义方法时不需要声明会抛出runtime exception; 在调用这个方法时不需要捕获这个runtime exception; runtime exception是从java.lang.RuntimeException或java.lang.Error类衍生出来的。 例如:nullpointexception,IndexOutOfBoundsException就属于runtime exception 

Exception:
定义方法时必须声明所有可能会抛出的exception; 在调用这个方法时,必须捕获它的checked exception,不然就得把它的exception传递下去;exception是从java.lang.Exception类衍生出来的。例如:IOException,SQLException就属于Exception

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 常见的runtime exception包括: 1. NullPointerException(空指针异常):当试图访问一个空对象时抛出。 2. ArrayIndexOutOfBoundsException(数组下标越界异常):当试图访问数组中不存在的元素时抛出。 3. ClassCastException(类型转换异常):当试图将一个对象强制转换为不兼容的类型时抛出。 4. IllegalArgumentException(非法参数异常):当传递给方法的参数不合法时抛出。 5. IllegalStateException(非法状态异常):当对象处于不合法的状态时抛出。 6. UnsupportedOperationException(不支持的操作异常):当试图执行不支持的操作时抛出。 7. ArithmeticException(算术异常):当进行除以零或其他不合法的算术操作时抛出。 8. SecurityException(安全异常):当试图执行不允许的操作时抛出。 9. OutOfMemoryError(内存溢出异常):当JVM无法为对象分配足够的内存时抛出。 10. StackOverflowError(栈溢出异常):当递归调用或方法调用过多导致栈空间不足时抛出。 ### 回答2: Runtime Exception,即运行时异常,指的是程序在运行时出现的异常,通常是由于程序逻辑或运行环境等出现问题所引起的。相比于编译时异常,运行时异常并不要求在代码中进行异常处理,但如果不及时处理,可能会导致程序崩溃或错误结果。 常见的runtime exception包括: 1. NullPointerException,空指针异常。当试图调用一个空对象的方法或属性时,就会抛出这个异常。 2. IndexOutOfBoundsException,数组越界异常。当访问一个不存在的数组索引时,就会抛出这个异常。 3. ClassCastException,类转换异常。当试图将一个对象强制转换为另一个不兼容的类型时,就会抛出这个异常。 4. IllegalArgumentException,非法参数异常。当传入的参数不符合方法预期的要求时,就会抛出这个异常。 5. ArithmeticException,数学运算异常。当进行除以零等无法进行的数学运算时,就会抛出这个异常。 6. RuntimeException,运行时异常。这是一个通用的运行时异常,通常用于表示程序出现了不可预知的错误。 以上是常见的runtime exception,还有其他一些较为特殊的异常,如StackOverflowError、OutOfMemoryError等。在编写程序时,我们需要注意预防这些异常的出现,并及时处理已经出现的异常,以保证程序的稳定性和正确性。 ### 回答3: Runtime exception是Java中的一种异常情况,通常是由于程序运行时出现了不可预测的错误或异常情况导致的。下面列举了常见的runtime exception及其原因: 1. NullPointerException: 空指针异常,通常是由于引用了空对象或未初始化的对象引用导致的。 2. ArrayIndexOutOfBoundsException: 数组下标越界异常,通常是由于访问数组时下标越界导致的。 3. ClassCastException: 类型转换异常,通常是由于错误的类型转换或强制类型转换导致的。 4. IllegalArgumentException: 非法参数异常,通常是由于参数无效或不合法导致的。 5. IllegalStateException: 非法状态异常,通常是由于对象的状态不符合操作要求导致的。 6. ConcurrentModificationException: 并发修改异常,通常是由于同时对同一个对象进行修改操作导致的。 7. NumberFormatException: 数字格式化异常,通常是由于将字符串转换为数字时字符串格式无效导致的。 总之,runtime exception是Java中常见的异常类型,开发人员在进行代码开发时需要注意异常处理和防御,尽量避免出现异常情况。如果出现异常,需要进行及时的异常捕获和处理,保证程序的稳定性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值