Exception 异常

简介: java.lang.Throwable是所有错误和异常的父类。只有它(或它的子类)的实例才可以被JVM抛出。 Throwable对象派生出两种类型:Error和Exception,前者用来表示编译时和系统错误,程序员往往不必关心;后者是可以被抛出的基本类型,需要程序员关注。 1.try与catch try{ //code that might generate exceptio
java.lang. Throwable

是所有错误和异常的父类。只有它(或它的子类)的实例才可以被JVM抛出。

Throwable对象派生出两种类型:ErrorException,前者用来表示编译时和系统错误,程序员往往不必关心;后者是可以被抛出的基本类型,需要程序员关注。

1.try与catch

try{
	//code that might generate exceptions
}catch(Type1 id1){
	//Handle exception of Type1
}catch(Type2 id2){
	//Handle exception of Type2
}catch(Type3 id3){
	//Handle exception of Type3
}
// etc ...


注意:只有得到匹配的catch子句才能得到执行,这与case语句不同。switch语句需要在每一个case子句之后跟一个break,以避免执行后续的case子句。
可以 自定义异常类来表示自己程序中的特定异常。要自己定义异常类,必须从已有的异常类继承。对于异常来说,最重要的就是类名,所以起一个好的名字,类内为空也行。
printStackTrace()方法。它将打印 从方法调用处,知道异常抛出处 的方法调用栈。
可以通过语句 catch(Exception e){} 捕获所有的异常,所以最好把它放在所有捕获的末尾,以防它 抢在其他处理程序之前 先把异常捕获了。
异常捕获后也可以再把它重新抛出。

public class A {
	public static void main(String[] args) {
		try {
			fun();
			System.out.println(1);//若上句发生异常,此句将得不到执行,符合预期。
		} catch (Exception e) {
			System.out.println(2);
		}
	}
	static void fun() throws NullPointerException {
		throw new NullPointerException();
	}
}
/*2*/


2.finally

对于一些代码A,可能希望 无论try{} 中是否发生了异常,A都能得到执行,此时可在异常处理后面加上finally{}语句块。

finally{}中不要写return,IDE会有警告,这样的写法不合理。

注意:若一个函数中return语句在finally语句前面,finally仍能得到执行。

有时可以见到这样的写法,try{} finally{},不要catch{}。这种写法也是可以的,编译器不会报错。效果是发生异常照样抛出,但finally{}照样执行。

3.执行顺序

try{ line1; line 2;}中有多行代码,若line1抛出了异常,则line2得不到执行。
catch(Exception e){}若得到命中,则执行完后,它后面的正常代码也能得到执行。

检查型/非检查型 异常

Java的异常(Exception)按照编译器检查方式又可以分为检查型异常(CheckedException)和非检查型异常(UncheckedException)。
在Java中所有 不是 RuntimeException派生的Exception都是 检查型异常。当函数中存在抛出检查型异常的操作时该函数的函数声明中必须包含throws语句。调用改函数的函数也必须对该异常进行处理,如不进行处理则必须在调用函数上声明throws语句。 检查型异常是JAVA首创的,在编译期对异常的处理有强制性的要求。在JDK代码中大量的异常属于检查型异常,包括IOException,SQLException等。

在Java中 所有RuntimeException的派生类都是非检查型异常,与检查型异常相对抛出非检查型异常可以不在函数声明中添加throws语句,调用函数上也不需要强制处理。

常见的NullPointException,ClassCastException是常见的非检查型异常。非检查型异常可以不使用try...catch进行处理,但是如果有异常产生,则异常将由JVM进行处理。对于RuntimeException的子类最好也使用异常处理机制。虽然RuntimeException的异常可以不使用try...catch进行处理,但是如果一旦发生异常,则肯定会导致程序中断执行,所以,为了保证程序再出错后依然可以执行,在开发代码时最好使用try...catch的异常处理机制进行处理。

自定义异常类

不必拘泥于Java中已有的异常类,我们可以自己定义异常来满足需求。对于异常来说,有一个能够说明问题的类名就基本足够了。
Exception类继承自Throwable类,所以拥有了 PrintStackTrace()方法。此方法默认输出到System.err标准错误流中,可以放入实参System.out输出到标准输出流中。
Exception拥有 带String参数的构造函数,所以自己的异常类中可以做一个一样参数列表的构造函数。
定义新的异常类时,必须从已有的异常类继承。
图1 控制台 输出

4.接口中的异常

接口中抛出了异常,那么实现时就不能再抛出其他异常。
这个逻辑也可以用在基类中的函数上。


5.assert 断言

assert (布尔表达式)

若表达式为false,程序抛出 java.lang.AssertError 异常。

默认jvm是不支持断言的,需要用开关 -enableassertions-ea来显式开启。
所以尽量不用断言吧,测试的时候使用Junit的assertEquals()方法即可。

6.带资源的try语句

英文名叫 try-with-resource block。

目录
相关文章
|
存储
ASCII码可以表示汉字吗?
ASCII码可以表示汉字吗?
4716 0
|
移动开发 前端开发 程序员
有哪些代码开源平台值得推荐?
开源是程序员最高的浪漫
|
11月前
|
SQL 人工智能 分布式计算
MaxFrame 产品深度评测
本文全面评测了 MaxFrame,这款新兴的 Python 分布式计算框架,涵盖其在分布式 Pandas 处理、大语言模型数据处理等方面的优势。通过实际案例和用户体验,展示了 MaxFrame 在企业业务和个人学习中的重要作用,并与其他工具进行了对比,指出了其优点和改进空间。
Excel实现单元格下拉框选择,加VBA脚本可实现选择多个选项,默认顿号分隔,可自定义符号分隔
来源需要用英文逗号分隔,这里输入限制为最大255字符,如果需要更多可选择单元格范围:
442 0
|
存储 安全 算法
PKI体系与CA证书
PKI体系与CA证书
545 0
如何卸载,禁用和删除Windows Defender
如何卸载,禁用和删除Windows Defender
|
弹性计算 缓存 网络协议
阿里云通用算力u1服务器CPU性能评测及常见问题解答
阿里云通用算力u1服务器CPU性能评测及常见问题解答,阿里云服务器u1通用算力型Universal实例高性价比,CPU采用Intel(R) Xeon(R) Platinum,主频是2.5 GHz,云服务器U1实例的基准vCPU算力与5代企业级实例持平,最高vCPU算力与6代企业级实例持平,提供2c-32c规格和1:1/2/4/8丰富配比,阿里云服务器u1适用于Web应用及网站,企业办公类应用,数据分析和计算等大多数通用的对vCPU算力和性能要求不高的应用场景。
692 0
|
物联网 数据安全/隐私保护 芯片
Cc2530 芯片介绍 | 学习笔记
快速学习 Cc2530 芯片介绍
Cc2530 芯片介绍 | 学习笔记
|
存储 并行计算 JavaScript
MATLAB中的函数句柄 理解
函数句柄也是MATLAB中的一种常见的数据类型,它的地位类似于其它计算机语言里的函数对象(Javascript,Python),函数指针(C++),或者函数引用(Perl)。
469 0
|
人工智能 JSON 移动开发
DingTalk「开发者说」钉钉连接平台,OA审批场景下如何实现系统互通
钉钉连接平台通过简单的低代码配置,帮助企业迅捷实现系统集成和连接,降低集成实施的周期和成本。本文主要介绍在OA审批场景下,如何通过连接平台实现系统互通。
2934 0
DingTalk「开发者说」钉钉连接平台,OA审批场景下如何实现系统互通