Java中的异常处理

简介

        异常,是Java中非常常用的功能,它可以简化代码,并且增强代码的安全性。程序运行的环境是复杂的,程序在执行过程中可能遇到各种错误。如程序打开的文件不存在、网络连接遇到中断、除零操作、操作数越界等等。方法执行中遇到意外/例外/异常的情况/条件,称为异常(事件)。意外情况可能是不恰当的外部环境,可能是方法调用者传递了不恰当的实参——即错误环境或非法参数

异常处理机制
         常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽最大可能恢复正常并继续执行,且保持代码的清晰,具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。
异常继承体系思维导图
        

  • Throwable类是整个Java异常体系的超类,所有的异常类都是派生自这个类。包含Error和Exception两个直接子类。
  • Error表示程序在运行期间出现了十分严重、不可恢复的错误,在这种情况下应用程序只能中止运行,例如JAVA虚拟机出现错误。在程序中不用捕获Error类型的异常。一般情况下,在程序中也不应该抛出Error类型的异常。
  • Exception是应用层面上最顶层的异常类,包含RuntimeException(运行时异常)和 Checked Exception(受检异常)。
               RuntimeException 是一种Unchecked Exception,即表示编译器不会检查程序是否对RuntimeException作了处理,在程序中不必捕获RuntimException类型的异常,也不必在方法体声明抛出RuntimeException类。一般来说,RuntimeException发生的时候,表示程序中出现了编程错误,所以应该找出错误修改程序,而不是去捕获RuntimeException。常见的RuntimeException有NullPointException、ClassCastException、IllegalArgumentException、IndexOutOfBoundException等。
        Checked Exception是相对于Unchecked Exception而言的,Java中并没有一个名为Checked Exception的类。它是在编程中使用最多的Exception,所有继承自Exception并且不是RuntimeException的异常都是Checked Exception。JAVA 语言规定必须对checked Exception作处理,编译器会对此作检查,要么在方法体中声明抛出checked Exception,要么使用catch语句捕获checked Exception进行处理,不然不能通过编译。常用的Checked Exception有IOException、ClassNotFoundException等。

异常处理流程
  1.       当程序抛出异常之后,首先,同Java中其他对象创建一样,将使用new在堆上创建异常对象。然后,当前执行路径(它不能继续执行下去)被终止,并且从当前环境中弹出对异常对象的引用。从此,异常处理机制接管程序,并开始寻找一个合适的地方来继续执行此程序。
  2.       当异常处理机制搜寻到与异常类型匹配的处理程序时,会捕获声明的异常以及所有从它派生的异常,一旦找到匹配的处理程序之后,就不会继续查找。
异常处理关键字

捕获

        try: 执行可能产生异常的代码

        Catch: 异常捕获

        Finally: 无论是否发生异常总能执行的代码

抛出

        Throw: 手动抛出异常

        Throws: 声明方法可能要抛出的各种异常

使用try、catch、finally的三种情况:

1.程序正常运行(不经过catch):

2.程序发生异常,经过catch且异常匹配:

3.程序发生异常,但是不能被catch和catch的不匹配:

如果出现不能被catch那么程序就会报错,将异常往上抛,抛给JVM。

上面讲的是一段代码只有一种异常的最简单的情况;更多的时候一段代码不止一种异常:

这里的try中有多行代码,可能出现的异常有多种:数学异常,String字符串的空指针异常,在try中如果出现了异常时,会在catch中寻找对应可以解决的catch块,但是如果将exception放在三个catch的最前面,就会报错,因为exception是所有异常的超类,出现异常必然会进入到exception中,后面的两个catch就会失效了


使用throw和throws:

在java本身的语法中就是对异常执行抛出的动作,java本身的语法 会把异常一层一层的往上抛,方法中出现了异常,则会把异常抛给调用它的主函数,主函数无法解决,就会把异常再次往上抛出,最后抛到JVM导致JVM死掉。


使用throws抛出的运行时异常相当于提示调用者,该方法有风险,至于是否处理该风险,由调用者决定;如果throws抛出的是检查时异常,那么调用者自己就必须在调用的时候进行处理(利用try ... catch),当然通过throws可以同时抛出多个异常.

运行时异常:

捕获:

 

特别提醒:在try... catch...  finally中 finally最好不省略,因为finally是保证程序是否发生异常,都必须执行的代码(即使我们在try块中强行return之后,finally中依然会执行),(例如我们在I/O流里面,必须做的关闭操作就应该放在finally中  ||需要强调的是:唯一能终止finally执行的操作就是 System.exit(0); 及其它相关类似操作,这一类操作是直接终止程序的运行,关闭JVM

如果在finally中发生异常的话,照样也会程序中断,因为没有人处理这个异常。

抛出:

Throw表示手动抛出一个异常,throws是声明该方法可能会抛出的异常(运行时异常调用者不用必须处理;只是知道这里会抛出这样一个异常)


检查时异常:

捕获:

printStackTrace是打印异常堆栈,但是一般我们不建议打印异常堆栈(IDE工具里JVM默认生成的),具体问题具体处理,一层一层的打印堆栈是比较耗性能的。


抛出:

如果抛出的是检查时异常那么就必须被处理,要么在手动抛出的地方立马用try catch进行处理,要么继续往上抛,抛给调用这个方法的方法或者主函数,如下例:

 

参考大神:https://blog.youkuaiyun.com/qq_36791569/article/details/78186428

详细了解:http://www.importnew.com/26613.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值