异常
-
Error
-
开发无法进行处理的异常
-
表示严重的错误,通常是由系统级问题导致的,对程序来说很难恢复
-
是由 Java 虚拟机生成并抛出的,用于表示虚拟机本身遇到的问题,如内存溢出(OutOfMemoryError)、线程死锁(DeadLockError)等
-
一般不应该被程序捕获和处理,因为这些错误通常无法修复,程序无法从中恢复
-
-
Exception
-
编译时异常
-
编译时必须进行处理的异常,需要使用 try-catch 块或声明 throws 来捕获或抛出。例如,IOException、SQLException 等
-
-
运行时异常
-
在运行时发生的异常,可以选择捕获和处理,但不强制要求。例如,NullPointerException、ArrayIndexOutOfBoundsException 等
-
-
表示程序运行过程中可以捕获和处理的异常情况
-
空指针
-
下标越界
-
类型转换异常
-
IO异常
-
-
jvm会根据产生的异常进行创建一个异常对象
-
主函数中对异常的处理
-
如有对于异常处理的逻辑,进行执行对应的逻辑处理
-
如没有就将这个异常抛出调用者来处理
-
-
当主函数中发现没有这个异常处理的逻辑,再次将异常抛出给jvm(jvm调用的主函数)
-
-
-
Error和Exception的区别:
-
错误级别:Error 表示严重的问题,通常是由系统级问题导致的,程序无法恢复;而 Exception 表示程序运行过程中的异常情况,可以被处理或捕获。
-
异常类型:Error 是 Java 虚拟机抛出的错误,一般无法恢复;Exception 分为受检查异常和非受检查异常,需要处理或捕获。
-
异常处理:Error 通常不应该被程序捕获和处理;而 Exception 需要使用 try-catch 块或声明 throws 来进行处理。
-
编译时要求:受检查异常在编译时要求进行处理;非受检查异常在编译时不强制要求处理
-
处理异常的方式
-
try...catch块( 处理异常)
-
可以捕获并处理异常。在 try 块中编写可能会抛出异常的代码,然后使用 catch 块捕获特定类型的异常,并在 catch 块中处理异常
try { // 可能抛出异常的代码 } catch (ExceptionType1 e1) { // 处理 ExceptionType1 类型的异常 } catch (ExceptionType2 e2) { // 处理 ExceptionType2 类型的异常 } finally { // 可选,无论是否捕获到异常都会执行的代码块 }
-
-
throws 声明 (抛出异常)
-
在方法声明中指定该方法可能抛出的异常。通过这种方式,可以将异常的处理责任交给调用方法的调用者,而不在当前方法中处理异常
public void method() throws ExceptionType { // 可能抛出异常的代码 } // 调用 method() 方法时需要处理或继续抛出异常
-
-
finally块
-
是一个可选的代码块,用于包含无论是否发生异常都需要执行的代码。无论异常是否被捕获,finally 块中的代码都会执行
try { // 可能抛出异常的代码 } catch (Exception e) { // 处理异常 } finally { // 无论是否捕获到异常都会执行的代码块,进行资源的释放或清理操作 }
-
-
注意:
-
在开发中进行编写接口的时候,有异常一定要抛
-
在多个catch中,第一个catch处理异常必须是第二个catch的子类或者是兄弟类,不是父类,第二个和第三个以此类推。
-
-
finally final finalize 之间的区别
-
finally
:-
是一个关键字,用于定义在异常处理中的一个代码块。
-
通常用于包含无论是否发生异常都需要执行的代码。不管是否有异常被捕获,finally 块中的代码都会执行。
-
通常用于进行资源的释放、关闭数据库连接等清理操作,以确保资源得到正确处理。
-
可以和
try-catch
或try-catch-finally
结构一起使用。
-
-
final
:-
是一个关键字,可以用于修饰类、方法和变量。
-
修饰类:
final class
表示该类是最终类,不能被继承。 -
修饰方法:
final
方法表示该方法是最终方法,不能被子类重写。 -
修饰变量:
final
变量表示该变量是一个常量,只能被赋值一次。一旦赋值后,就不能再次修改。
-
-
finalize
:-
finalize
是一个方法,是由垃圾回收器在对象被回收之前调用的。垃圾回收器负责在适当的时机自动回收未引用的对象。 -
允许对象在被销毁之前进行资源释放、清理或其他必要的操作。
-
通常情况下,应该避免使用
finalize
方法,因为它无法保证被正确地调用和执行,而且会对性能产生一定的负面影响。
-
总结:
-
finally
是一个关键字,用于定义在异常处理中的代码块,确保其中的代码无论是否发生异常都得到执行。 -
final
是一个关键字,可以用于修饰类、方法和变量,分别表示最终类、最终方法和常量。 -
finalize
是一个方法,垃圾回收器在对象被回收之前调用它,允许对象进行资源释放或清理操作,但不推荐使用
-
自定义异常
可以根据具体需求自定义异常类,并使用 throw 关键字抛出自定义异常。通过自定义异常可以更好地表示特定的错误情况,并进行相应的处理。自定义异常类通常继承于 Exception 类或其子类
public class CustomException extends Exception { // 自定义异常类的代码和逻辑 } throw new CustomException("自定义异常信息");
-
创建自定义异常类的通常步骤:
-
创建自定义异常类:
-
自定义异常类应该命名以
Exception
结尾,以明确其是一个异常类。 -
自定义异常类通常继承
Exception
类或其子类,但也可以直接继承其他异常类,如RuntimeException
。 -
在自定义异常类中,可以添加构造方法、自定义属性和方法,以及其他适用的逻辑。
-
public class CustomException extends Exception { // 自定义异常类的代码和逻辑 public CustomException() { super(); // 调用父类构造方法 } public CustomException(String message) { super(message); // 调用父类构造方法,并传入异常信息 } // 重写其他父类的方法,增加自定义的逻辑 }
-
使用自定义异常类:
-
在程序的适当位置,可以抛出自定义异常,表示特定的错误或异常情况。
-
可以使用
throw
关键字抛出自定义异常对象,并在适当的地方捕获和处理该异常。
-
public void someMethod() throws CustomException { // 某些逻辑判断 if (条件) { throw new CustomException("自定义异常信息"); } }
-
处理自定义异常:
-
在调用可能抛出自定义异常的方法时,可以使用
try-catch
块来捕获和处理异常。
-
在
catch
块中,根据自定义异常类型进行相应的处理操作。
-
try { someMethod(); } catch (CustomException e) { // 自定义异常处理逻辑 }
-