1.Java异常的概念
- 异常的例子
- 1.除法就是一个需要捕获异常的例子,除数又可能是0
- 异常处理的基本流程如下
- 一旦发生异常,就使得程序不按照原来的流程继续的运行下去
- a.程序抛出异常
-
- try{
- throw new Exception();
- }
-
- b.捕获异常
-
- catch(Exception e){
- //异常处理程序
- }
- catch(Exception e){
-
- c.finally代码块
- 必须注意的是:在finally块中不能抛出异常。
-
- finally{
- //一定会被执行
- //除非catch中有System.exit(0);会推出Java虚拟机
- }
- finally{
-
- 总结:
- 1.当程序中抛出一个异常后,程序从程序中导致异常的代码处跳出,java虚拟机检测寻找和try关键字匹配的处理该异常的catch块,如果找到,将控制权交到catch块中的代码,然后继续往下执行程序,try块中发生异常的代码不会被重新执行。如果没有找到处理该异常的catch块,则执行finally块代码。
- 2.线程的run函数是不能抛出异常的(可以在函数内部捕获并处理,但是不能向上提交),run函数的异常被提交给uncaughtExceptionHandler处理,后变会详细介绍
- 3.出了run函数其他的函数都可以把函数中抛出的异常向上级提交。
- 异常的结构
-
图1.异常结构(来自参考文献一)
- 异常分类
- 1.UnckeckedException--Error(不准确,但是Error确实是在运行时检查并抛出的)和RunTimeException-------程序中不需要进行补货
- 2.checkedException-----IOException、ClassNotFoundException、CloneNotSupportedException
- 这里的检查不检查针对的是编译器
- 常见的RunTimeException-NullPointerException、数组越界、字符串越界、算数错误(a/b)、参数类型错误(Integer.parseInt(“abc"))
-
在声明方法时候抛出异常
- public void openFile() throws IOException{//code}
- 一般函数申明的时候抛出的异常是chenckedException
- 覆盖父类某方法的子类方法不能抛出比父类方法更多的异常,所以,有时设计父类的方法时会声明抛出异常,但实际的实现方法的代码却并不抛出异常,这样做的目的就是为了方便子类方法覆盖父类方法时可以抛出异常。
- Cathch异常
- 注意:一个try块可以处理多种类型的异常(最多只有一个catch模块会被执行,与switch不相同)
- 逻辑上一个try后处理多个异常会报错—下面的代码会报错[先catch子类异常,之后再catch父类异常]
- 因为后一个catch不可能被执行到
-
- try{
- //code
- }catch(Exception e){
- }catch(RuntimeException e){//报错一定不会被执行到
- }
-
- 自定义异常---就是继承自已有的异常
- 最重要的其实是异常的名字
- class MyException extends Exception{}
- 默认的构造函数
- 1.super() 调用基类的构造函数进行初始化
- 2.super(message)
参考文献:http://www.codeceo.com/article/java-exception-learn.html#0-tsina-1-56987-397232819ff9a47a7b7e80a40613cfe1