Java异常处理相关

举例:某个星期日,天气晴朗,万里无云。我就打算去自驾游。(凤凰牌)
1. 我在山上骑着车,突然山崩了,道路崩塌了。(我无能为力,天灾人祸)
2. 我打开锁时,发现轮胎没气了。(我可以充气,而且应该在事前检查一下)
3. 我在幽静的小路上,惬意的骑着车,突然迎面来了刘亦菲,翻车了。(实现不能预料的,是在运行期间发生的异常)

Throwable
    |-- Error 天灾人祸 StackOverflowError, OutOfMemoryError (JVM的异常) --> 1
    |-- Exception
        |-- 其他子类 编译期异常(受检查异常) --> 2
        |-- RuntimeException 运行时异常(非受检查异常) --> 3
        (一般出现第三种情况,都是代码不够严谨导致,所以推荐修改代码逻辑解决)

常见的异常:
    NullPointerException    ArrayIndexOutOfBoundsException ClassCastException
    ParseException

JVM的默认处理方式:
首先打印出在哪个线程中发生异常,异常类型,异常的信息,异常的调用栈
最后终止程序。

自己处理:
    方法一:try...catch...finally 出现了问题,我自己解决掉。
    方式二:throws 出现了问题,我自己解决不了,那我就抛给别人解决。

标准格式:
try {
要被检查的代码(可能发生异常的代码)
} catch (异常类型 异常名) {
捕获异常,并进行处理。处理完之后异常就不再存在
} finally {
释放资源
}

一个异常的情况:


注意事项:
    try里面的代码越少越好,最好只有可能发生异常的代码

多个异常的情况
1. 对于每一个异常都单独处理
2. 一次进行处理

注意事项:
    1. java的异常处理机制,如果在try代码块里面发生了异常,那try后面就不会被执行.
    2. 如果发生异常,异常对象会依次和catch语句进行匹配,
        如果匹配到到了,就执行对应的catch语句,如果没有,问题就不会得到处理。
        catch语句只会执行一个
    3. 异常类型如果是不兼容的,谁先谁后没有关系,如果有兼容关系,父类应该位于子类后面。

JDK7的新特性
在开发中,往往会对不同的异常进行同样处理

注意事项:
catch语句里面不能存在子父类关系,它们异常类型不能兼容

编译期异常和运行时异常
编译期异常:Java程序必须显示处理,无法通过编译
运行时异常:无需显示处理,(也可以和编译期异常一样处理)不推荐用try…catch进行处理
一般出现运行时异常都是代码逻辑有问题,应该修改代码的逻辑

throws:
定义功能方法时,需要把出现的问题暴露出来让调用者去处理。那么就通过throws在方法上标识。

举例:
如果村里出现一件大事情,如果这个事情村里能够自己解决,就自己解决掉; 如果解决不了,就上报到乡里; 如果乡里解决不了,
就上报到县里;如果县里还解决不了,就上报市里;市里还解决不了,就上报到省里; 如果省里还解决不了,中央就直接干掉!
(JVM就是中央,主方法就是中央的直属下级)
运行时异常:如果抛出的是运行时异常,上级可以处理也可以不处理
编译期异常:如果抛出的是编译期异常,上级必须处理

throws 和 throw之间的区别:

throws
用在方法声明后面,跟的是异常类名
可以跟多个异常类名,用逗号隔开
表示该方法可能抛出异常,由该方法的调用者来处理
throws表示出现异常的一种可能性,并不一定会发生这些异常

throw
用在方法体内,跟的是一个具体的异常对象
只能抛出一个异常
表示抛出异常,由方法体内的语句处理(一般情况,方法会直接抛给上一级)
throw则是抛出了异常,执行throw则一定抛出了某个异常

异常处理的原则:
1. 如果异常该方法能够处理,那就自己处理 (及早处理)
如果异常后面的代码还要执行,只能自己处理
2. 如果自己处理不了就往上抛
如果异常后面的代码不需要执行,就可以往上抛

try语句:
try…catch…finally
try…catch
try…finally
try…catch…catch…
try…catch…catch…finally

finally:
被finally控制的语句体一定会执行
特殊情况:在执行到 finally 之前 jvm 退出了(比如System.exit(0))
作用:
用于释放资源,在IO流操作和数据库操作中会见到

面试题:
final,finally和finalize的区别
final:
修饰类:该类不能被继承
修饰变量:自定义常量
修饰方法:该方法不能被重写
finally:
和try语句一起使用,finally里面的语句一定会被执行,用于释放资源。
finalize():
定义在Object的一个方法,当垃圾回收器回收该对象时,会自动调用该对象的finalize方法。

如果catch里面有return语句,请问finally的代码还会执行吗?

自定义异常:
a. 继承Exception: 编译期异常
继承RuntimeException: 运行时异常
b. 提供构造方法
MyException();
MyException(String message);

异常的注意事项:
子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。
如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常
如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws
(针对编译期异常)
子类不能比父类更坏,一代更比一代强

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值