面试题答案
一键面试- 自定义受检异常:
- 在Java中,自定义受检异常需要继承
Exception
类(因为Exception
类及其子类,除了RuntimeException
及其子类外,都是受检异常)。 - 例如,假设我们定义一个数据库读取相关的受检异常:
- 在Java中,自定义受检异常需要继承
public class DatabaseReadException extends Exception {
public DatabaseReadException(String message) {
super(message);
}
public DatabaseReadException(String message, Throwable cause) {
super(message, cause);
}
}
- 使用异常链处理数据库读取错误:
- 连接数据库失败:
- 通常在Java中使用JDBC连接数据库。如果连接失败,JDBC会抛出
SQLException
。我们可以在自己的业务逻辑中捕获SQLException
,并使用异常链包装成我们自定义的DatabaseReadException
。
- 通常在Java中使用JDBC连接数据库。如果连接失败,JDBC会抛出
- 连接数据库失败:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DatabaseReader {
public static void main(String[] args) {
try {
Connection connection = getDatabaseConnection();
// 后续数据库操作代码
} catch (DatabaseReadException e) {
e.printStackTrace();
}
}
private static Connection getDatabaseConnection() throws DatabaseReadException {
try {
// 这里是实际的连接数据库代码,假设数据库URL等信息正确设置
return DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password");
} catch (SQLException e) {
throw new DatabaseReadException("连接数据库失败", e);
}
}
}
- SQL语句执行错误:
- 当执行SQL语句时,如果出现错误,
Statement
或PreparedStatement
的执行方法会抛出SQLException
。同样地,我们可以捕获它并包装成DatabaseReadException
。
- 当执行SQL语句时,如果出现错误,
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DatabaseReader {
public static void main(String[] args) {
try {
Connection connection = getDatabaseConnection();
ResultSet resultSet = executeQuery(connection, "SELECT * FROM users");
// 处理结果集代码
} catch (DatabaseReadException e) {
e.printStackTrace();
}
}
private static Connection getDatabaseConnection() throws DatabaseReadException {
try {
return DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password");
} catch (SQLException e) {
throw new DatabaseReadException("连接数据库失败", e);
}
}
private static ResultSet executeQuery(Connection connection, String sql) throws DatabaseReadException {
try {
PreparedStatement preparedStatement = connection.prepareStatement(sql);
return preparedStatement.executeQuery();
} catch (SQLException e) {
throw new DatabaseReadException("SQL语句执行错误", e);
}
}
}
- 异常处理:
- 在调用可能抛出
DatabaseReadException
的方法时,必须进行异常处理。可以使用try - catch
块捕获异常,并根据需要进行处理,例如记录日志、向用户显示友好的错误信息等。
- 在调用可能抛出
try {
// 调用可能抛出DatabaseReadException的方法
someDatabaseOperation();
} catch (DatabaseReadException e) {
System.err.println("数据库读取出现问题: " + e.getMessage());
e.printStackTrace();// 打印异常栈信息,方便调试
// 如果异常链存在,可以获取原始异常
Throwable cause = e.getCause();
if (cause instanceof SQLException) {
SQLException sqlException = (SQLException) cause;
// 可以进一步处理SQLException的具体错误信息,如错误码等
System.err.println("SQL错误码: " + sqlException.getErrorCode());
}
}
通过以上步骤,我们在Java中自定义了受检异常,并利用异常链准确传递和处理了数据库读取过程中的错误信息。