聊聊Java的异常机制问题
摘要:java异常指在程序运行时可能出现的一些错误,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,中断了正在执行的程序的正常指令流。
本文分享自华为云社区《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 {
@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的异常机制问题的更多相关文章
- Java的异常机制
Java的异常机制 (一)异常的概念 异常是指程序在编译或运行时出现的导致程序不能继续编译或运行的状况.. (二)Throwable类 Throwable类继承自Object类,是Java中所有错误或 ...
- 关于java中异常机制
什么是异常:异常就是程序在运行时出现的不正常情况.对于严重的情况Java通过Error类进行描述,一般不用编写代码处理:对于不严重的情况Java通过Exception描述,一般编写针对性代码对其进行处 ...
- Java笔记 - 异常机制
JAVA异常机制是Java提供的用于处理程序在运行期可能出现的异常事件(如数组下标越界.文件不存在等)的一种机制,使程序不会因为 异常的发生 而 阻断或产生不可预见的结果 .而且还可以将逻辑代码与错误 ...
- Java之异常机制(1) - 高效处理异常
Java开发人员做出的有关架构的最重要的决定之一便是如何使用Java异常模型.Java异常处理成为社区中讨论最多的话题之一.一些人认为Java语 言中的已检查异常(Checked Exceptions ...
- Java基础——异常机制
[捕获异常] 硬件的错误.输入错误.物理限制等问题,都可能导致程序运行时的异常出现. 1.异常的分类层次 在java中,异常对象都是由Throwable类继承而来的,主要分为两大类: Error和Ex ...
- 异常小结:上一张图搞清楚Java的异常机制
下面是Java异常类的组织结构,红色区域的异常类表示是程序需要显示捕捉或者抛出的. Throwable Throwable是Java异常的顶级类,所有的异常都继承于这个类. Error,Excepti ...
- java:异常机制(try,catch,finally,throw,throws,自定义异常)
* String类中的格式化字符串的方法: * public static String format(String format, Object... args):使用指定的格式字符串和参数返回一个 ...
- Java异常机制
Java异常分类 异常表明程序运行发生了意外,导致正常流程发生错误,例如数学上的除0,打开一个文件但此文件实际不存在,用户输入非法的参数等.在C语言中我们处理这类事件一般是将其与代码正常的流程放在一起 ...
- Java学习 · 初识 异常机制
异常机制 1. 程序中的异常 a) b) 面对异常如何解决 i. 由开发者通过if-else来解决 代码臃肿 程序员需要花费很大精力 ii. ...
- [Java学习笔记] Java异常机制(也许是全网最独特视角)
Java 异常机制(也许是全网最独特视角) 一.Java中的"异常"指什么 什么是异常 一句话简单理解:异常是程序运行中的一些异常或者错误. (纯字面意思) Error类 和 Ex ...
随机推荐
- chatgpt镜像站汇总 - 聚合GPT【即时更新】
自荐下由我开发的聚合GPT网站,这边的GPT镜像站均为免费.无登录.无次数限制的!会及时剔除失效.添加可用地址[欢迎STAR.PR] 地址:https://ele-cat.gitee.io/comp- ...
- Shuffle 题解
Shuffle 题目大意 给定一个长度为 \(n\) 的 01 序列 \(a\),你可以进行至多一次以下操作: 选定 \(a\) 的一个连续段,满足连续段内恰好有 \(k\) 个 \(1\),将该连续 ...
- LVS负载均衡群集——其二
LVS-DR 通信四元素:源IP,源端口,目的IP,目的端口 主机A(客户端)-->VIP 主机B(调度器) 主机A(客户端)<--VIP 主机C(节点服务器) 通信五元素:源IP,源端口 ...
- 解码注意力Attention机制:从技术解析到PyTorch实战
在本文中,我们深入探讨了注意力机制的理论基础和实际应用.从其历史发展和基础定义,到具体的数学模型,再到其在自然语言处理和计算机视觉等多个人工智能子领域的应用实例,本文为您提供了一个全面且深入的视角.通 ...
- IoC容器趣谈
今天我们来谈谈Spring的内核之一--IoC容器 大家可能会有这样的疑问: "这玩意为啥要叫容器呢?好奇怪" "容器不是装东西的吗?难道IoC容器也是用来装什么东西的? ...
- 归并排序(merge_sort)
算法时间复杂度:妥妥的nlogn 步骤: 1.确定分界点 mid = (l+r) >> 1 2.递归排序左右两边 3.归并--合二为一(用两个指针,分别指向两个序列) 就是递归到最底部,然 ...
- python之if语句处理列表
目录 检查特殊元素 确定列表不是空的 使用多个列表 检查特殊元素 在我们上期讲的python之史上最详细if教程就提到过有关于列表的关系运算符 那我们现在来创建并且打印一个列表先 list_1 = [ ...
- C/C++ 通过SQLiteSDK增删改查
SQLite,作为一款嵌入式关系型数据库管理系统,一直以其轻量级.零配置以及跨平台等特性而备受青睐.不同于传统的数据库系统,SQLite是一个库,直接与应用程序一同编译和链接,无需单独的数据库服务器进 ...
- GitHub Desktop安装与使用教程
一.安装 1.下载 下载地址 2.安装 下载之后GitHub Desktop是没有安装步骤的,而是开始安装之后,稍等片刻就安装成功了. 然后登陆个人GitHub账号就可以进行一下操作了. 二.新建仓库 ...
- 如何检测Windows服务停止后自动启动?自动运行.bat批处理文件?
作者:西瓜程序猿 主页传送门:https://www.cnblogs.com/kimiliucn 前言 想要确保你的Windows服务即使在崩溃后也能自动重启吗?这篇文章教你如何用一个小巧的批处理脚本 ...