异常

异常

异常的分类

  • 检查性异常:编译时就提醒,必须手动处理,不处理直接编译报错。在IDEA中会红下划线自动标出,按Alt+Enter即可给出提示。
  • 运行时异常:编译器不强制处理,编译正常,运行代码才崩溃,大多是由于代码逻辑写错导致
  • 错误:错误不属于Exception,代表JVM/系统底层严重问题,程序无力回复,不用捕获、不用处理

Java把异常当作对象来处理,并定义一个类java.lang.Throwable作为所有异常的超类(最高级的一个类),继承框架如图:

graph TD; Throwable-->Error Throwable-->Exception Exception-->检查型异常 Exception-->RuntimeException

捕获和抛出异常

try{
    ...//测试执行的代码块,在出现异常的行之前代码都会正常执行,异常行以及异常行之后的语句全部不执行
}catch(ExceptionClass1 name1){
    ...//如果try代码块中出现异常,将会识别异常的类型,并判断是不是属于ExceptionCalss类或者其子类,如果是,则执行当前代码块,并且name1是将识别到的异常对象作为当前代码块的参量,name1仅作为当前代码块内该异常对象的引用。
}catch(ExceptionClass2 name2){
    ...//如果异常不属于ExceptionClass类型或者其子类,则判断是否属于ExceptionClass2类型或其子类,如果是则执行当前代码块,如果不是则跳过当前代码块。
}...
finally{
    ...//无论try有没有出现异常,该代码块都会执行,即使try/catch里写了return或者catch块中又抛出了新异常,该代码块都会被执行。
}
...//如果以上会被执行的语句中没有return或者在除了try中的会被执行的语句中没有抛出异常,那么该段代码会正常执行,否则不会执行。

以上是一个完整的try-catch-finally代码块在方法中的语法,这样一系列代码块可以放在任何一个方法中,甚至可以放置在构造方法和代码块中。catch代码块和finally代码块都可以不写,但是不能同时不写。并且先需要捕获的异常类型不能是后需要捕获的异常的类型的直接或间接的父类。finally代码段存在的意义是释放被占用的资源,避免出现catch中抛出新异常或者try/catch中提前return时系统资源被持续占用。选中要try的代码段,按快捷键Ctrl+Alt+T即可快速生成这一系列代码块。

也可以主动抛出异常,通过关键字throw,后面跟一个异常的对象即可,例如throw new ArithmeticException();,抛出异常一般在方法体内部使用。抛出受检异常(检查型异常)时,必须配合throws或者try-catch。而在方法体内部可能抛出受检异常时,要在方法签名末尾(参数列表后)用throws关键字写出,告诉调用者可能抛出的异常类型,语法如下:

public returnType method(dataType data1,...) throws ExceptionClass1, ExceptionClass2,...{...}

在一个方法中,如果一个语句中抛出了异常,并且该异常并未被try-catch捕获,那么该异常的语句以及之后的语句都不会被执行。

自定义异常

使用Java内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,还可以自定义异常类,只需继承Exception类即可。在程序中使用自定义异常类,大概可分为以下几个步骤:

  1. 创建自定义异常类。
  2. 在方法中通过throw关键字抛出异常对象。
  3. 如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常类型。
  4. 在出现异常方法的调用者中捕获并处理异常。
posted @ 2026-05-29 10:54  去银行整点金条  阅读(9)  评论(0)    收藏  举报