浅析Java异常处理机制

异常处理是Java中唯一正式的错误报告机制,是通过编译器强制执行的。在这篇博客中我将简单的介绍一下Java的异常处理机制。

一:异常类与异常处理步骤

在Java的程序运行过程中,可能会出现一些异常情况,例如:在做除法运算的时候除数为0。但是除数为0又有什么含义呢?有的时候我们可以通过当前的问题环境来得知该如何。但是如果出现了一些我们也不知道如何处理的异常,那么在这个时候我们就要抛出异常,而不是继续执行下去。

在抛出异常时,会发生如下几件事情:

1:用new在堆上创建一个异常对象;

2:当前的执行路径被终止,并且从当前环境中弹出对异常对象的引用;

3:异常处理机制接管程序,使用异常处理程序继续执行程序;

异常处理程序:它的任务是将程序从错误状态中恢复,使程序要么从错误状态中恢复,换一种方式继续运行。要么继续运行下去。

首先举一个简单的例子,对于对象的引用A,可能A传给你的时候它还没有初始化,所以在使用它的时候会对它进行检查。如果它为空,那么就会创建一个代表其错误信息的对象,并且将它从当前环境抛出,这样的话,错误信息就会被传递到别的环境了。就像这样

  Main A = null;
        if(A == null){
            throw new Exception();
        }

这样的话,当前的环境就用在担心这个异常了,它已经在别的地方得到了处理。

这里的new Exception我作下解释:


Throwable类是异常类型的根类,我们现在只需要关注Exception类和Error类就行了。Error类描述了Java 运行时的内部错误和资源耗尽错误。应用程序不会抛出这种异常,如果出现这种异常,那么除了告知用户并使程序安全终止之外,没有其他的办法。不过这种异常情况很少出现。

我们常见的异常类型都出自Exception类的子类,如图所示,在Exception类下又有两个子类:RuntimeException类和IOException类。

由于程序的错误而导致的异常属于RuntimeException;但是如果程序本身没有问题,由I/O错误这样的问题导致的异常属于IOException。

Java将派生于Error类和RuntimeException类的所有异常称为非受查异常,所有其他的异常称为受查异常。


二:异常参数与异常捕获

用 new 创建的异常对象位于堆上。所有标准异常类都有两个构造器,一个是默认构造器;另一个是接受字符串作为参数,以便能把相关信息放入异常对象的构造器(主要用于创建自定义对象)

异常捕获:

关于异常是如何被捕获的,我们要理解一下监控区域的概念:它是一段可能会产生异常的代码。并且它的后面紧跟可以处理这些异常的代码。

try块:

如果方法的内部抛出了一个异常(或者是该方法内部调用的其他方法抛出了异常),这个方法将在抛出异常的过程中被结束。要是不希望方法就这样结束。那么可以在方法内部 “尝试” 各种(可能产生异常的代码块或者方法)。这就是try块:紧跟try关键字后的代码块。

我们可以把所有可能产生异常的代码放在try块里,然后我们只需要在一个地方统一捕获所有异常。可以明确分离开完成任务的代码与可能产生错误的代码。

异常处理程序(catch):

我们抛出的异常必须得到处理,这个处理的地方就是异常处理程序:异常处理程序紧跟在try块之后,用关键字catch表示。

当异常被抛出后,异常处理机制将负责搜寻与参数与异常类型相匹配的第一个处理程序。然后进入对应的catch子句执行。此时,系统认为异常已经得到了处理。一旦catch子句结束,则处理程序的查找过程结束。只有匹配的catch子句才会被执行,try块的内部,可能会产生许多类型相同的异常。我们只需要在catch块里提供一个针对此类型错误的异常处理程序就可以了。

异常的处理格式如下

        try{
            //可能会出现异常的语句
        }catch (//异常类 对象){
            //捕获之后的操作
        }finally {
           //异常的出口
        }

finally不管有没有异常产生,finally块里的代码一定会被执行。

这三种关键字的组合:try......catch   try......catch......finally   try......finally

如果我们想要知道到底出现了什么异常,为了明确的输出异常信息,可以直接输出异常类对象。或者可以调用异常类中提供的printStackTrace()方法进行完整的异常信息的输出。

throws:在进行方法定义的时候,如果要告诉调用者本方法会产生哪些异常,我们可以用throws关键字来声明,意思是:如果该方法出现了问题,我不希望在本方法内部处理这个错误,就使用throws抛到调用本方法的地方。如果出现问题的是主方法,那么异常就会被抛到JVM里来处置。

不过,在实际使用中我们可以先声明方法将会抛出异常,但实际上却并不抛出,编译器会相信这个声明。并强制此方法的用户像真的抛出异常一样使用这个方法。这样做的好处是:我们可以先为异常占一个位置,以后就可以抛出异常而不修改原来的代码。

我先总结到这里,后续会有补充。




猜你喜欢

转载自blog.csdn.net/qq_38449518/article/details/79997074