目录
一、异常的概念
java异常是指java提供的用于处理程序运行过程中错误的一种机制
所谓错误是指在程序运行的过程中发生的一些异常事件(如:除0溢出,数组下标越界,索要读取的文件不存在等)
设计良好的程序应该在异常发生时提供处理这些错误的方法,是的程序不会因为异常的发生而阻断或产生不可预见的结果
java程序的执行过程中如出现异常事件,可以生成一个异常类对象,该异常对象封装了异常事件的信息并将被其提交给java运行系统,这个过程成为抛出(throw)异常
当java运行时系统接受到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程成为捕获(catch)异常
//一个捕获异常的示例 public class test { public static void main(String args[]) { try { System.out.println(2/0); } catch (ArithmeticException ae) { System.out.print("运行出错!"); } } }
二、异常的分类
Throwable:可被抛出的
Error:系统错误,做自己处理不了的
Exception:自己可以做处理的,可以catch的
RuntimeExpetion:经常出的错误(这种错误可以catch,也可以不catch)
还有一种exception是必需要去捕获的
三、异常的捕获和处理
try { //可能抛出异常的语句 } catch ( SomeException1 e ) { ...... } catch ( SomeException2 e) { ...... } finally { ...... }
- try代码段包含可能产生异常的代码
- try代码段后根由一个或多个catch代码段
- 每个catch代码段声明其能处理的一种特定类型的异常并提供处理的方法
- 当异常发生时,程序会终止当前的流程,根据获取异常的类型去执行相应的catch代码段
- finally段的代码无论是否发生异常都会在最后进行执行
try{
- try语句指定了一段代码,该段代码就是一次捕获并处理例外的范围。
- 在执行过程中该段代码可能会产生并抛出一种或几种类型的异常对象,它后面的catch语句要分别对这些异常做相应的处理
- 如果没有例外产生,所有的catch代码段都被略过不执行
} catch ( ) {
- 在catch语句块中是对异常进行处理的代码,每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常对象
- 在catch中声明的异常对象(catch(someException e))封装了异常时间发生的信息,在catch语句块中可以使用这个对象的一些方法获取这些信息。
- 例如:getMessage()方法:用来得到有关异常事件的信息。printStackTrace()方法:用来跟踪异常事件发生时执行堆栈的内容。
} finally (){
- finally语句为异常处理提供一个统一的出口,是的在控制流程转到程序的其他部分以前,能够对程序的状态做统一的管理
- 无论try所指定的程序块中是否抛出例外,finally所指定的黛娜都要被执行。
- 通常在finally语句中可以进行资源的清除工作,如:关闭打开的文件,删除临时文件等
}
对于一些自己处理不了的异常或是自己不想去处理的异常,可以直接往外抛异常,这样就可以不用在代码段中加try{}catch{}
//一个抛出异常的例子 public class test { public static void main(String args[]) throws IOException { test(); } static void test() throws IOException { System.out.println(2/0); } }
//不加try...catch的另外一种抛异常方法 public class test { public static void main(String args[]) throws IOException { int i = 0; if (i == 0) { throw new IOException("出错了"); } } }
看一个例子,这就是打印的堆栈信息,虽然报错很多行,但是或许只要更改一次就可以解决:
另外在捕获异常的时候注意下面这种问题:
四、使用自定义异常
使用自定义异常一般有如下步骤:
1.通过继承java.lang.Exception类声明自己的异常类
2.在方法适当的位置生成自定义异常的实例,并用throw语句抛出
3.在方法的声明部分用throws语句声明该方法可能抛出的异常
//创建一个exception类存放自己的exception public class MyExpection extends Exception { private int id; public MyExpection (String message,int id) { super(message); this.id = id; } public int getId() { return id; } }
//测试类 public class Test { //定义一个方法 public void regist(int num) throws MyExpection { if(num < 0) { throw new MyExpection("不应该为负值", 3); } System.out.println("登记人数: "+ num); } //定义另一个方法 public void manager() { try { regist(100); } catch (MyExpection e) { System.out.println("登记失败,出错类型码="+e.getId()); e.printStackTrace(); } System.out.println("操作结束!"); } //程序入口main方法 public static void main(String[] args) { Test t = new Test(); t.manager(); } }
可以自己调试输出
注意:
当原方法有异常时重写该方法需要抛出与原方法所抛出异常类型一致的异常或不抛出异常,其他情况都无法进行重写