十二、Java异常处理

1.异常处理类的体系结构

1)程序出现异常是正常现象。【就像人会生病一样】

2) Java中异常类Throwable[类]顶级异常类。

3) Throwable[类]有两个子类:1.Error(错误) 2.Exception(异常)。

Error和Exception的区别

Error是java程序运行中不可预料的异常情况,这种异常发生以后,会直接导致JVM不可处理或者不可恢复的情况。所以这种异常不可能抓取到,比如OutOfMemoryError、NoClassDefFoundError等。【癌症】

Exception是java程序运行中可预料的异常情况,咱们可以获取到这种异常,并且对这种异常进行业务外的处理。【感冒】

Exception被分为运行时异常与非运行时异常

运行时异常--非检查性异常 在代码编写使,可以忽略捕获操作(比如:ArrayIndexOutOfBoundsException),这种异常是在代码编写或者使用过程中通过规范可以避免发生的。

非运行时异常--检查性异常 必须在编写代码时,使用try catch捕获(比如:IOException异常)。

2.Java异常处理的原理

1异常可以自己处理掉

通过try-catch代码块处理异常

将可能出现异常的java代码放在try{可能出现异常的代码}catch(异常){异常处理的代码},如果出现异常try{}就会进行捕获,终止代码的执行,将捕获的异常交给catch(){}进行异常处理

try-catch代码格式:

try{

异常可能出现的代码

}catch(要抓捕的异常类类型){

异常处理的方式

}

①try - 捕获可能发生异常代码

②catch(需要不抓的异常){处理异常的方法} : 抓获处理异常

catch后面的”()”中一般要定义为具有异常的类型

如果异常类型不明确,可以使用Exception/Throwable 上转型进行接受

catch的{}:既有异常处理的过程,往往都是打印堆栈到控制台,查询具体的情况,修改程序去避免

③一个try{}后面可以跟多个catch,多个catch中要捕获异常的类型应该由小到大的顺序排列。

④finally:出现在catch的{}后面,可以写。有无异常都会执行finally中的语句,当有一定需要执行的代码时就要写在finally中

例子:

测试主类

public class MainTest {
	public static void main(String[] args) {
		TryCatchClass ts = new TryCatchClass();
		ts.testException();
	}
}

//错误方法  除数不能为零
public class TryCatchClass {
	
	public int testException(){
		int c = 0;
		try{
			int a = 5;
			int b = 0;
			c = a / b;
		}catch (ArithmeticException e) {
			// TODO: ArithmeticException  
			e.printStackTrace();
		}
		return c;
	}
}

结果:

2.异常不自己处理掉

如果出现异常,java会根据问题所描述的异常类,创建一个对象(实例)具体异常对象,然而该对象抛给上一级(谁调谁报错)。

具体步骤:

method具体出现异常处 ---> main主方法---->jvm虚拟机--->将异常出现的位置和原因打印在控制台。

throws : 声明方法抛出异常给上一级(谁调用谁报错)。

3.throw关键字与自定义异常

简单的自定义异常--编写一个新类,继承Throwable/Exception/RumtimeException,在构造中访问父类的构造方法

例子:

//主类:
public class MainTest {
	public static void main(String[] args) {		
		ThrowTest ts1 = new ThrowTest(2);
		try {
			ts1.showArr();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
//throw测试类
public class ThrowTest {
	int arr[];
	int size;
	//	
	public ThrowTest(int size){
		this.size = size;
		arr = new int[size];
	}
	
	public void showArr() throws Exception{
		//判断数组的中的数是否为0,如果都为0则抛出异常,不能访问
		int count = 0; //统计0出现的次数
		for (int i = 0; i < arr.length; i++) {
		 if (arr[i] == 0) {
			 count++;
		 }
		}
		
		if (count == arr.length) {
			//如果数组都为0抛出异常
			throw new Exception("数组为空,不能查看");
		}
		//否则遍历数组
		for (int i = 0; i < arr.length; i++) {
			System.out.println("数组第"+ i +"项 = " +arr[i]);
		}
	}
}

总结一下:

1.如果有一场就try{}catch(){},如果不想try{}catch(){}那么就生命方法throws异常。

2.没有特殊要求的时候我们都是打印堆栈异常,查询程序的具体异常和位置,方便修改。

3.我们轻易不会自己定义异常,因为java提供的异常类型丰富。

4.java中的常见运行时异常

1.NullPointerException  :空指针引用异常。

2.ClassCastException : 类型强制转换异常。

3.illegaArgumentException : 传递非法参数异常。

4.ArithmeticException : 算术运算异常。

5.ArrayStoreException : 向数组存放与声明类型不兼容对象异常。

6.IndexOutOfBoundsException : 下标越界。

7.NegativeArraySizeException : 创建一个大小为负数的数组错误异常。

8.NumberFormatExcepion : 数字格式异常。

9.SecurityException :  安全异常。

10 . UnsupportedOperationException : 不支持操作异常。

无奈源于不够强大

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值