博客
关于我
Java:异常的捕获及处理,你懂了嘛?
阅读量:708 次
发布时间:2019-03-17

本文共 5083 字,大约阅读时间需要 16 分钟。

Java异常详解:从概念到实践

异常是Java编程中不可或缺的一部分,它用来表示程序执行过程中出现的问题。理解异常的机制,有助于我们更好地开发和调试代码。

1. 异常的概念

异常是一种导致程序中断的指令流。它可以是编译时的错误,也可以是运行时的错误。如果不对异常进行正确的处理,就可能导致程序无法正常运行,甚至引发中断指向,造成不必要的损失。

2. 异常的分类

Throwable是所有异常的父类。它包括了两种主要的异常类型:

2.1 Error:

Error表示严重的问题,这些问题通常是由Java Virtual Machine(JVM)本身抛出的。它们通常不会被程序主动处理,而是需要进行故障转换或报告。

2.2 Exception:

Exception和它的子类表示程序中的错误或异常。Exception可以分为两种类型:

2.2.1 RuntimeException:

RuntimeException及其子类都是运行时异常。这种异常不需要声明在方法签名中,可以直接在代码中抛出。然而,由于它不需要处理,程序在执行时会抛出错误。

2.2.2 其他异常:

除了RuntimeException,其他异常被称为编译时异常。这些必须在编译时声明,并且必须在代码中进行处理,否则程序无法运行。

3. 异常的结构

异常处理的结构通常采用try-catch-finally的形式。try块中包含可能抛出异常的代码,catch块处理异常,finally块执行资源释放操作。最终的代码示例如下:

public class ExceptionTest {    public static void main(String[] args) {        try {            System.out.println("结果:" + 10 / 0);        }catch (ArithmeticException e) {            System.out.println("除数不能为0");        }finally {            System.out.println("程序结束");        }    }}

4. 异常的分类与处理

4.1 try-catch结构

try可包含多个catch块。每个catch对应一种异常类型。例如:

try {    System.out.println(10 / 0);    System.out.println("数组越界");} catch (ArithmeticException e) {    System.out.println("算术异常");} catch (ArrayIndexOutOfBoundsException e) {    System.out.println("数组越界");}finally {    System.out.println("程序结束");}

4.2 三种处理方式

  • 一个try对应多个catch(多个异常处理)。
  • 多个try对应多个catch(同时处理多个异常)。
  • 一个try-catch,但catch中的异常参数类型是一个 Throwable类。例如:
  • try {    // 可能抛出多种异常} catch (Throwable t) {    System.out.println("捕获到异常");}

    5. 异常的优缺点

    优点:

    • 简化了代码结构。
    • 提供了对异常的明确处理机制。

    缺点:

    • try块内的代码执行时,必须通过异常处理机制,这可能消耗额外资源。
    • 一旦try内的代码抛出异常,后续代码不会执行。

    6. 注意事项

  • 在多个异常出现时,catch语句会按顺序处理,但如果已经处理了一个异常,后续异常将不会被处理。
  • 如果不确定具体的异常类型,可以使用 Throwable 作为公共处理类。
  • 如果异常之间有继承关系,捕获时应从底层到上层进行处理。
  • 7. JDK7及以后异常处理

    从JDK7开始,异常处理更加简化。可以将同级异常合并处理:

    try {    // 可能抛出的异常} catch (ArrayIndexOutOfBoundsException | ArithmeticException e) {    System.out.println("异常处理");}

    8. Throwable类

    Throwable 是所有异常和错误的基类。它提供了获取异常信息的方法。例如:

    public class ExceptionDemo4 {    public static void main(String[] args) {        try {            System.out.println(10 / 0);        } catch (Exception e) {            System.out.println(e.getMessage());            e.printStackTrace();        }    }}

    9. throws与throw

    9.1 throws

    throws用于方法定义时声明可能抛出的异常。它本身不会抛出异常,而是将责任转交给调用者。例如:

    public class throwsTest {    public static void main(String[] args) {        try {            method();        } catch (Exception e) {            e.printStackTrace();        }    }    public static void method() throws Exception {        System.out.println(10 / 0);    }}

    9.2 throw

    throw用于在方法体内抛出已定义的异常。它必须明确抛出一个异常对象。例如:

    public class throwDemo {    public static void main(String[] args) {        method();    }    public static void method() {        throw new ArithmeticException();    }}

    10. 异常的使用

    10.1 使用异常处理

    如果我们可以处理异常,就应该使用try-catch-finally结构。例如:

    public class ResourceDemo {    public static void main(String[] args) {        BufferedReader reader = null;        try {            reader = new BufferedReader(new FileReader("文件.txt"));            System.out.println(reader.readLine());        } catch (IOException e) {            System.out.println("错误读取文件");        } finally {            if (reader != null) {                reader.close();            }        }    }}

    10.2 使用throws

    如果我们确定方法可能抛出的异常,应该在方法签名中声明,并让调用者自己处理。例如:

    public class throwsDemo {    public static void main(String[] args) throws IOException {        String路径 = "文件路径";        Reader reader = new BufferedReader(new FileReader(路径));        System.out.println(reader.readLine());    }}

    11. finally块

    finally块总是执行,无论是否发生异常或错误。它的主要作用是释放资源。例如:

    public class finallyDemo {    public static void main(String[] args) {        try {            System.out.println(10 / 0);        }catch (Exception e) {            System.out.println("无法处理除数为0的情况");        }finally {            System.out.println("程序结束执行");        }    }}

    12. 常见面试题解答

    12.1 final、finally、finalize区别

    • final: 用于修饰类、成员变量和成员方法,表示最终状态。
    • finally: 异常处理中的关键词,表示一定要执行的代码。
    • finalize: Java垃圾回收机制中的方法,用于垃圾对象的回收。

    12.2 如果catch中有return语句,finally块是否还会执行?

    是的,finally块在return前执行。例如:

    public class finallyDemo2 {    public static void main(String[] args) {        System.out.println(method());    }    public static int method() {        try {            System.out.println(10 / 0);        }catch (Exception e) {            return 200;        }finally {            System.out.println(400);        }        return 0;    }}

    13. 自定义异常

    我们可以创建自定义异常类,继承Exception或RuntimeException。例如:

    public class MyException extends Exception {    public MyException(String message) {        super(message);    }}public class Teacher {    public void check(int score) throws MyException {        if (score > 100 || score < 0) {            throw new MyException("成绩必须在0到100之间");        } else {            System.out.println("成绩有效");        }    }}public class Student {    public static void main(String[] args) throws MyException {        Scanner输入 = new Scanner(System.in);        int 分数 =输入.nextInt();        Teacher 老师 = new Teacher();        老师.check(分数);    }}

    总结

    理解异常机制是编写高质量Java代码的核心能力之一。通过合理使用try-catch-finally结构,并正确处理异常、自定义异常,可以显著提高程序的健壮性和稳定性。在实际开发中,除了掌握理论知识,还需要多看代码案例,理解不同异常类型的处理方式,从而灵活应对各种开发场景。

    转载地址:http://gkpez.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现islower函数功能(附完整源码)
    查看>>
    Objective-C实现isPowerOfTwo算法(附完整源码)
    查看>>
    Objective-C实现isupper函数功能(附完整源码)
    查看>>
    Objective-C实现ItemCF算法(附完整源码)
    查看>>
    Objective-C实现ItemCF算法(附完整源码)
    查看>>
    Objective-C实现iterating through submasks遍历子掩码算法(附完整源码)
    查看>>
    Objective-C实现iterative merge sort迭代归并排序算法(附完整源码)
    查看>>
    Objective-C实现jaccard similarity相似度无平方因子数算法(附完整源码)
    查看>>
    Objective-C实现Julia集算法(附完整源码)
    查看>>
    Objective-C实现jump search跳转搜索算法(附完整源码)
    查看>>
    Objective-C实现jumpSearch跳转搜索算法(附完整源码)
    查看>>
    Objective-C实现k nearest neighbours k最近邻分类算法(附完整源码)
    查看>>
    Objective-C实现k-means clustering均值聚类算法(附完整源码)
    查看>>
    Objective-C实现k-Means算法(附完整源码)
    查看>>
    Objective-C实现k-nearest算法(附完整源码)
    查看>>
    Objective-C实现KadaneAlgo计算给定数组的最大连续子数组和算法(附完整源码)
    查看>>
    Objective-C实现kadanes卡达内斯算法(附完整源码)
    查看>>
    Objective-C实现kahns algorithm卡恩算法(附完整源码)
    查看>>
    Objective-C实现karatsuba大数相乘算法(附完整源码)
    查看>>
    Objective-C实现karger算法(附完整源码)
    查看>>