广州开发区建设局网站黄埔,网络服务平台技术包括,wordpress百度地图,羽毛球赛事2022赛程1. 异常的定义#xff1a;
在Java中#xff0c;异常#xff08;Exception#xff09;是在程序执行过程中可能出现的错误或意外情况。异常可以分为两种类型#xff1a;受检异常#xff08;Checked Exception#xff09;和未受检异常#xff08;Unchecked Exception
在Java中异常Exception是在程序执行过程中可能出现的错误或意外情况。异常可以分为两种类型受检异常Checked Exception和未受检异常Unchecked Exception。
所谓异常就是一个一个的类他们之间存在着父子类关系如下图所示 2. 异常的分类 受检异常Checked Exception 受检异常是指在编译时必须进行处理的异常。它们是 Exception 的子类不包括 RuntimeException 和其子类通常表示程序能够合理预料和处理的情况如文件未找到、网络连接中断等。受检异常必须通过 try-catch 块或者在方法签名中使用 throws 关键字声明否则编译器将报错。 未受检异常Unchecked Exception 未受检异常也称为运行时异常RuntimeException及其子类。它们通常表示程序运行时出现的错误如空指针异常NullPointerException、数组越界异常ArrayIndexOutOfBoundsException等。未受检异常不要求显式地捕获或者声明因为它们通常是由程序逻辑错误引起的应该在代码中避免。 受检异常
特点和处理方式 必须处理或声明 受检异常必须在代码中显式处理否则编译器将会报错。这是Java编译器强制执行的规定以保证程序在可能出现问题的地方有预防措施。 常见的受检异常 IOException处理输入输出流时可能抛出的异常如文件未找到、文件读写错误等。SQLException操作数据库时可能抛出的异常。ClassNotFoundException试图加载类时找不到该类时抛出的异常。FileNotFoundException尝试打开一个不存在的文件时抛出的异常。 异常处理方式 a. 使用 try-catch 块
try {// 可能抛出受检异常的代码块FileReader file new FileReader(file.txt);// 其他可能抛出异常的操作
} catch (FileNotFoundException e) {// 处理异常的代码e.printStackTrace();
} catch (IOException e) {// 处理其他IO异常的代码e.printStackTrace();
} 在 try 块中放置可能抛出异常的代码每个 catch 块用于捕获不同类型的异常并在捕获到异常后执行相应的处理逻辑。
b. 使用 throws 关键字抛出异常
方法签名中使用 throws 关键字声明方法可能抛出的受检异常。这样做可以将异常向上层调用者传递由调用者处理。
public void readFile() throws IOException, FileNotFoundException {FileReader file new FileReader(file.txt);// 其他可能抛出异常的操作
} 调用 readFile() 方法时调用者必须要么在其内部使用 try-catch 块处理异常要么在其方法签名中继续向上抛出异常。 适用场景 当方法中有可能出现会影响程序正常运行的情况时应该使用受检异常。这种异常通常要求程序员预见可能的问题并在代码中进行相应的处理以保证程序的稳定性和可靠性。 最佳实践 在处理受检异常时建议不仅仅是简单地打印堆栈信息而是根据具体情况采取适当的措施比如向用户报告错误、进行重试、回滚操作等以便尽可能地恢复正常的程序执行状态。
未受检异常
特点和处理方式 不需要显式处理或声明 Java编译器不会强制要求在代码中捕获或声明未受检异常这使得程序员在处理逻辑上更加灵活但也需要注意避免因未捕获的异常导致程序意外终止。 常见的未受检异常 NullPointerException当引用为空null时尝试调用其方法或访问其属性时抛出。ArrayIndexOutOfBoundsException尝试访问数组中不存在的索引位置时抛出。ArithmeticException数学运算异常如除以零。IllegalArgumentException方法接收到非法参数时抛出。ClassCastException类型转换异常在类型转换时发生类型不兼容时抛出。 异常处理方式 尽管未受检异常不要求强制处理但好的编程实践是在可能引发这些异常的地方进行适当的逻辑检查以避免程序出现异常状态。如果未捕获的未受检异常发生通常会导致程序异常终止并打印异常堆栈信息这可以帮助定位问题所在。 适用场景 未受检异常通常表示程序员在代码逻辑中出现了错误或者未能预料到的情况。例如当方法要求传入的参数为非空时却接收到了空值可以抛出 NullPointerException。这种异常通常需要通过改进代码逻辑来避免而不是依赖于异常处理机制。 最佳实践 在编写代码时应该注意对可能导致未受检异常的情况进行检查和预防尽量避免程序运行时因为这类异常而意外终止。对于可能引发未受检异常的方法可以通过文档、注释或者断言等手段来说明其预期的使用条件以便其他开发人员正确使用。 3. 异常的处理
捕获异常try-catch
使用 try 块包裹可能会引发异常的代码然后通过 catch 块捕获特定类型的异常并处理它们。
try {// 可能抛出异常的代码块int result 10 / 0; // 这里会抛出 ArithmeticException
} catch (ArithmeticException e) {// 处理算术异常的代码System.out.println(除数不能为零);
} catch (Exception e) {// 捕获其他类型的异常e.printStackTrace();
}
try 块中的代码在执行时如果抛出了 ArithmeticException 异常例如除以零程序会跳到对应的 catch 块中执行处理逻辑。 抛出异常throw
当方法内部无法处理某些异常情况时可以使用 throw 关键字显式地抛出异常对象将异常传递给调用者处理。
public void withdraw(double amount) throws InsufficientFundsException {if (amount balance) {throw new InsufficientFundsException(余额不足);}// 执行取款操作balance - amount;
}
在上述例子中如果取款金额大于账户余额则抛出自定义的 InsufficientFundsException 异常。 使用 finally 块 FileInputStream file null;
try {file new FileInputStream(file.txt);// 读取文件
} catch (FileNotFoundException e) {e.printStackTrace();
} finally {// 关闭文件流确保资源得到释放if (file ! null) {try {file.close();} catch (IOException e) {e.printStackTrace();}}
} finally 块用于执行无论是否发生异常都需要执行的代码比如资源释放操作如关闭文件、数据库连接等。
使用 try-with-resourcesJava 7
当需要处理的资源实现了 AutoCloseable 或 Closeable 接口时可以使用 try-with-resources 语句自动关闭资源。
try (FileInputStream file new FileInputStream(file.txt)) {// 读取文件
} catch (IOException e) {e.printStackTrace();
}
在 try 后面的括号中声明资源程序结束时会自动调用其 close() 方法无需手动关闭资源。
异常处理的最佳实践
选择合适的异常处理方式根据具体情况选择 try-catch、throw、finally 或 try-with-resources 等方式。准确捕获异常捕获尽可能具体的异常类型避免过于宽泛的 catch (Exception e) 形式。避免捕获过多尽可能在能够预见和处理异常的地方捕获和处理而不是在整个应用程序的最高层捕获所有异常。异常信息的处理合理利用异常信息提供的堆栈信息帮助调试和定位问题。保持代码清晰异常处理应与正常逻辑分开保持代码的清晰和可读性。