关键词

Java经典面试题汇总:异常

Java经典面试题汇总:异常

常见的异常类型

Java中常见的异常有三类:

  1. Checked Exceptions 受检异常
  2. Runtime Exceptions 运行时异常
  3. Errors 错误

Checked Exceptions

Checked Exceptions 又称为受检异常,是在编译阶段就被检测出来的异常。他们必须要被捕捉处理或者是被声明抛出。如 IOExceptionSQLException等等。

Runtime Exceptions

Runtime Exceptions 又称为运行时异常,是在程序运行时才能被捕获的异常。它们可以直接通过 throw 关键字抛出,也可以通过 Java 运行时系统检测出来。如 NullPointerExceptionArrayIndexOutOfBoundsException等等。

Errors

Errors 错误是无法被恢复和处理的异常,是由于 JVM 运行引起的。如 OutOfMemoryErrorStackOverflowError等等。

Java中的异常处理方式

Java中主要用 try-catch 语句来进行异常处理,可以选择性地使用 finally 关键字进行资源释放或者是清理工作。

try-catch-finally

每一个 try 块可以有多个 catch 语句和一个 finally 块。try 块中的程序代码被执行的过程中,倘若异常抛出,便跳转到 catch 块,在 catch 块中进行异常处理。

finally 块中的程序无论如何都会被执行,它的作用主要用来进行资源释放和清理工作,如关闭文件句柄、释放数据库连接等等。

下面是一个 try-catch-finally 的示例:

try{
    // 可能抛出异常的代码
} catch (SomeException ex) {
    // 处理异常的代码
} finally {
    // 执行清理工作
}

finally的特定用法

finally 根据数据类型的不同又可细分为如下三种:

  1. 处理在 trycatch 中可能出现的异常。
  2. 关闭数据库连接或文件句柄等清理工作。
  3. 在程序中抛出异常后,其中的代码将仍然执行。

下面是一些具体的 finally 的示例:

  1. 处理在 trycatch 中可能出现的异常。
FileOutputStream file = null;
try {    
    file = new FileOutputStream("file.txt");
    file.write("Hello World".getBytes());
    // 执行其他业务代码
    int i = 1 / 0; // 这里故意除数是 0,就会抛出异常
} catch (IOException e) {
    e.printStackTrace();
    // 处理 IOException 异常
} catch (ArithmeticException e) { // 捕捉 ArithmeticException 异常
    e.printStackTrace();
    // 处理发生的异常
} finally {
    try {
        file.close(); // 释放资源或者是清理工作
    } catch (IOException e) {
        e.printStackTrace();
    }
}

在以上代码中,在 try-catch 块中执行文件的输入输出和其他业务,当发生异常时,会捕捉异常,并在 catch 语句中对异常进行处理,在 finally 语句中清理文件句柄等内存资源。

  1. 关闭数据库连接或文件句柄等清理工作。
public void resourceManage() {
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    try {
        conn = getConnection();
        stmt = conn.createStatement();
        rs = stmt.executeQuery(SQL_QUERY);
        while (rs.next()) {
            // 业务逻辑的处理
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        try {
            if (rs != null) {
                rs.close();
            }
            if (stmt != null) {
                stmt.close();
            }
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException se) {
            se.printStackTrace();
        }
    }
}

在以上代码中,在 try-catch 块中进行SQL语句的查询,并在 finally 语句中对三个资源进行关闭操作,释放资源或者是清理工作。

  1. 在程序中抛出异常后,其中的代码将仍然执行。
public int sum(int a, int b) {
    try {
        int c = a / b;
        return c;
    } catch (Exception e) {
        return -1;
    } finally {
        System.out.println("sum() was executed");
    }
}

在以上代码中,在 try-catch 块中进行实数的除法,当出现异常时,返回一个 -1。在 finally 语句中输出信息,即使在 catch 语句块中 return 语句返回的结果与 finally 块无关,也会在 finally 块中执行。

总结

Java 中的异常处理主要采用 try-catch-finally 的方式,其中 try-catch 块用来处理捕获的异常。finally 块用于释放资源和清理工作。根据 finally 的不同用法可以分为如下三种:处理在 trycatch 中可能出现的异常、关闭数据库连接或文件句柄等清理工作和在程序中抛出异常后,其中的代码将仍然执行。

以上是 Java 异常处理的完整攻略。

参考:

  1. Java异常处理完全指南
  2. Java 异常

本文链接:http://task.lmcjl.com/news/13234.html

展开阅读全文