赞
踩
定义:Java 异常是 Java 提供的一种识别及响应错误的一致性机制。
作用:Java 异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。在有效使用异常的情况下,异常能清晰的回答 what, where, why 这3个问题:异常类型回答了“什么”被抛出,异常堆栈跟踪回答了“在哪“抛出,异常信息回答了“为什么“会抛出。
异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程。Java 通 过 API 中 Throwable 类的众多子类描述各种不同的异常。因而,Java 异常都是对象,是 Throwable 子类的实例,描述了出现在一段编码中的错误条件。当条件满足时,错误将引发异常。
Java 异常的继承层次结构:
图片中我们看到 Java 异常的基类是 Throwable 类型,然后它有两个子类 Error(错误)和 Exception()类型,然后 Exception 类又分为运行时异常(RuntimeException)及非运行时异常(编译异常)。以下将分别介绍。
Error 一般表示编译时或者系统错误,例如:Virtual MachineError(虚拟机运行错误),StackOverflowError:栈溢出错误、OutOfMemoryError:内存不足错误等。此类错误开发者无法处理且不可恢复,JVM 将终止线程,因此不应该实现任何新的 Error 子类。
程序本身可以捕获并且可以处理的异常,也就是要么捕获异常并作出处理,要么继续抛出异常。Exception 这种异常又分为两类:运行时异常和非运行时异常。
RuntimeException 及其子类都统称为运行时异常,例如:NullPointExecrption(空指针)、ArithmeticException(算术错误)、ArrayIndexOutOfBoundsException(数组越界)等。
这类异常是非受检查的,具体根据需要来判断是否需要捕获和处理,并不会在编译期强制要求。开发者应该从程序编码阶段就尽可能避免其发生。
RuntimeException 以外的异常都属于非运行时异常。例如 IOException、SQLException 等以及用户自定义的 Exception 异常等。
这类异常是受检查的,在源代码里必须显式地进行捕获处理,是编译期检查的一部分。这种异常要么用 try-catch 语句捕获它,要么用 throws 子句声明抛出它,否则编译不会通过。
异常 | 描述 |
---|---|
ArithmeticException | 当出现异常的运算条件时,抛出此异常。例如,一个整数"除以零"时,抛出此类的一个实例。 |
ArrayIndexOutOfBoundsException | 用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。 |
ArrayStoreException | 试图将错误类型的对象存储到一个对象数组时抛出的异常。 |
ClassCastException | 当试图将对象强制转换为不是实例的子类时,抛出该异常。 |
IllegalArgumentException | 抛出的异常表明向方法传递了一个不合法或不正确的参数。 |
IllegalMonitorStateException | 抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。 |
IllegalStateException | 在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。 |
IllegalThreadStateException | 线程没有处于请求操作所要求的适当状态时抛出的异常。 |
IndexOutOfBoundsException | 指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。 |
NegativeArraySizeException | 如果应用程序试图创建大小为负的数组,则抛出该异常。 |
NullPointerException | 当应用程序试图在需要对象的地方使用 null 时,抛出该异常 |
NumberFormatException | 当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。 |
SecurityException | 由安全管理器抛出的异常,指示存在安全侵犯。 |
StringIndexOutOfBoundsException | 此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。 |
UnsupportedOperationException | 当不支持请求的操作时,抛出该异常。 |
异常 | 描述 |
---|---|
ClassNotFoundException | 应用程序试图加载类时,找不到相应的类,抛出该异常。 |
CloneNotSupportedException | 当调用 Object 类中的 clone 方法克隆对象,但该对象的类无法实现 Cloneable 接口时,抛出该异常。 |
IllegalAccessException | 拒绝访问一个类的时候,抛出该异常。 |
InstantiationException | 当试图使用 Class 类中的 newInstance 方法创建一个类的实例,而指定的类对象因为是一个接口或是一个抽象类而无法实例化时,抛出该异常。 |
InterruptedException | 一个线程被另一个线程中断,抛出该异常。 |
NoSuchFieldException | 请求的变量不存在 |
NoSuchMethodException | 请求的方法不存在 |
Throwable 类主要方法
序号 | 方法及说明 |
---|---|
1 | public String getMessage() |
返回关于发生的异常的详细信息。这个消息在 Throwable 类的构造函数中初始化了。 | |
2 | public Throwable getCause() |
返回一个 Throwable 对象代表异常原因。 | |
3 | public String toString() |
返回此 Throwable 的简短描述。 | |
4 | public void printStackTrace() |
将此 Throwable 及其回溯打印到标准错误流。。 | |
5 | public StackTraceElement [] getStackTrace() |
返回一个包含堆栈层次的数组。下标为 0 的元素代表栈顶,最后一个元素代表方法调用堆栈的栈底。 | |
6 | public Throwable fillInStackTrace() |
用当前的调用栈层次填充 Throwable 对象栈层次,添加到栈层次任何先前信息中。 |
当一个方法产生一个它不处理的异常时,那么就需要在该方法的头部声明这个异常,以便将该异常传递到方法的外部进行处理。使用 throws 声明的方法表示此方法不处理异常,如果有多个异常类,它们之间用逗号分隔。throws 具体格式如下:
public void test()throws NullPointerException,ParseException{
//something statements
}
注意:若是父类的方法没有声明异常,则子类继承方法后,也不能声明异常。
与 throws 不同的是,throw 语句用来直接拋出一个异常,后接一个可拋出的异常类对象,其语法格式如下:
throw ExceptionObject;
其中,ExceptionObject 必须是 Throwable 类或其子类的对象。如果是自定义异常类,也必须是 Throwable 的直接或间接子类。 大部分情况下都不需要手动抛出异常,因为 Java 的大部分方法要么已经处理异常,要么已声明异常。所以一般都是捕获异常或者再往上抛。
在 Java 中可以自定义异常。编写自定义异常类时需要注意以下几点。
public class MyException extends Exception {
public MyException(){ }
public MyException(String msg){
super(msg);
}
// ...
}
异常捕获处理的方法通常有:
在一个 try-catch 语句块中可以捕获多个异常类型,并对不同类型的异常做出不同的处理
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}catch(异常类型3 异常的变量名3){
// 程序代码
}
同一个 catch 也可以捕获多种类型异常,用 | 隔开
try{
// 程序代码
}catch(异常类型1 | 异常类型2 异常的变量名1){
// 程序代码
}catch(异常类型3 异常的变量名2){
// 程序代码
}
finally 关键字用来创建在 try 代码块后面执行的代码块。无论是否发生异常,finally 代码块中的代码总会被执行。在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}finally{
// 程序代码
}
可以直接用 try-finally 吗? 可以。 try 块中引起异常,异常代码之后的语句不再执行,直接执行 finally 语句。try 块没有引发异常,则执行完 try 块就执行 finally 语句。
try-finally 可用在不需要捕获异常的代码,可以保证资源在使用后被关闭。例如 IO 流中执行完相应操作后,关闭相应资源;使用 Lock 对象保证线程同步,通过 finally 可以保证锁会被释放;数据库连接代码时,关闭连接操作等等。
//以 Lock 加锁为例,演示 try-finally
ReentrantLock lock = new ReentrantLock();
try {
//需要加锁的代码
} finally {
lock.unlock(); //保证锁一定被释放
}
finally 遇见如下情况不会执行
JDK7 之后,Java 新增的 try-with-resource 语法糖来打开资源,并且可以在语句执行完毕后确保每个资源都被自动关闭 。任何实现了 java.lang.AutoCloseable 的对象, 包括所有实现了 java.io.Closeable 的对象, 都可以用作一个资源。以下为代码实现
public class MyAutoClosable implements AutoCloseable { public void doIt() { System.out.println("MyAutoClosable doing it!"); } @Override public void close() throws Exception { System.out.println("MyAutoClosable closed!"); } public static void main(String[] args) { try(MyAutoClosable myAutoClosable = new MyAutoClosable()){ myAutoClosable.doIt(); } catch (Exception e) { e.printStackTrace(); } } }
try 代码块退出时,会自动调用 myAutoClosable.close 方法。这个好处在于,我们不用再去关心连接调用完了是否关闭,文件读写完了是否关闭,专心的实现业务即可。
作者:话唠扇贝
链接:https://juejin.cn/post/7146477599185698830
如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。
如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。
1、深入理解Java泛型
2、注解深入浅出
3、并发编程
4、数据传输与序列化
5、Java虚拟机原理
6、高效IO
……
1.Retrofit 2.0源码解析
2.Okhttp3源码解析
3.ButterKnife源码解析
4.MPAndroidChart 源码解析
5.Glide源码解析
6.Leakcanary 源码解析
7.Universal-lmage-Loader源码解析
8.EventBus 3.0源码解析
9.zxing源码分析
10.Picasso源码解析
11.LottieAndroid使用详解及源码解析
12.Fresco 源码分析——图片加载流程
1、Kotlin入门教程
2、Kotlin 实战避坑指南
3、项目实战《Kotlin Jetpack 实战》
从一个膜拜大神的 Demo 开始
Kotlin 写 Gradle 脚本是一种什么体验?
Kotlin 编程的三重境界
Kotlin 高阶函数
Kotlin 泛型
Kotlin 扩展
Kotlin 委托
协程“不为人知”的调试技巧
图解协程:suspend
1.SmartRefreshLayout的使用
2.Android之PullToRefresh控件源码解析
3.Android-PullToRefresh下拉刷新库基本用法
4.LoadSir-高效易用的加载反馈页管理框架
5.Android通用LoadingView加载框架详解
6.MPAndroidChart实现LineChart(折线图)
7.hellocharts-android使用指南
8.SmartTable使用指南
9.开源项目android-uitableview介绍
10.ExcelPanel 使用指南
11.Android开源项目SlidingMenu深切解析
12.MaterialDrawer使用指南
1、NDK 模块开发
2、JNI 模块
3、Native 开发工具
4、Linux 编程
5、底层图片处理
6、音视频开发
7、机器学习
1、Flutter跨平台开发概述
2、Windows中Flutter开发环境搭建
3、编写你的第一个Flutter APP
4、Flutter开发环境搭建和调试
5、Dart语法篇之基础语法(一)
6、Dart语法篇之集合的使用与源码解析(二)
7、Dart语法篇之集合操作符函数与源码分析(三)
…
1、小程序概述及入门
2、小程序UI开发
3、API操作
4、购物商场项目实战……
一、面试合集
二、源码解析合集
三、开源框架合集
欢迎大家一键三连支持,若需要文中资料,直接点击文末CSDN官方认证微信卡片免费领取↓↓↓
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。