异常与错误处理

本文深入讲解Java异常处理机制,包括异常分类、捕获、自定义异常等核心概念,并探讨异常处理的最佳实践。

异常这部分含有的内容并不是很多。首先了解一下,什么是异常,异常都有哪些,再来看看如何捕获异常。
当java提供的异常不够用时如何创建我们自己的异常,我们是怎么样查看异常从哪里抛出, 以及我们应该如何来使用异常机制。

好,开始。

 

java异常处理概述

java的原则是让有危险的代码不能运行,因此它实现了类似于c++的异常机制。异常一旦发生,会在
堆上创建一个异常对象,终止当前的执行路径,由异常处理机制接管程序,寻找参数与异常类型相匹配的第一个catch,进行处理。
异常的分类

如下图:
                                                                                         |-StackOverflowError
                                                    |-VirtualMachineError-----|..........
                                                    |                                    |-OutOfMemoryError
                        |-    Error-----|    ......                                   
                        |                            |   
                        |                            |-AssertionError
Throwable---|                                                                  |-ArithmeticException 运算异常,比如整数除0
                        |                                                             |-ClassCastException
                        |                            |-RuntimeException----|.......
                        |                            |                                |-IndexOutOfBoundsException
                        |                            |                                |-NullPointerException
                        |-Exception---|    .......   
                                                     |-SQLException           
                                                     |                              |-EOFException
                                                     |-IOException---------|....
                                                                                    |-FileNotFoundException
上面这些都是常用的异常了,看着很多,其实只分三类:

  • Error.系统或者虚拟机错误,不需要程序员关注。
  • RuntimeException.运行时异常,也叫为检查异常,为啥叫未检查异常呢,因为在编译的时候不会进行检查,这种异常一般是由变成错误造成的,程序员需要关注。
  • 其他的Exception就是检查的异常了,因为如果有可能抛出这些异常的时候编译器会进行检查并给出提示,进行处理或者在方法的后面进行异常说明,告诉调用方法的成员有异常需要处理。

捕获异常

使用try{}catch(Exception e){}进行异常捕获捕获之后会从上往下依次匹配catch,匹配上则执行catch部分的代码。
因为匹配到第一个就会处理,所以我们要尽量把层次高的比如Exception放到最后面,并且通常情况下,catch的越精细越好。

finally

不论是否发生异常都会肯定执行的方法,通常用来关闭在try中打开的资源。
这里有一个问题,是先return还是先finally呢。看代码:

异常的常用的方法
构造器,异常有两个构造器,一个是无参的,因为异常有用的基本上只有名字了,因此不需要传入什么参数。
另一个是带有一个参数的构造器,能够给异常一些附带的信息。
异常的其他方法都是各种异常打印的方式了看例子:

构造器的参数会在getMessage();中打印出来.
printStackTrace()是打印出来异常调用栈轨迹,把你从方法调用的地方带到异常发生的地方。

 

创建自定义的异常

在程序应用框架中,我们通常会创建一些自定义的异常。因为异常只有类名和附加信息有用所以自定义
要定义自己的异常类最普通的方式是继承一个异常类,最好是相近的异常。还可以对父类中的方法进行覆盖,这样就能够打印自己需要的格式的信息。
是在比较简单就不给出例子了

 

异常链

通常情况下,如果我们捕获了异常,进行处理之后再抛出,比如在catch方法中加入throw方法,是不会影响异常栈的顺序的。
如果我们想要更新抛出点的信息则需要使用fillInStackTrace()方法了。如:

在异常信息里面加入cause by。

什么时候是用到呢,比如一个方法的方法签名声明了throw A异常。但是这个方法中却调用了可能出现NullPointerException的方法。我们用什么表达A中的异常是因为NullPointerE而出现的呢,就需要使用initCause方法了。

在方法中加入这样的代码:

AException ae = new AException()。

ae.initCause(new NullPointerException);

 

异常处理原则

异常处理的用法虽然不多,但是用不好却有可能引起很多的问题,我们应该按照一些原则尽量避免问题:

  • 注意不要造成异常的吞咽或丢失。比如没有catch只有finally,单单使用了.printSta的方法也不算是处理了异常。
  • try块不要太大。是维护的噩梦。
  • 异常类型不要太大,比如Exception,越详细越好。
  • 在不知道如何处理异常的时候可以不进行处理,把异常往上报,或者是都通过throw new RuningtimeException(e)来把被检查的异常变成未检查的异常。
  • 捕获异常后一定要注意在finally中释放资源。
  • 要考虑异常对全局的影响,是否会造成返回不完整的数据等等。

转一个比较好的内容吧

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值