16 Java中异常的处理
Posted gavin520
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了16 Java中异常的处理相关的知识,希望对你有一定的参考价值。
16 Java中异常的处理
① 异常的概念及分类
1. 异常的概念
- 异常指的是在运行期间出现的错误。(程序开始执行,在执行期内出现的问题。出现异常后要关注异常的类型以及异常出现的行号)
- 在Java中,Java的异常是Java提供的用于处理程序错误的一种机制。
- 异常处理机制:一旦异常发生以后,使用异常处理机制让程序不会直接中断或者影响虚拟机运行。
2.异常的分类
- 根基类:Throwable
- 子类:Exception、Error
- Exception:
- 用户的错误。或者程序无法预见的一些问题。所有异常的父类。很多的子类,提供了很多的子类,每一种子类都对应到异常情况。
- 一旦出现Exception这种异常,需要开发者自己去处理(捕获)。
- Error:
- 称为错误(不是异常)。JVM生成并抛出,虚拟机错误、动态链接失败之类的等等。
- 程序控制不了,用户也无法控制。JVM的运行环境问题。
② 异常的结构体系
- Throwable:所有异常的根基类,也可以抛出
- Exception:表示异常,开发过程中可以进行处理
- 检查异常:编译器要求必须处理的异常,不处理程序无法运行。当代码没有运行的时候,编译器就检查出来的问题。
- 非检查异常:编译器不强制要求处理的异常。虽然在运行中有可能出问题,但是不要求进行处理。
- Error:表示错误,开发过程程序无法控制和处理
- Exception:表示异常,开发过程中可以进行处理
-
捕获异常的语法
语法1: try{ // 运行过程中要执行的逻辑代码 // 这段代码可能会出现问题,捕获异常 }catch( Exception e){ // 声明一个父类异常,接受任何一个异常 // 提示当前系统出现了什么样的异常 }
语法2: try{ }catch( ){ }catch( ){ }catch( ){ }
语法3: try{ }catch( ){ }finally{ } // 为异常提供了一个统一的出口,使得当前程序在跳转到另外程序的流程之前,能够对程序进行统一的管理。 // 无论try模块中的内容是否执行,finally代码都执行一次。 // finally里边通常执行的内容是资源的关闭或者日志的记录。
语法4: try{ }finally{ } // 对于某些“可疑代码”在操作的时候直接try起来,异常不需要管。
③ 异常的使用
1. 异常的执行流程
方法栈:方法在调用的过程中,先执行的方法后退出。
在方法执行中,方法压入到方法栈中,在某一个方法中出现了运行时异常,没有处理这种异常,后边方法的内容将无法执行,异常抛给了虚拟机,中断了虚拟机继续运行。
2. 申明并抛出异常
在本方法中,如果出现了异常,本方法可以不进行处理,抛给调用者处理,将异常一层一层的往外抛,在达到虚拟机之前处理好,整个程序运行流程也不受影响。
throw:将异常进行抛出(动作)
throws:声明将要抛出何种类型的异常(声明)
重写方法时候,子类与父类异常问题:
1. 父类方法没有抛出异常,而子类重写方法抛出了异常,不允许,编译不通过。
2. 父类抛出了异常,子类重写方法抛出与父类同样的异常,没有问题。
3. 父类抛出了异常,子类重写方法不抛出异常,编译器能通过,但是不推荐这样写。
4. 父类抛出一个Exception,子类可以抛出比Exception小的异常,子类不能不父类大。
5. 父类抛出比子类小的异常,不行,编译报错。
6. 父类抛出一个Exception,子类抛出多个子异常。编译通过。
总结:子类重写方法抛出的异常,要么与父类一样,要么比父类小。
3. 自定义异常
- 好处:在团队开发过程中,都是分模块、分功能来进行开发的,在项目中统一制定自己的异常,对外统一显示内容。
- 作用::
- 在用户发请求进行数据验证的时候,如果数据验证失败,自己抛出自定义异常。
- 在开发过程中,遇到某些逻辑上的问题,判断性别出现中性的时候。java没有提供性别中性异常,自定义。
- 系统提供的异常,如果直接给用户,体验不是特别好,包括异常的信息、代码。代码中能抛出去的异常,用户处理过的异常。
- 要求:
- 不管是自定义异常还是系统提供的异常,都必须是Throwable的子类。
- 写一个检查性异常,需要写一个类来继承Exception。
- 写一个运行时异常,需要写一个类来继承RuntimeException。
以上是关于16 Java中异常的处理的主要内容,如果未能解决你的问题,请参考以下文章
java.util.MissingResourceException: Can't find bundle for base name init, locale zh_CN问题的处理(代码片段