异常的概念
最近重新学习了java,以下是对java异常处理的一些总结
1.java异常是java提供的用于处理程序中错误的一种机制。
2.所谓错误是指在程序的运行的过程中发生的一些异常事件(如:除0溢出,数组下标越界,所要读取的文件不存在)。
3.设计良好的程序应该在异常发生时提供处理这些错误的方法,使得程序不会因为异常的发生而阻断或产生不可预见的结果)。
4.java程序的执行过程中出现异常事件,可以生成一个异常类对象,该异常对象封装了异常事件的信息并被提交给java运行时系统,这个过程称为(throw)抛出异常。
5.java运行时系统收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交其处理,这一过程称为捕获(catch)异常。
以下是简单的一个数组下标越界异常的捕获;
public class TestEx {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
int[] arr = {1 , 2 , 3 };
System.out.println(arr[4]);
} catch (Exception e) {
System.out.println(e.getMessage());// 输出具体错误在什么地方,这里输出是4
}
}
异常的分类
实际上,j2dk中定义了很多异常类,这些类对应了各种各样可能出现的异常事件,所有的异常类直接或间接的父类是Throwable(不用记)。
Throwable类下主要的类是Error类和Exception类,这个体系有个特点,就是Throwable及其子类都具有可抛性。
Error错误是指java虚拟机出错,这种情况是我们处理不了的错误。
Exception错误我们能够处理的异常,Exception里还有一类经常发生的异常类RuntimeException,这种类型我们可以不用必须捕捉 。
catch语句
在catch语句中是对异常进行处理的代码,每个try语句块可以伴随着一个或多个catch语句,用来处理可能产生的不同类型的异常对象,在catch语句中可以使用该对象的一些方法获取这些信息。
例如:getMessage()方法,用来得到有关异常事件的信息。
printStackTrace()方法,用来跟踪异常事件发生时执行退栈的内容。
finally语句
finally语句主要主要是为异常提供一个统一的出口。
通常finally语句用来进行资源的的清除工作,如关闭打开的文件,删除临时文件。
声明方法抛出异常
这里简单写
比如我某个方法无法处理这个异常,那我们可以抛出这个异常,void aa() throw IOException{ . . . },当然其他方法想要调用这个方法需要catch这个异常,也可以继续向外抛异常。main()方法也可以抛出异常,交给java运行时系统。
throw和throws的区别
1.throw用在方法体内,throw是语句抛出一个异常(对象);throws是用在方法声明后面,表示再抛出异常,由该方法的调用者来处理。
2.throw是具体向外抛异常的,抛出的是一个异常实例(代码中对应的有model);throws声明了是哪种类型的异常,使它的调用者可以捕获这个异常。
3.throw,如果执行了,那么一定是抛出了某种异常;而throws表示可能出现。
4.同时出现的时候,throws出现在函数头,throw出现在函数体,两种不会由函数处理,真正的处理由函数的上层调用处理。
自定义异常
自定义异常的好处在于可以自己规定异常现象,自定义异常类的使用有三步:
(1)封装好一个Exception类的子类。
(2) 在某类的方法声明处用throws 将该类抛出,并在该方法的方法体中使用throw 语句抛出该异常对象,导致该方法中断执行。
(3)程序在调用此方法时必须将该方法放在try-catch-finally 复合语句中进行捕获异常并处理异常。以下是简单的自定义异常;
//封装Exception的子类
public class MyException extends Exception {
public void message() {
System.out.println("该值小于60了哦")
}
}
class Myscore {
void score(int aint) throws MyException {
if(aint<60) { //表示若aint<60便创建一个异常对象并抛出该对象。
MyException ex = new MyException();
throw ex;
}
}
// main方法调用
public static void main(String[] args) {
Myscore s = new Myscore();
try {
s.score(40);
} catch(MyException e) {
e.message();
}
}
}
``