Java异常

Java异常

在 Java 中,异常是在程序运行过程中出现的错误情况的信号。

一、异常的分类

1.受检异常(Checked Exception):

  • 也称为编译时异常,在编译阶段必须进行处理,否则程序无法通过编译。
  • 例如IOException、SQLException等。
  • 通常是由于外部因素导致的异常情况,比如文件读取错误、数据库连接问题等。

2.运行时异常(Runtime Exception):

  • 也称为未检查异常,在编译阶段可以不进行处理。
  • 例如NullPointerException、ArrayIndexOutOfBoundsException等。
  • 通常是由于程序内部的错误导致的,比如空指针引用、数组越界访问等。

3.错误(Error):

  • 一般是由 JVM 自身的问题或者系统资源耗尽等严重问题导致的,通常无法在程序中进行处理。
  • 例如OutOfMemoryError、StackOverflowError等。

二、异常的处理机制

1.try-catch语句:

  • try块中包含可能会抛出异常的代码。
  • catch块用于捕获特定类型的异常并进行处理。可以有多个catch块来处理不同类型的异常。

例如:

try {
    // 可能抛出异常的代码
} catch (ExceptionType1 e1) {
    // 处理 ExceptionType1 异常的代码
} catch (ExceptionType2 e2) {
    // 处理 ExceptionType2 异常的代码
}

2.finally块:

  • 无论是否发生异常,finally块中的代码都会被执行。通常用于释放资源,如关闭文件、数据库连接等。

例如:

try {
    // 可能抛出异常的代码
} catch (Exception e) {
    // 处理异常的代码
} finally {
    // 释放资源的代码
}

3.throws关键字:

  • 在方法声明处使用throws关键字,表示该方法可能会抛出指定类型的异常。调用该方法的代码需要进行异常处理。

例如:

public void method() throws IOException {
    // 可能抛出 IOException 的代码
}

4.throw关键字:

  • throw用于在方法内部主动抛出一个异常对象。

例如:

public void someMethod() {
    if (someCondition) {
        throw new IllegalArgumentException("Invalid argument.");
    }
    // 其他代码
}

通常在特定条件下,当程序检测到错误情况时,可以使用throw来抛出一个异常,以便将错误信息传递给上层调用者进行处理。

三、自定义异常

可以通过继承Exception类或RuntimeException类来创建自定义异常。自定义异常可以携带特定的错误信息,以便更好地进行错误处理和调试。
例如:

class MyCustomException extends Exception {
    public MyCustomException(String message) {
        super(message);
    }
}

在使用自定义异常时,可以像使用系统内置异常一样进行抛出和捕获。

四、异常的优点

  • 提高程序的可靠性:通过捕获和处理异常,可以避免程序因错误而崩溃,提高程序的稳定性。
  • 增强程序的可读性:明确地处理异常可以使代码更易于理解,开发者可以清楚地知道可能出现的错误情况以及如何处理。
  • 方便调试:异常信息可以提供有关错误的详细信息,有助于开发者快速定位和解决问题。

扩展

1.final、finally、finalise的区别

final:用于修饰变量、方法和类:

  • 修饰变量:表示变量一旦被初始化后就不能被重新赋值。被final修饰的基本数据类型变量的值不能改变,被final修饰的引用类型变量不能再指向其他对象,但对象的内容可以改变。
  • 修饰方法:表示该方法不能被子类重写。
  • 修饰类:表示该类不能被继承。

finally

  • 用于try-catch语句块中,无论是否发生异常,finally块中的代码一定会被执行。
  • 通常在finally块中放置一些必须执行的清理代码,如关闭文件、释放数据库连接等资源。

finalize ()

  • 是Object类中的一个方法。
  • 当垃圾回收器确定不存在对该对象的更多引用时,由垃圾回收器在对象被回收之前调用该方法。
  • 一般不建议主动调用这个方法,因为垃圾回收的时间是不确定的,并且 Java 的垃圾回收机制已经足够强大,通常不需要手动干预对象的回收过程。同时,finalize()方法可能会带来一些性能问题和不确定性。

2.try-catch-finally 结构中,return 语句的执行顺序

1)执行 try 块中的代码

  • 如果没有异常发生,并且 try 块中有 return 语句,那么这个 return 语句的值会被确定,但此时并不会立即返回。
  • 如果有异常发生,程序流程会跳转到相应的 catch 块。

2)如果有异常发生并且有匹配的 catch 块:

  • 执行 catch 块中的代码。
  • 如果 catch 块中有 return 语句,这个 return 语句的值会被确定,但同样不会立即返回。

3)无论是否有异常发生,都会执行 finally 块中的代码:

  • 如果 finally 块中也有 return 语句,那么这个 return 语句会覆盖 try 块或 catch 块中确定的返回值,最终方法将返回 finally 块中的 return 值。
  • 如果 finally 块中没有 return 语句,但对要返回的变量进行了修改,那么修改后的结果也会作为最终的返回值(前提是变量是基本类型以外的引用类型,因为基本类型的值在 try 或 catch 中确定后不能被修改)。

总之,finally 块在 try-catch 结构中一定会执行,并且 finally 块中的 return 语句具有最高优先级,可以覆盖 try 块和 catch 块中确定的返回值。

posted @ 2024-10-25 16:50  Abufan  阅读(68)  评论(0)    收藏  举报