1.引言
各位好!本章是我在学习Java Exception时所带来的总结和感受,其目的是为了巩固和复习,再者是一起和你们分享学习。异常也是我们学习Java se的重头戏,它发挥着巨大的作用,给开发者和用户都带来了极大的效益。那么废话不多说,让我们一点点的来引入和学习这一章吧!
2.基本概念
顾名思义,异常(Exception)就是Java程序运行时出现了不正常的情况称为异常,注意,开发过程中的语法错误以及业务逻辑错误不能归为异常。而异常又分为两大部分,第一是错误(Error),第二是异常(Exception),咦??那这两者究竟有什么区别呢?
3.异常的分类
一般的,我们把Jvm虚拟机无法解决的严重问题(如:内存不足,爆栈)称为Error,而在编写Java源码时所造成的编译错误以及程序运行时发生的(如:数学格式错误、空指针异常、数组越界、类转化异常等)称为Exception。出现Error时JVM会令程序会直接崩溃并且提示异常的相关信息,而出现Exception的编译错误时,会在我们编辑JAVA源码的时候IDEA会及时提示我们处理编译异常,而当运行程序时出现异常时,Java程序会停留到当前执行的那一行代码,并抛出相关异常,此时,程序有两个选择,第一时选择处理异常,第二是选择不处理(即抛出thorws),相关抛出细节后面再详讲,这里只需大家认识异常的分类就行了(务必清楚)
下面整理出异常类继承体系图方便大家学习

4.异常的处理
相信大家对异常的概念以及它的种类有了一个大概的认识和了解,好了,那么问题来咯,出现异常我们该怎么做呢,眼巴巴看着它发出异常而置之不理吗?当然,选择不理同样也是一种处理的方式,那么大家试想一下,当一个程度规模十分庞大的时候,运行时比如出现了一个极其微小的错误导致整个程序停止,你们觉得这种处理方式好嘛?几千行的代码在运行到第几行时就卡住了,遇到小小的BUG就卡住了,这种不处理的方式肯定是不合理的,那么该怎么处理呢,其实,有两种方式,第一种就是刚刚提到的不理,第二种就是程序员手动受理(即利用Try-catch-finally)。而不理实质上是将发生的异常封装成异常对象抛(throws)给上一级(调用这个方法的方法),上一级接受到这个异常对象一样有两个处理方式,手动处理或者再向上一级抛出,但要注意,抛出的最高级是JVM,即当经过多次throws抛到JVM的时候,JVM只有一种选择,那就是暴力地把程序奔溃掉并提示出相应的异常信息。
下面给出Try-catch-finally处理机制示意图
try {
//代码.......
} catch (Exception e) {
//1.当try块中的代码发生异常时
//2.系统将异常信息封装成一个异常对象 e,传递给catch
//3.得到这个异常对象后,可进行各种各样的处理
//4.当try中代码没有异常时,catch无效
} finally {
//无论有没有异常,都要执行这finally代码块里面的代码
}
下面给出throws处理机制示意图

5.异常处理的细节
5.1Try-catch-finally细节
- Java一共提供了两种try的处理方式,一种是try-catch,另一种是try-catch-finally
- 允许有多个catch语句,捕获不同的异常,并要求父类的异常在后,子类异常在前(如Exception在前,ArrayOutOfIndexException在后),假设发生异常,只有一个catch能捕获异常对象e
- 当Try块中所有代码无异常,不执行catch块中的代码,finally无影响
- 当try块中发生异常后,try剩下的所有语句都不再执行。
try {
} catch (NullPointerException e) {
//code
} catch (ArithmeticException e) {
//code
} catch (Exception e) {
//code
} finally {
//code
}
5.2throws细节
- 当一个方法中某个异常不知道如何处理时,可以显示地声明抛出异常,表示该方法将不处理这个异常,将给上一级处理
- throws抛出的异常类型可以是该方法中异常的类型也可以是它的父类
public static void readFile(String fileName) throws FileNotFoundException//接受方法体中的编译错误并向上抛出{
new FileInputStream("path....")//读取文件时找不到对应路径下的文件则发出编译错误
}
- 对于编译异常,程序中必须处理,即(try-catch或者throws)
- 对于运行异常(runtimesexception),如果程序没有处理,则会默认以throws的方式处理
- 子类重写父类的方法时,对于异常的抛出,子类重写的方法所抛出的异常要么与父类一致,要么是子类异常
- try-catch和throws不要同时出现
6.自定义异常
6.1定义
当程序中出现了某些异常没有再Throwable子类中时,可以自行继承定义异常类,用于描述该错误的信息。
6.2步骤
- 自定义异常类并继承Exception或RuntimeException
- 继承Exception,则系统认为属于编译异常,(注意:编译异常必须处理(即catch或throws),一般不使用)
- 继承RuntimeException,属于运行异常(常用,因为应用场景大且有默认异常处理机制(throws))
下面给出一个自定义异常的案例:
//当我们接受Person对象的年龄时,要求范围在18-100之间,否则抛出一个自定义异常,并打印异常提示
public class Exception2 {
public static void main(String[] args) /*默认存在throws AgeException*/{
int age = 2;
if(!(age >= 18 && age <= 100)){
throw new AgeException("age is not between 18 to 100");
}
System.out.println("age right");
}
}
class AgeException extends RuntimeException{
public AgeException(String message) {
super(message);
}
}

代码分析:
上面我们自定义了一个异常类并继承了RuntimeException,定义了一个参数为字符串的构造器,其中message会赋给超类的detialMessage这个字段,在提示异常的时候会显示打印这个字段。在主方法中,由于age不在规定范围内,会new 一个自定义异常对象并抛出,由于时运行时异常,所以底层会默认以throws的方式来处理该异常,即抛给JVM虚拟机,接着JVM会接受并且终止程序并输出对于异常信息。
7.throw和throws的区别
| 意义 | 位置 | 后面跟的东西 | |
| throws | 异常处理的一种方式 | 方法声明处尾部 | 异常类型 |
| throw | 手动生成异常对象的关键字 | 方法体中 | 异常对象 |
8.总结
好啦,上面就是本章所分享的相关异常的知识,希望在督促自己复习的同时能够给大家带来帮助。
我亦无他,唯手熟尔。
本文介绍了Java异常的基本概念,包括Error与Exception的区别,异常分类,处理机制(try-catch-finally与throws),自定义异常及throw和throws的区别。通过实例演示了如何在实际编程中应用这些知识。

被折叠的 条评论
为什么被折叠?



