写在前面
你们好,我是小庄。很高兴能和你们一起学习Java。如果您对Java感兴趣的话可关注我的动态.
写博文是一种习惯,在这过程中能够梳理和巩固知识。
本篇简介
什么是
异常
?
程序不正常的行为或状态
什么是异常处理
?
– 程序返回安全的状态,并能够让用户执行其他的命令;或者
– 允许用户保存结果,并以妥善的方式终止程序
一、异常分类
1、Throwable
Throwable类是Java语言中所有错误和异常的根类
2、Error
Error是Throwable的子类,表示严重的问题,合理的应用程序不应该试图捕获
Error错误的发生一般是系统错误或资源耗尽,不重点关注
3、Excption
Excption
是Throwable的另一个子类,是程序有关的异常,需要重点关注
Excption又分为检查型异常
和非检查型异常
例如我们常见的:RuntimeException
运行时异常(非检查型)和IOExcption
输入输出流异常(检查型)
二、异常处理
既然我们程序中会出现异常,那么我们就应该对可能发生的异常进行处理,而出现Error错误的异常并不是和程序相关,所以下面只对Excption异常
进行展开处理
1、使用的关键字
try
:执行可能产生异常的代码(正常业务逻辑代码)
catch
: 捕获异常,但try发生异常,将执行catch代码,否则跳过
finally
: 无论是否发生异常,finally里面的代码都会执行
throws
: 声明抛出异常
throw
: 手动抛出异常
2、异常结构
注:catch可以有多个,下同
- try … catch
- try … catch … finally
- try … finally
代码实例
//结构一
try
{
// 正常逻辑的程序代码
}catch(Exception e)//Exception是异常类名,e是异常变量
{
//捕获异常后执行的代码块
}
//结构二
try
{
// 正常逻辑的程序代码
}catch(Exception e)//Exception是异常类名,e是异常变量
{
//捕获异常后执行的代码块
}finally{
//不管有没有异常都会执行的代码块
}
//结构三
try{
// 正常逻辑的程序代码
}finally{
//不管有没有异常都会执行的代码块
}
举例常见使用错误的代码
//错误一,没有catch和finally
try{
//正常逻辑的代码块
}
//错误二,多个catch语句,前面的异常类范围比后面的范围大:Exception 大于ClassNotFoundException
try{
//正常代码块
}catch(Exception e){
//当程序发生异常,先进入Exception执行,后面的Catch就会报错
}catch(ClassNotFoundException e){
//ClassNotFoundException是类找不到异常,范围比Exception小
//正确的方法是把这个异常放在Exception的前面
}
//错误三,catch独立于try存在
catch(Exception e){
//没有检查到try,编译器报错
}
//错误四,finally执行改变控制流语句(return,throw,break,continue)
//原因:finally的返回值会遮蔽原来返回值的结果
public static int parseInt(String s){
try{
return Integer.parseInt(s);
}finally{
return 0;//Error,假设s为10,最后的结果是返回0,遮蔽了原来的返回值
}
}
小结:
1、finally
是必定执行的代码块,一般是关闭资源,比如关闭数据库连接
2、catch
可以有多个,但不能独立于try存在
3、catch
捕获异常,规则是从上往下捕获,异常的范围要制定为从上往下的范围越来越大
,否则可能会报错!
4、try
必须有,catch
和finally
至少要有一个
5、finally不推荐使用
执行改变控制流语句(return,throw,break,continue)
6、子类重写父类的方法,抛出的异常不能大于父类异常的范围
3、声明抛出异常
如果遇到了无法处理的情况,可以抛出异常,使用关键字throws
例如:public void File(String name) throws FileNotFoudException{}
可以抛出多个异常,用逗号分开
例如:throws FileNotFoudException , ClassNotFoundException {}
4、手动抛出异常
如果捕获了异常,并且不想马上进行处理,则可以使用关键字throw
手动抛出异常。
如果手动抛出异常方法被调用
,就需要对该异常进行处理,或者抛出异常
//方法一
public class Test{
public void test() throws Exception {//声明抛出异常
throw new Exception("我手动抛出了异常");
}
}
//方法二
public class Test2 {
public void test(){//在try语句内不用声明异常
try {
throw new Exception("我手动抛出了异常");
}catch(Exception e) {
e.printStackTrace();
}
}
}
三、自定义异常
- 继承Exception或Exception的子类,如果继承Exception,则是检查型异常
- 若继承RuntimeException,则是非检查型异常
- 自定义重点在
构造函数
- 调用父类的
message
构造函数- 可以自定义自己的成员变量
我们开始吧!
1、自定义异常类
public class MyException extends Exception{
//自定义成员变量
private String ReturnCode;
private String ReturnMsg;
//无参构造
public MyException(){
//调用父类Exception的无参构造
super();
}
public MyException(String message) {
//调用Exception的message有参构造函数
super(message);
this.ReturnMsg=message;
}
//定义自己的有参构造函数
public MyException(String code,String message) {
super();
this.ReturnCode=code;
this.ReturnMsg=message;
System.out.println(message);
}
//获取状态码的方法,在项目中常用到
public String getReturnCode() {
return ReturnCode;
}
//获取异常信息
public String getReturnMsg() {
return ReturnMsg;
}
}
2、使用自定义异常类
public class Test{
//声明抛出异常方法
public static void test() throws MyException{
throw new MyException("401","权限错误");
}
public static void main(String[] args) {
try {
//调用异常方法
Test.test();
} catch (MyException e) {
// 打印异常
e.printStackTrace();
//获取异常状态码输出
System.out.println(e.getReturnCode());
//获取异常信息输出
System.out.println(e.getReturnMsg());
}
}
}
上一篇:反射、注解、接口
下一篇:Java常用类