Java异常和异常处理

写在前面
  你们好,我是小庄。很高兴能和你们一起学习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可以有多个,下同

  1. try … catch
  2. try … catch … finally
  3. 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必须有,catchfinally至少要有一个
  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();
	}
	}	
}

三、自定义异常

  1. 继承Exception或Exception的子类,如果继承Exception,则是检查型异常
  2. 若继承RuntimeException,则是非检查型异常
  3. 自定义重点在构造函数
  4. 调用父类的message构造函数
  5. 可以自定义自己的成员变量

我们开始吧!
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常用类

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值