14.异常

1.概述

         Java通过面向对象思想将问题封装成对象,用异常类对其进行描述。

2.体系

         a. 问题有很多,因此有很多类进行描述。将其共性向上抽取,形成异常体系。

         b.异常分为 不可处理异常 Error 可处理异常 Exception ,都继承自 接口 Throwable

3.原理、异常对象的抛出throw

          a.当程序违反了Java语法规则时,Java虚拟机就会将发生的错误表示为一个异常,并抛出到控制台这属于Java类库内置的语义检查

          b.异常对象的抛出throw

代码示例:

class Demo{
	public int method(int[] arr,int index){
		if(index>=arr.length){
			throw new ArrayIndexOutOfBoundsException("数组越界异常,角标为:"+index);//抛出异常对象并对异常内容进行自定义
		}
		if(index<arr.length){
			throw new ArrayIndexOutOfBoundsException("数组角标不能为负数,角标为:"+index);
		}
		if(arr==null){
			throw new NullPointerException("数组不能为空");
		}
		return arr[index];
	}
}
public class ExceptionDemo {
	public static void main(String[] args){
		int[] arr=new int[3];
		
		Demo d=new Demo();
		int num=d.method(null,3);
		System.out.println("num="+num);
		
	}
}
4.自定义异常、异常类的抛出throws

           a.自定义异常:Java语序程序员扩展这种语义检查,可以自定义异常并自由选择在何时用throw关键字引发异常

           b.如果让一个类成为异常类,必须要继承异常体系(Exception或RuntimeException),因为只有称为异常体系的子类才具备可抛性

代码示例:

class FushuIndexException extends Exception {//自定义异常类
	FushuIndexException(String msg) {
		super(msg);
	}
}

class Demo {
	public int method(int[] arr, int index) throws FushuIndexException {

		if (index < arr.length) {
			throw new FushuIndexException("数组角标不能为负数,角标为:" + index);
		}

		return arr[index];
	}
}

public class ExceptionDemo {
	public static void main(String[] args) throws FushuIndexException {
		int[] arr = new int[3];

		Demo d = new Demo();
		int num = d.method(arr, -1);
		System.out.println("num=" + num);

	}
}
5.编译时异常和运行时异常&throws和throws的区别

           a.编译时异常和运行时异常:

编译时异常:只要是Exception和其子类都是,除了特殊子类RuntimeException体系,这种问题有对应的处理方式并进行针对性处理。

运行时异常:Exception中的RuntimeException和其子类,这种问题无法让功能继续,算法无法进行,运行时强制停止程序

           b.throws和throw的区别

使用位置不同:throws使用在函数头上,throw使用在函数内部

抛出内容不同:throws抛出的是异常类,可抛出多个,用逗号隔开;throw抛出的是异常对象,只能是一个

6.异常捕捉trycatch

          a.异常处理的捕捉形式:这是可以对异常进行针对性处理的方式

          b.具体格式:

try{
	//需要被检测异常的代码
}
catch(异常类 变量){//该变量用于接收发生的异常对象
	//处理异常的代码
}
finally{
	//一定会被执行的代码
}

         c.代码示例:

		int[] arr = new int[3];
		Demo d = new Demo();

		try {
			int num = d.method(arr, -30);
			System.out.println("num=" + num);
		} catch (FushuIndexException f) {
			System.out.println("负数角标异常");//解决问题后程序继续运行
		}
		System.out.println("over");
7.多catch情况

代码示例:

		try {
			int num = d.method(arr, -30);
			System.out.println("num=" + num);
		} catch (NullPointerException e) {//catch1
			System.out.println(e.toString());
		} catch (FushuIndexException e) {//catch2
			System.out.println("负数角标异常");// 解决问题后程序继续运行
		}
8.异常处理原则

          a.函数内部如果抛出需要检测的异常,则函数上必须声明;否则必须在函数内用trycatch捕捉,否则编译失败。

          b.如果调用到了声明异常的函数,要么trycatch要么throws,否则编译失败。

          c.什么时候用catch,什么时候用throws? 功能内容可以解决用catch,功能解决不了用throws告诉调用者,由调用者解决。

          d.一个功能如果抛出多个异常,那么调用时,必须由对应多个catch进行针对性处理。

9.finally代码块

		finally{//通常用于关闭(释放)资源
			System.out.println("finally");
		}

10.注意事项

          a.子类在覆盖父类方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常或者该异常的子类

          b.如果父类抛出多个异常,那么子类只能抛出父类异常的子集

          c.父类如果没抛出异常,子类一定不能抛出异常,只能try

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值