Java:异常

异常种类

这里写图片描述

Throwable

Throwable 类是 Java 语言中所有错误或异常的超类。只有当对象是此类或其子类之一的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出,才可以是 catch 子句中的参数类型。   

Throwable 类及其子类有两个构造方法,一个不带参数,另一个带有 String 参数,此参数可用于生成详细消息。   

Throwable 包含了其线程创建时线程执行堆栈的快照。它还包含了给出有关错误更多信息的消息字符串。   

Java将可抛出(Throwable)的结构分为三种类型:   

  • 错误(Error)   
  • 运行时异常(RuntimeException) :是 runtime 阶段碰到的异常. 在编译的时候不需要检查
  • 被检查的异常(Checked Exception):在编译阶段的异常,并且强制检查

编译器强制 checked 异常必须try..catch处理或用throws声明继续抛给上层调用方法处理, 这就是为什么叫checked异常, 而 Runtime 异常可以处理也可以不处理, 所以, 编译器不强制用try..catch处理或用throws声明, 所以 Runtime 异常也称为unchecked异常

Error

Error 是 Throwable 的子类,用于指示应用程序本身无法克服和恢复的一种严重问题,不应该试图捕获。
和RuntimeException一样, 编译器也不会检查Error。   
内存溢出线程死锁等系统问题就是错误,程序本身无法修复这些错误的。

Exception

表示程序还能够克服和恢复的问题, 比如一个输入参数不对引起的异常.
一般对于可以恢复的条件使用被检查异常(Exception的子类中除了RuntimeException之外的其它子类),对于程序错误使用运行时异常

几个 常见的异常:

  • ClassNotFoundException
    当应用程序试图使用以下方法通过字符串名加载类时: Class 类中的 forName 方法。 ClassLoader 类中的 findSystemClass 方法。 ClassLoader 类中的 loadClass 方法。 但是没有找到具有指定名称的类的定义,抛出该异常。

  • ClassCastException   
    父类引用指向的对象的类型不是子类的时候。

  • ILLegalArgumentException   
    向方法传递了一个不合法或不正确的参数。

  • IndexOutOfBoundsException    
    指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。

  • NullPointerException   
    当应用程序试图在需要对象的地方使用 null 时,抛出该异常

处理异常

  • try catch.
    自己在catch块中处理异常.
  • throws.
    把异常抛给调用这个方法的模块去处理. 一般 Java 的库就是怎么处理的.

try-catch-finally

每一个try后面至少要有一个catch或者finally
finally放在catch后面(如果有的话),是一定会执行的块,无论是否有异常发生。

执行顺序如下:

  • 如果try中没有异常且try中有return (执行顺序)
try ---- finally --- return
  • 如果try中有异常并且try中有return
try----catch---finally--- return
  • try中有异常,try-catch-finally里都没有return ,finally 之后有个return
try----catch---finally

try中有异常以后,根据java的异常机制先执行catch后执行finally,此时错误异常已经抛出,程序因异常而终止,所以你的return是不会执行

  • 当 try和finally中都有return时,finally中的return会覆盖掉其它位置的return(多个return会报unreachable code,编译不会通过)。

  • 当finally中不存在return,而catch中存在return,但finally中要修改catch中return 的变量值时

int ret = 0;
try{ 
    throw new Exception();
}
catch(Exception e)
{
    ret = 1;  return ret;
}
finally{
    ret = 2;
} 

最后返回值是1,因为return的值在执行finally之前已经确定下来了

总结:如果try或者catch中有return的话,先是finally执行然后才是return执行,但是return返回值无法被finally中的语句更改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值