本文分享自华为云社区《Java知识点问题精选之异常机制》,原文作者:breakDraw 。

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

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

异常体系分类

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

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关键字后面跟的异常必须是小于等于父类方法异常的。

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 {@Overridepublic void uncaughtException(Thread t, Throwable e) {System.out.println("捕获异常处理方法:" + e);}
}

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

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

点击关注,第一时间了解华为云新鲜技术~

聊聊Java的异常机制问题相关推荐

  1. gc java root_聊聊Java的GC机制

    原标题:聊聊Java的GC机制 近日,MIUI在小米全球社区发布公告,表示MIUI将在全球市场销售的手机中预装谷歌拨号及谷歌消息应用程序(中国.印度.印度尼西亚等市场除外).小米表示,小米9T Pro ...

  2. java的异常机制面试题(转)

    java的异常机制面试题(转) 参考文章: (1)java的异常机制面试题(转) (2)https://www.cnblogs.com/ffaiss/p/11434639.html 备忘一下.

  3. java gc机制 优点_聊聊Java的GC机制

    作者 某人Valar 如需转载请保留原文链接 部分图片来自百度,如有侵权请联系删除 本文目录 什么是GC JVM内存结构简单介绍 可达性分析与GC Roots 常见的垃圾收集算法 1. 什么是GC G ...

  4. 聊聊Java的GC机制,看了都说好~

    点击上方 "程序员小乐"关注, 星标或置顶一起成长 关注订阅号「程序员小乐」,收看更多精彩内容 每日英文 Past is a nice place to visit, but ce ...

  5. 简述java的异常机制_JAVA异常机制简述

    1.类的继承结构 在JAVA所有的异常对象都是Throwable类的一个子类的实例 Exception包含两个分支,由于程序错误导致的异常属于RuntimeException,比如数组下标越界,空指针 ...

  6. Java小记——异常机制

    目录 运行期异常 编译期异常 throw Erro 错误,严重性问题,你无法去捕获处理 比如内存溢出了 Exception 一般性问题,一般我们可以自己去捕获处理 编译期异常:发生在编译期间,非Run ...

  7. Java基础-异常机制

    异常( Exception 也称例外)就是在程序的运行过程中所发生的不正常的事件,它会中 断正在运行的程序 所需文件找不到 网络连接不通或中断 算术运算错 (被零除-) 数组下标越界 装载一个不存在的 ...

  8. CC00069.bigdatajava——|Java集合类库.V05|——|Java.v05|异常机制.v50|异常抛出|补充|

    一.异常抛出 ### --- 基本概念--> 在某些特殊情况下有些异常不能处理或者不便于处理时, --> 就可以将该异常转移给该方法的调用者,这种方法就叫异常的抛出. --> 当方法 ...

  9. java 异常机制_深入理解Java异常处理机制

    一.引子 try-catch-finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的"教训"告诉我,这个东西可不是想象中 ...

最新文章

  1. java Apache Commons jar包简介
  2. All in one: pentest under metasploit
  3. java scoket网络编程_嵌入式狗的JAVA之路 socket 网络编程
  4. javascript的程序控制结构及语句------(2)循环控制语句、跳转语句、对话框
  5. honeywell新风系统控制面板说明_新风系统——不开窗也能清新呼吸
  6. Maven部署到Nexus
  7. Exchange Server 2007邮箱存储服务器的集群和高可用性技术(上)
  8. Andoid TextView显示富文本html内容及问题处理
  9. 利用sort对数组快速排序
  10. 西瓜书+实战+吴恩达机器学习(二三)EM算法和变分推断
  11. SpringSecurity-1-前言,登录原理
  12. 北京地铁规划大全(图),买房子可以参考一下
  13. 媒体化战略:数字时代企业如何做好公关与内容营销
  14. 浅谈算法和数据结构: 八 平衡查找树之2-3树
  15. 在线抢购平台_课程设计报告
  16. 豆瓣电影(二):数据分析
  17. MTK平台TP驱动详解
  18. Ubuntu16.04平台下桌面窗口管理器:Xmonad 使用心得
  19. 程序中图片透明 函数
  20. windows的C盘根目錄下中文文件夾重命名

热门文章

  1. 作为window对象属性的元素 多窗口和窗体
  2. HTML5 canvas 阴影
  3. plsql连mysql数据库12541_启动plSql时候报ORA-12541:TNS:tns:无法解析指定的连接标识符的解决办法(org11)...
  4. 正在等待缓存锁:无法获得锁_一句话说清分布式锁,进程锁,线程锁
  5. python的属性访问,python:如何访问函数的属性
  6. 请求报文的方法及get与post的区别
  7. python入门:输出1-100之内的所有奇数和偶数
  8. 【bzoj4327】JSOI2012 玄武密码 AC自动机
  9. ECMAscript6(ES6)新特性语法总结(一)
  10. 解决mysql中表字符集gbk,列字符集Latin1,python查询乱码问题