异常的捕获与处理

try catch格式

try{
    //可能产生异常的语句
}catch{
    ......
}catch{
    ......
}finally{
    ......
}
  • try代码后跟一个或多个catch代码段
  • 每个catch代码段声明其能处理的一种特定类型的异常,并提供处理方法
  • 当异常发生时,程序会中止当前的流程,根据获取异常的类型去执行相应的catch代码段
  • finally段的代码,无论是否发生异常,都会执行

 上图左边,语句1发生异常,就会被捕获,跳转到相应的catch语句里,语句2并不会执行

总结try语句

  • try{...}语句指定了一段代码,该段代码就是一次捕获并处理异常的范围
  • 在执行过程中,该段代码可能会产生并抛出一种或几种类型的异常对象,它后面的catch语句要分别对这些异常做相应的处理
  • 如果没有异常产生,所有的catch代码段都被忽略不执行

总结catch语句

  • catch语句块里的代码是对异常进行处理的,每个try语句块可以伴随一个或多个catch语句,用于可能产生的不同类型的异常对象
  • 在catch语句中声明的异常对象(catch(SomeException e))封装了异常事件发生的信息,在catch语句块中可以使用这个对象的一些方法获取这些信息
  • 例如:
    • getMessage()方法,用来得到有关异常事件的信息
    • printStackTrace()方法,用来跟踪异常事件发生时执行的堆栈内容

总结finally语句

  • finally语句为异常处理提供一个统一的出口,使得在控制流程转到其他的部分以前,能够对程序的状态作统一管理
  • 无论try所制定的代码块中是否抛出异常,finally语句所指定的代码块都要执行
  • 通常在fianlly语句中可以执行资源的清除工作,例如:
    • 关闭打开的文件
    • 删除临时文件
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class Test{
    public static void main(String[] args) {
        FileInputStream in = null;
        try {
            in = new FileInputStream("MyFile.txt");
            int b;
            b = in.read();
            while(b != -1) {
                System.out.println((char)b);
                b = in.read();
            }
        }catch(FileNotFoundException e){
            e.printStackTrace();
        }catch(IOException e) {
            e.getMessage();
        }finally {
            try {
                in.close();
            }catch(IOException e){
                e.printStackTrace();
            }
        }
    }
}

 上述代码有一个细节要注意,如果将IOException和FileNotFoundException交换位置,编译时会报错,因为IOException包含FileNotFoundException,所以在IOException时已经捕获了异常,但是下面FileNotFoundException又会捕获一次异常,很不合理。<font color = red>捕获异常时,先捕获小的,再捕获大的,如果两个异常并列,顺序无所谓<font color = red>

声明方法抛出的异常

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class Test{
    public static void main(String[] args) {

    }
    void m(int i) throws ArithmeticException{
        if(i == 0)
            throw new ArithmeticException("除数不能为0");
    }
    void f() throws IOException,FileNotFoundException{
        FileInputStream in = null;
        int b;
        b = in.read();
        while(b != -1) {
            System.out.println((char)b);
            b = in.read();
        }
    }
    void f2() throws Exception {
        f();
    }
}

 在当前函数抛出的异常,并不知道应该如何处理,就先将其抛出,由谁使用就由谁处理,如果使用者也不知道,就继续抛出  许多java库中的函数也有抛出异常,例如:

 上述两个是java.io包中对文件进行操作的函数,他们自己本身就有异常要抛出,所以在使用的过程中要么catch,要么继续throws

自定义异常类

  1. 通过继承java.lang.Exception类声明自己的异常类
  2. 在方法适当的位置生成自定义异常的实例,并用throws语句抛出
  3. 在方法的声明部分用throws语句声明该方法可能抛出的异常
class MyException extends Exception{
    private int id;
    public MyException(String message,int id){
        super(message);
        this.id = id;
    }
    public int getId(){
        return id;
    }
}

一些小问题

  1. 重写方法需要抛出与原方法所抛出异常类型一直的异常,或不抛出异常
class A{
    public void method() throws IOException{...}
}
class B1 extends A{
    public void method() throws FileNotFoundException{...}//Error
}
class B2 extends A{
    public void method() throws Exception{...}//Error
}
class B3 extends A{
    public void method(){...}//Right
}
class B4 extends A{
    public void method() throws IOException,MyException{...}//Error
}

总结

  • 一个图
  • 五个关键字
    • try、catch、finally、throws、throw
  • 先捕获小的,再捕获大的
  • 异常和重写的关系

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端儿

了解 JS 作用域与作用域链

不在任何函数内声明的变量(函数内省略var的也算全局)称作全局变量(global scope)

591
来自专栏java学习

面试题54(考察求职者对重载与重写的掌握)

(不定项选择题)4、A,B,C,D 中哪些是 setVar的重载? public class methodover { public void setVa...

3254
来自专栏猛牛哥的博客

aardio调用汇编代码获取返回值的方法

aardio编程软件可以对外部进程注入汇编代码,并且转换成aardio函数很方便的调用。有时候需要获取汇编代码内的某些数据,把这个数据作为aardio函数的返回...

672
来自专栏用户2442861的专栏

Java反射探索-----从类加载说起

林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka

361
来自专栏aCloudDeveloper

大神洗礼第四讲——函数相关及编程技巧

Author:bakari       Date:2012.11.2 1、参数传递问题: < 1 >、堆栈传参 < 2 >、寄存器传参(利用通用寄存器进行函数参...

18610
来自专栏null的专栏

C/C++——排序

在C/C++中的排序,使用到的函数主要有: sort() qsort() 下面详细分析sort()函数和qsort()函数。 1、sort()函数 sort()...

3174
来自专栏Android机动车

转向Kotlin——数据类和封闭类

数据类是Kotlin的一个语法糖。Kotlin编译器会自动为数据类生成一些成员函数,以提高开发效率。

672
来自专栏Android干货园

Kotlin中级(9)- - - Kotlin类之数据类、密封类、内部类.md

上面的代码我们可以看到结构出来的变脸可以直接拿来用,比如数据体Leaf中的size属性,componentN函数群会按照数据体Leaf中属性声明的顺序,从com...

652
来自专栏个人分享

Scala第一章学习笔记

  面向对象编程是一种自顶向下的程序设计方法。用面向对象方法构造软件时,我们将代码以名词(对象)做切割,每个对象有某种形式的表示服(self/this)、行为(...

802
来自专栏Java架构师历程

精选30道Java笔试题解答

都是一些非常非常基础的题,是我最近参加各大IT公司笔试后靠记忆记下来的,经过整理献给与我一样参加各大IT校园招聘的同学们,纯考Java基础功底,老手们就不用进来...

1574

扫码关注云+社区