异常
最近学习了关于异常的知识,进行一下总结
假设一个Java程序在运行过程中出现了错误,用户希望程序能够采用一些理智的行为来处理,程序应该:
1.返回到一种安全的状态,并能够让用户执行一些其他的命令
2.允许用户保存所有的操作结果,并以适当的方式终止程序
程序中可能出现的错误一般有一下4种:
1.用户输入错误
除了那些不可避免的键盘输入错误外,还包括用户输入的语法错误
2.设备错误
硬件出现问题
3.物理限制
磁盘满了,可用存储空间已被用完
4.代码错误
程序方法有可能无法正确执行
1.异常分类
先上一张图:
异常对象都是派生与Throwable类的一个实例,所有的异常都是有Throwable继承而来。
Error类的层次结构描述了Java运行时的内部错误和资源耗尽错误,出现这种错误时,我们只能告知用户,并不能抛出。
Exception类又分为两个分支,分别是IOException和RuntimeException。RuntimeException异常是又程序错误导致的异常,例如错误的类型转换、数组访问越界、访问空指针等。而除RuntimeException异常外的其他异常,包括例如试图在文件尾部后面读取数、试图打卡一个不存在的文件等。
Java语言将派生与Error类或RuntimeException类的所有异常成为未检查异常,所有其他的异常称为已检查异常。
2.声明已检查异常
如果遇到了无法处理的情况,那么Java的方法可以抛出一个异常。一个方法不仅要告诉编译器需要返回什么类型的值,还需要告诉编译器可能发生的错误有哪些。所以我们要在方法的首部声明所有可能抛出的异常。但并不是所有可能发生的异常都需要声明,只需记住下面四种情况应该抛出异常:
1.调用一个抛出已检查异常的方法
2.程序运行过程中发现错误,并且利用throw语句抛出一个已检查异常
3.程序出现错误
4.Java虚拟机和运行时库出现的内部错误
总之,一个方法必须声明所有可能抛出的已检查异常,而未检查异常Error不可控制,RuntimeException可以避免发生。
3.捕获异常
对于异常除了抛出这种解决办法,还有另一种方法就是捕获(try…catch)。如果在try语句块中的任何代码抛出了一个在catch子句中说明的异常类,那么程序将跳过try语句块的其余代码,执行catch子句中的处理器代码。那么问题来了,到底是抛出还是捕获呢?我们只捕获那些知道如何处理的异常,而将那些不知道如何处理的异常抛出继续传递给方法的调用者。
本文内容参考了《Java核心技术卷一》
我是骑着火箭的蜗牛,一个自学Java后端3个月的小白,正在努力的成长。