前言
最近在准备校招。在这里对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