温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java的异常机制是什么

发布时间:2021-07-12 11:39:28 来源:亿速云 阅读:133 作者:chen 栏目:编程语言

本篇内容介绍了“Java的异常机制是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

java异常指在程序运行时可能出现的一些错误,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,中断了正在执行的程序的正常指令流。

Java通过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的错误条件。当条件生成时,错误将引发异常。对于运行时异常、错误或可查异常,Java技术所要求的异常处理方式有所不同。
异常体系分类

Q: Throwable 和 Error的关系
A: Throwable是Error(错误)的基类,也是Exception的基类
1个好图,可看到常见的异常和error
 

Java的异常机制是什么

Q: Error和Exception的关系
A:

    Error一般是会直接引起jvm出错的错误,例如Java虚拟机运行错误等,如果出现了当前线程会无法继续运行。
    Excpetion是程序本身可以处理的异常。发生后还能正常运行。

Q: Error可以被catch捕捉吗?
A: 只要是Throwable和其子类都是可以throw和catch的。 但是不建议捕捉Error。

异常体系还可以分为这2类:

    unchecked exception(非检查异常)
    也称运行时异常(RuntimeException),比如常见的NullPointerException、IndexOutOfBoundsException。对于运行时异常,java编译器不要求必须进行异常捕获处理或者抛出声明,由程序员自行决定。
    checked exception(检查异常,编译异常)
    也称非运行时异常(运行时异常以外的异常就是非运行时异常),java编译器强制程序员必须进行捕获处理,比如常见的IOExeption和SQLException。对于非运行时异常如果不进行捕获或者抛出声明处理,编译都不会通过。

异常捕捉和返回

Q: return-finally陷阱1: finally能通过修改变量,来更新return的变量值吗

    int f() {
      int a = 1;
      try {
          return a;
      }
      finally {
          a=2;
      }
    }

A: 不能, f返回1。

Q: return-finally陷阱2: finally里也return时,返回哪个?

    int f() {
      try {
          return 1;
      }
      finally {
          return 2;
      }
    }

A:返回finally里的,返回2。

Q: 什么情况下finally块里的步骤可以不执行?
A: 只有在finally之前调用System.exit(0)退出jvm, 才能让finally不执行。

Q: 下面会发生什么?

    try {
        start();
    } catch (Exception ex) {
        System.out.println("catch Exception");
    } catch (RuntimeException re) {
        System.out.println("catch RuntimeException");
    }

A: 直接编译就错误了。 catch是会按顺序的且匹配1个就不再往下匹配,编译器因此识别出RuntimeExcpetion永远不会被捕捉到,便提前报错。

Q:throw异常的时候,在finally中做return,那么异常还会抛出吗?

    static int f() {
        try {
            int a = 1/0;
            return a;
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            return -1;
        }
    }
    public static void main(String[] args) {
        System.out.println(f());
    }

A:不会,返回-1.

即finaly中做return会中断throw
因此永远不要在finally中去做return操作
受检异常相关问题

Q: 子类覆写基类方法时 , 能throws基类方法中不存在的异常吗?
像下面这样:

    class A{
        void f() throws IOException{
        }
    }
    class B extends A{
        void f() throws IOException, SQLException {
        }
    }

A: 不行,直接编译报错。 即子类覆写父类方法时, throws关键字后面跟的异常必须是小于等于父类方法异常的。

Java的异常机制是什么

Q: finally中调用某资源的close时,也会抛出受检异常, 除了在finally里做try-catch,还能怎么做?

像下面这样,finally又有catch,就很难看:

    TryWithResource tryWithResource = new TryWithResource();
            try {
                System.out.println(tryWithResource.age);
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                try {
                    tryWithResource.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

A:如果是JDK1.7,可以用try-with-resource语法。

需要资源类实现AutoCloseable接口, 并在try的时候在try括号后面跟上资源的创建,如下:

        public static void main(String[] args) {
            try (TryWithResource tryWithResource = new TryWithResource()) {
                System.out.println(tryWithResource.age);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

这样就不需要写finally,finally+close会通过编译器给我们自动加上。

Q: 线程抛出异常的话该怎么捕捉?

A: 实现异常处理接口MyUnchecckedExceptionhandler

    public class MyUnchecckedExceptionhandler implements UncaughtExceptionHandler {
        @Override
        public void uncaughtException(Thread t, Throwable e) {
            System.out.println("捕获异常处理方法:" + e);
        }
    }

然后把实现类设置给对应线程。

    Thread t = new Thread(new ExceptionThread());
    t.setUncaughtExceptionHandler(new MyUnchecckedExceptionhandler());
    t.start();
 

“Java的异常机制是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI