Java 中的异常的那些事

Java 中的异常的那些事

简述异常

  异常 (Execption) 是正常程序流程所不能处理或没有处理的异常情况或异常事件.
  按照异常在编译时是否被检测来分,异常可以分为两大类: 受检异常 (Checked Exception)非受检异常 (Unchecked Exception) .(又称受控异常与非受控异常)

受检异常: 指异常在编译时被 Java 编译器检测到
非受检异常:指异常只能在程序运行时才能被检测到,包括 运行是异常(Runtime Exception)错误(Error).

详细可参考Java:详解Java中的异常(Error与Exception)

异常处理

  在 Java 中处理异常的方式有两种:捕获异常 和 ** 转移异常**。个人又称 异常捕捉 和 上抛异常。
  

1、捕获异常方式

  异常捕捉通过 try-catch-finallytry-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

posted @ 2020-11-27 17:08  东郊  阅读(572)  评论(0编辑  收藏  举报