首页 > 其他分享 >JTCR-异常处理-08

JTCR-异常处理-08

时间:2024-04-18 15:24:59浏览次数:23  
标签:语句 JTCR 08 try finally catch Throwable 异常

异常处理基础

try {
  // 可能产生异常的代码块
} catch (ExceptionType ex) {
  // 处理异常
} catch (ExceptionType ex) {
  // 处理异常
} ...
finally {
  // 无论是否发生异常,必须执行的代码块
}

异常类型

所有异常类型的超类是 Throwable,该类有两个直接子类,一个是 Exception,用于表示用户代码应该捕获的异常类型,所有自定义异常都继承自这个类;一个是 Error,用于表示不能被用户代码捕获的异常,这个异常类型由运行时系统使用,指出必须被处理的错误。

未捕获异常

当一个异常产生而用户没有定义对这个异常的处理器时,则这个异常最终会被运行时系统的默认异常处理器处理,处理方式是显示描述异常的字符串,并打印异常产生点的调用桟,然后终止程序。

使用 try 和 catch

自定义异常处理器可以避免使用默认异常处理器造成程序终止。
try 块用于监视可能产生异常的代码段,catch 块用于指定异常类型及处理方式。
当 try 块中某条语句产生异常时,这条语句下面的所有语句被跳过,控制流转到 catch 块,catch 块执行完毕后,控制流转到整个 try/catch 块的下一条语句,执行该语句。

多 catch 子句

catch 子句按照顺序匹配异常类型,如果类型匹配,则处理该异常,否则跳过。
多个 catch 子句的排列顺序必须是子类在前,超类在后。因为超类可以匹配自身和所有自己子类的异常类型。如果超类在前,子类在后,则子类永不可达,此时报错。

内嵌 try

内部的 try 块产生异常如果同层级的 catch 语句无法捕获,则抛给直接相邻的上一层级的 catch 语句,直至被处理。都不匹配,则由默认异常处理器处理。

throw

throw ThrowableInstance

允许被抛出的异常对象类型必须是 Throwable 或其子类。
内建运行时异常有两个构造器,一个空构造器,另一个接收一个描述该异常的字符串作为参数的构造器。

throws

当一个方法可能产生异常而不能处理时,需要声明所有可能抛出的异常。

type name(parameterList) throws exceptionList {
  // body
}

finally

不论 try/catch 块中有什么样的语句,finally 块中的语句都会执行。即使 try/catch 块中有 return 语句,在 return 语句执行前, finally 块中的语句会先执行完成。try 块至少必须紧跟一个 catch 子句或 finally 子句。

try {

} finally {

}

try {

} catch() {

}

内建异常

unchecked exceptions,不需要出现在 throws 中的异常。checked 异常必须在 throws 中出现。

unchecked 异常 checked 异常
ArithmeticException ClassNotFoundException
ArrayIndexOutOfBoundsException CloneNotSupportedException
ArrayStoreException IllegalAccessException
ClassCastException InstantiationException
EnumConstantNotPresentException InterruptedException
IllegalArgumentException NoSuchFieldException
IllegalCallerException NoSuchMethodException
IllegalMonitorStateException ReflectiveOperationException
IllegalStateException
IllegalThreadStateException
IndexOutOfBoundsException
LayerInstantiationException
NegativeArraySizeException
NullPointerException
NumberFormatException
SecurityException
StringIndexOutOfBoundsException
TypeNotPresentException
UnsupportedOperationException

创建自己的异常类

自定义异常类需要继承 Exception,Exception 类没有定义任何方法,所有的方法都是 Throwable 类定义的。

Throwable 定义的方法
final void addSuppressed(Throwable exc)
Throwable fillInStackTrace()
Throwable getCause()
String getLocalizedMessage()
String getMessage()
StackTraceElement[] getStackTrace()
final Throwable[] getSuppressed()
Throwable initCause(Throwable causeExc)
void printStackTrace()
void printStackTrace(PrintStream stream)
void printStackTrace(PrintWriter stream)
void setStackTrace(StackTraceElement elements[])
String toString()

异常链(chained exception)

当一个异常 a 产生时,捕获输出这个异常的描述信息,实质上 a 是由于潜在的异常 b 产生的。为了得到潜在的异常,可以使用异常链将异常关联。

class C {
  static void a() {
    NullPointerException e = new NullPointerException("a 异常");
	// 关联一个潜在的异常,该方法只能使用一次
	e.initCause(new ArithmeticException("b 异常"));
	throw e;
  }
  
  public static void main(Strings[] args) {
    try {
	  a();
	} catch(NullPointerException e) {
	  System.out.println("捕获:" + e);
	  // getCause 方法获得关联的潜在异常
	  System.out.println("潜在的原因:" + e.getCause());
	}
  }
}

三个额外的异常特性

try/finally 块可以用于自动管理资源的请求和释放。
多 catch(multi-catch)特性可以在一个 catch 块中捕获不同类型的异常。每个多 catch 中的变量隐式是 final 类型。语法为:

try {
  // 可能产生异常的代码段
} catch(ExceptionTypeA | ExceptionTypeB e) {
  // 处理异常
}

final rethrow(more precise rethrow)限制了可以被重抛出的异常类型,允许的类型有以下三种:关联的 try 块抛出的、没有被先前的 catch 块处理的、类型是参数的子类或超类。并且以上三种异常为 checked exception。将异常变量声明为 final 可使用该特性。

参考

[1] Herbert Schildt, Java The Complete Reference 11th, 2019.

标签:语句,JTCR,08,try,finally,catch,Throwable,异常
From: https://www.cnblogs.com/xdreamc/p/16361178.html

相关文章

  • LeetCode 面试经典150题---008
    ####151.反转字符串中的单词给你一个字符串s,请你反转字符串中单词的顺序。单词是由非空格字符组成的字符串。s中使用至少一个空格将字符串中的单词分隔开。返回单词顺序颠倒且单词之间用单个空格连接的结果字符串。注意:输入字符串s中可能会存在前导空格、尾随空格......
  • JTCR-包和接口-07
    包包用于划分类的命名空间,使得不同包中的同名类不会冲突。Java使用文件夹存储包,文件夹名和包名一致。Java运行时系统从当前目录中、CLASSPATH变量定义的值、-classpath指定的值这三种途径寻找包。包和成员访问可访问性private无修饰符protectedpublic同一个......
  • JTCR-深入了解方法和类-05
    方法重载一个类中存在多个同名方法,这些方法的形参类型或数量不同的现象称为方法重载。同名方法的返回值类型在判断是否构成重载时不予考虑。方法重载是支持多态的方式之一。当调用同名方法时,Java根据传入方法的实参类型、数量和顺序确定某个唯一精确匹配的方法,然后调用该方法;如......
  • JTCR-继承-06
    继承基础classA{inti;voidm(){//body}}classBextendsA{intk;voidn(){//body}}没有类可以成为其自身的超类(superclass)。子类不能访问超类中的private成员。超类类型变量可以引用派生自该超类的子类对象,但是使用该变量只......
  • JTCR-介绍类-04
    类基础类表示一个新的数据类型。简单类的一般形式:classClassName{typeinstanceVariable;//...typemethod(parameterList){//方法体}//...}有些Java应用不需要main方法。定义对象new操作符在运行时动态地给一个对象分配内存并返回指向该......
  • JTCR-数据类型、变量和数组-01
    原始类型Java是强类型语言,在编译时会检查所有变量、表达式的类型是否兼容。Java为数据定义了8种原始类型(primitivetype),分为4组:整型:byte、short、int、long,表示整数。浮点数:float、double,表示小数。字符:char,表示字符集中的元素。Boolean:boolean,表示true/false值。......
  • JTCR-运算符-02
    算术运算符算术操作符不能对boolean类型使用,可以对char类型使用,因为char类型是int类型的子集。除操作符对整数使用,结果为整数。取模运算符对整数和浮点数使用,都返回余数。在某些情况下,复合赋值操作符比它的等价形式更有效率。位运算符运算符运算结果~按位......
  • Hive - [08] 数据仓库物理模型设计
     分区分区是将表的数据按照某个列的值进行划分和存储的一种方式。通过分区,可以将数据按照特定的维度进行组织,提高查询效率和数据管理的灵活性。 一、分区的优势提高查询性能:通过分区,可以将数据按照特定的列值进行划分,使得查询只需要扫描特定分区的数据,减少了全表扫描的......
  • httprunner 4.x学习 - 08base_url使用
    前言base_url是把所有接口的公共url提取出来,如我两个接口地址如下:imos登录接口:http://120.25.121.168:19001/api/login任务列表接口:http://120.25.121.168:19001/api/task这时,base_url:http://120.25.121.168:19001/api案例在.evn中设置环境变量base_url#.envbase_url=ht......
  • 统一异常处理
    fromrest_framework.viewsimportexception_handlerfromrest_framework.responseimportResponsefromutils.common_loggerimportlogger####加入日志记录,只要走到这,说明程序出error了,程序的error,咱们都要记录日志,方便后期排查###日志记录尽量详细:ip;如果用户登录了,......