Java 中的异常的那些事
Java 中的异常的那些事
简述异常
异常 (Execption
) 是正常程序流程所不能处理或没有处理的异常情况或异常事件.
按照异常在编译时是否被检测来分,异常可以分为两大类: 受检异常 (Checked Exception) 与 非受检异常 (Unchecked Exception) .(又称受控异常与非受控异常)
受检异常: 指异常在编译时被 Java 编译器检测到
非受检异常:指异常只能在程序运行时才能被检测到,包括 运行是异常(Runtime Exception)和 错误(Error).
异常处理
在 Java 中处理异常的方式有两种:捕获异常 和 ** 转移异常**。个人又称 异常捕捉 和 上抛异常。
1、捕获异常方式
异常捕捉通过 try-catch-finally
或 try-catch
语句实现,那么 try-finally
语句可以吗。
点击查看答案
答案是可以的,但一般不会去写`try-finally` 语句
以下简单展示标准格式
try {
int i = 1/0;
return ;
}catch (ArithmeticException e){
e.printStackTrace();
}finally {
System.out.println("执行 finally 语句");
}
思考:以上代码中 finally
中的语句会执行吗?
点击查看答案
答案:会执行
可参考: https://blog.csdn.net/qq_29229567/article/details/87286739
再如果是这样的呢, finally
中的语句还会执行吗?
try {
int i = 1/0;
System.exit(0);
}catch (ArithmeticException e){
e.printStackTrace();
}finally {
System.out.println("执行 finally 语句");
}
点击查看答案
答案:不会,因为执行 System.exit(0); 后会直接退出程序
2、转移异常方式
如果不想在该方法中处理异常,则可以把异常上抛給调用它的方法处理。通俗地讲可以说是推卸责任,张三有个异常但没有处理,而是选择转移,这时李四调用张三,那么这个就要李四处理,如果李四也不想处理,也想转移。最后就会到老板(Java虚拟机)这处理。然后挨批(出错)。
关键字:throw
, throws
throw : 用于手动抛出异常
throws:在方法声明位置上使用,表示上报异常信息给调用者。
以下简单展示:
public void test1() throws Exception{
throw new Exception();
}
注意 : 继承重写后的方法不能 throws 比父级的异常级别高
例如父类的方法 throws RuntimeExecption 则子类方法不能 throws 比它高的异常比图 Execption.
以下展示错误情况:
class A{
public void run() throws RuntimeException{
}
}
class B extends A{
public void run() throws Exception{
}
}
错误信息提示: 'run()' in 'com.hjx.异常处理.B' clashes with 'run()' in 'com.hjx.异常处理.A'; overridden method does not throw 'java.lang.Exception'
自定义异常
当Java内置的异常都不能明确的说明异常情况的时候,需要创建自己的异常
自定义异常很简单,首先继承 Exception
,然后写一个无参构造函数和一个有参构造函数。去翻哪些定义好的异常源码,可以发现基本是这样写。
自定义异常简单展示:
public class MyException extends Exception{
public MyException() {
}
public MyException(String message) {
super(message);
}
}
定义好了,那么如何使用自定义异常呢
public static void main(String[] args) {
//自定义异常
try {
test1();
} catch (Exception e) {
// 获取异常基本信息
System.out.println(e.getMessage());// 自定义异常测试!!!
}
}
public static void test1() throws Exception{
throw new MyException("自定义异常测试!!!");
}
总结
异常的关键字:
异常捕捉:
try 里面写可能抛出异常的语句
catch 捕捉异常,并执行其中语句
finally 无论是否有异常都会执行其中语句
异常抛出
throw 手动抛出异常
throws 在方法声明位置上使用,表示上报异常信息给调用者。
继承重写后的方法不能 throws 比父级的异常级别高
例如父类的方法 throws RuntimeExecption 则子类方法不能 throws 比它高的异常,比如 Execption.
参考
https://blog.csdn.net/qq_29229567/article/details/80773970
https://www.bilibili.com/video/BV1mE411x7Wt?p=180z