异常

前言

        最近在准备校招。在这里对java基础知识做一个总结。主要使用java核心技术卷一第十版。自已在图书馆单纯看书的时候老是想睡觉,在这里自己编写边思考这种效果可能会好一点。

        对于程序的异常情况,java使用一种异常(exception handing)处理机制来捕获异常。接下来让我们一起复习异常者部分的内容

1.处理错误

        假如在一个java程序运行期间出现了一个错误。例如文件包含错误信息,数组下标越界等等。而我们希望程序发生错误后能够

    • 返回一个安全状态,并且能够让用户执行一些其他的命令

    • 允许用户保存所有的结果,并以妥善的方式终止程序

        如果某个方法不能够采用正常的途径完成他的任务,就可以以另一种路径退出。在这样的情况下程序不会返回任何值,而是抛出(throw)一个封装了错误信息的对象。需要注意的是这个方法将会立即退出,并不返回任何值。此外调用这个方法的剩余代码将无法继续执行。取而代之的是异常处理机制开始搜索能处理这个异常的异常处理器。

        异常有自己的语法和继承结构。

 

1. 1异常的分类

            java中的异常都是派生与Throwable类的一个实例。当然还可以自己还可以创建属于自己的异常类。

                                            

            Throwable下面分为两个分支一个时Error一个时Exception。而Error一般是java运行时系统内部的错误和资源耗尽错误。一般不是程序本身的问题。Exception一般分为RuntimeException(运行时异常)和其他异常。当你的程序发生 RuntimeException那就代表一定是你写的程序有问题。

 

常见的运行时异常有:数组越界异常、空指针异常、类型转换异常等。java语言规范将派生于Error或者RuntimeException类的所有异常称为非受查异常

所有的其他异常称为受查异常

 

1.2受查异常 其他异常的声明

   当我们在声明方法的时候,不仅要告诉编译器返回什么值,还要告诉他这个方法可能会发生什么样的异常。在这里我们使用throws来抛出这个异常。并且方法将不会继续执行。运行时系统根据throws抛出的什么对象,进行相应的处理。

        我们子啊声明方法的时候不用把所有的异常都声明。至于什么时候需要使用throws自句声明,什么异常必须要使用throws声明,记住以下4种情况应该抛出异常

    • 调用一个受查异常( 其他异常)。

    • 程序运行过程中发生错误,并且利用throw语句抛出一个受查异常(下一节详述)

    • 程序出现错误,例如数组越界这样的非受查异常

    • java虚拟机和运行时库出现的内部错误。

        总之一个方法必须声明方法可能发生的受查异常。而对于非受查异常要么是我们无法控制的  要么我们是可以修改的比如数组越界异常。

 

1.3如何抛出异常

        如果方法中可能发生异常。我们需要在方法后面加throws 接异常类名。然后在可能发生异常的代码处使用

      • throw new 接异常构造器。或者

      • 异常类名 e = new 异常构造器; throw e;

 

    下面是一个/ by zero整数除以0的异常

int method(int n) throws ArithmeticException{

    ...

    if(n == 0){

        throw new ArithmeticException(“不能被零整除”);

    }

    return 10/n;

}

 

        

 

对于一个已经存在的异常类:1.找到合适的异常类。2.创建异常对象。3.将对象throw

 

1.4创建异常类

 

        在很多情况下系统为我们提供的异常类依然无法满足我们的需求。这时我们可以自己创建异常类。

        我们需要做的就是定义一个派生于Excetion的类就可以了。或者派生于它的子类。一般我们创建自己的类时至少会使用两个构造器。一个是默认的无惨构造器。一个是有参的一般有来加一些描述信息比如:

                

2.捕获异常

 

        我们已经知道了如何抛出一些异常,这将会交给相应的异常处理类进行处理,程序将会终止并在控制台打印出异常类型和堆栈信息。但有一些代码我们需要捕获。

 

2.1具体的捕获异常

 

        想要捕获异常我们需要使用try/catch语句块。

    • 如果try代码块的发生了异常,并且在catch子句中说明的异常类型。那么程序将会结束try中剩下的代码。去执行catch中的代码

    • 如果try代码块的没有发生了异常,程序将会跳过catch子句。

    • 如果try代码块的没有发生了异常,并且在catch中也没有指定可能发生什么异常,那么程序将会立刻退出。

        

        当然在try中可能会发生多个异常,那么我们可以写多个catch子句每一个异常都对应一个catch

 

        

 

try{

    ...

}catch(异常1 e){

    ...

}catch(异常2 e){

    ...

}catch(异常3 e){

    ...

}

 

使用e.getMessage()可以获取异常本身有关的信息。e.getClass().getName()可以得到异常的实际类型

 

当然我们也可以合并 catch语句

 

try{

    ...

}catch(异常1 | 异常2 e){

    ...

}catch(异常3 e){

    ...

}

 

但是这种写法的前提是异常1 和异常2不能有继承关系。

 

2.2finally子句

 

的前当我们抛出一个异常的时候,就会终止剩余的代码。并退出这个方法的执行。无论有没有异常发生。finally子句中的代码都会执行。

try{

    1

    代码...

    2

}catch(异常 e){

    3

    代码...

    4

}finally){

    5

    代码...

    

}

6

 

有下面3种情况会执行finally代码

    • 代码中没有异常。将不会执行catch中的代码。执行顺序为1256;

    • try中的代码发生异常。如catch没有抛出(throw)则1,3,4,5,6。。若抛出异常则1,2,3,5将不会再执行4和6

    • 如果代码抛出一个异常但这个异常不是catch子句捕获的。程序将会执行try知道throw为止。然后执行finally 执行15

还有一点需要注意的是:如果try和finally中都有return语句。先执行try中return之前的语句。然后执行finally中的语句。当这时遇到return。就会覆盖try中的return语句。

 

 

3.常见问题

3.1Exception和Error有什么区别?

        

        Exception和Error都是继承了Throwable类,在Java中只有Throwable类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。Exception和Error体现了Java平台设计者对不同异常情况的分类。Exception是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。Error是指在正常情况下,不大可能出现的情况,绝大部分的Error都会导致程序(比如JVM自身)处于非正常的、不可恢复状态。既然是非正常情况,所以不便于也不需要捕获,常见的比如OutOfMemoryError之类,都是Error的子类。Exception又分为可检查(checked)异常和不检查(unchecked)异常,可检查异常在源代码里必须显式地进行捕获处理,这是编译期检查的一部分。前面我介绍的不可查的Error,是Throwable不是Exception。不检查异常就是所谓的运行时异常,类似 NullPointerException、ArrayIndexOutOfBoundsException之类,通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译期强制要求

 

这里整理了异常相关的面试题

https://www.cnblogs.com/huajiezh/p/5804975.html

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值