2021-08-04
异常方法
下面的列表是 Throwable 类的主要方法:
1 public String getMessage()
返回关于发生的异常的详细信息。这个消息在Throwable 类的构造函数中初始化了。
2 public Throwable getCause()
返回一个Throwable 对象代表异常原因。
3 public String toString()
使用getMessage()的结果返回类的串级名字。
4 public void printStackTrace()
打印toString()结果和栈层次到System.err,即错误输出流。
5 public StackTraceElement [] getStackTrace()
返回一个包含堆栈层次的数组。下标为0的元素代表栈顶,最后一个元素代表方法调用堆栈的栈底。
6 public Throwable fillInStackTrace()
用当前的调用栈层次填充Throwable 对象栈层次,添加到栈层次任何先前信息中。
三、异常的使用及执行流程
1、异常的处理方案
try...catch、try...catch...finally、try...finally
try{
可能会发生的异常
}catch(异常类型 异常名(变量)){
针对异常进行处理的代码
}catch(异常类型 异常名(变量)){
针对异常进行处理的代码
}...
[finally{
释放资源代码;
}]
注意:
catch 不能独立于 try 存在。
catch里面不能没有内容
在 try/catch 后面添加 finally 块并非强制性要求的。
try 代码后不能既没 catch 块也没 finally 块。
try里面越少越好。
try, catch, finally 块之间不能添加任何代码。
finally里面的代码最终一定会执行(除了JVM退出)
如果程序可能存在多个异常,需要多个catch进行捕获。
异常如果是同级关系,catch谁前谁后没有关系
如果异常之间存在上下级关系,上级需要放在后面
2、异常的执行流程
Error与Exception的区别:
Error(错误)是系统中的错误,程序员是不能改变的和处理的,是在程序编译时出现的错误,只能通过修改程序才能修正。
一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。
对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。
Exception(异常)表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。
在catch捕获异常时,为什么不考虑使用Throwable类型,而只是使用Exception来进行接收?
Throwable表示的范围要比Exception大。实际上程序使用Throwable来进行处理,没有任何语法问题,
但是却会存在逻辑问题。因为此时出现的(或者说用户能够处理的)只有Exception类型,而如果使用Throwable接收,
还会表示可以处理Error的错误,而用户是处理不了Error错误的,所以在开发中用户可以处理的异常都要求以Exception类为主。
异常是一起处理好还是分开处理好?
根据实际的开发要求是否严格来决定。在实际的项目开发项目工作中,所有的异常是统一使用Exception处理还是分开处理,
完全根据开发者的项目开发标准来决定。如果项目开发环境严谨,基本上要求针对每一种异常分别进行处理,
并且要详细记录下异常产生的时间以及产生的位置,这样可以方便程序维护人员进行代码的维护。
再次注意:处理多个异常时,捕获范围小的异常要放在捕获范围大的异常之前处理。
throw和throws的区别?
throw和throws都是在异常处理中使用的关键字,区别如下:
throw:指的是在方法中人为抛出一个异常对象(这个异常对象可能是自己实例化或者抛出已存在的);
throws:在方法的声明上使用,表示此方法在调用时必须处理异常。
检查型异常(Checked Exception)与非检查型异常(Unchecked Exception)区别?
所有的检查性异常都继承自java.lang.Exception;
所有的非检查性异常都继承自java.lang.RuntimeEx ception。
检查性异常和非检查性异常最主要的区别在于其处理异常的方式:检查性异常必须使用try catch或者throws等关键字进行处理,
否则编译器会报错;非检查性异常一般是程序代码写的不够严谨而导致的问题,可以通过修改代码来规避。
常见的运行时异常:空指针异常(NullPointerException)、除零异常(ArithmeticException)、数组越界异常(ArrayIndexOutOfBoundsException)等;
常见的检查性异常:输入输出异常(IOException)、文件不存在异常(FileNotFoundException)、SQL语句异常(SQLException)等。
assert关键字(了解)
在Java中,assert关键字是从JAVA SE 1.4 引入的,为了避免和老版本的Java代码中使用了assert关键字导致错误,
Java在执行的时候默认是不启动断言检查的(这个时候,所有的断言语句都 将忽略!),如果要开启断言检查,则需要用开关-enableassertions或-ea来开启。
assert关键字语法很简单,有两种用法:
assert <boolean表达式>
如果<boolean表达式>为true,则程序继续执行。
如果为false,则程序抛出AssertionError,并终止执行。
assert <boolean表达式> : <错误信息表达式>
如果<boolean表达式>为true,则程序继续执行。
如果为false,则程序抛出java.lang.AssertionError,并输入<错误信息表达式>。
例:
1 public class Test { 2 public static void main(String[] args) { 3 int a = 10; 4 int b = 2; 5 assert a == 10:"a不等于10"; 6 System.out.println("a="+a); 7 } 8 }
例:
1 public class Test { 2 public static void main(String[] args) { 3 int a = 10; 4 int b = 2; 5 assert a == 20:"a不等于20"; 6 System.out.println("a="+a); 7 } 8 }