JAVA异常体系

/*
 * 	Throwable  所有错误与异常的父类
 * 		| -- Error 错误  一般 是由于jvm或者 硬件引发的问题,一般不会通过代码 处理错误
 * 		| -- Exception 异常 是我们需要通过代码去处理的
 * 
 * 	异常的方式处理: try-catch块的处理方式  捕获异常
 * 		try{
 * 			可能会出现异常的代码
 * 		}
 * 		catch(变量类型 变量名){
 * 			处理异常的代码
 * 		}
 * 
 * 	细节:
 * 	1.如果一个 try块中出现了 异常代码 ,经过处理之后,那么try-catch块外面的代码可以正常执行
 * 	2.如果一个 try块中出现了 异常代码,那么try块中异常代码 后面的代码无法正常执行
 * 	3.一个try块中后面可以 跟多个 catch块,也就是说一个块可以捕获多种异常的类型
 * 	4.但是 捕获的异常类型必须按照从小到大进行捕获
 * 
 * 
 * */

/*
 * 
 * 1、	编写程序ArrayDivide,在其中同时给出两个不同大小的整型数组。
 * 利用循环,将第一个数组包含的整型数作为被除数,第二个数组包含的整型数作为除数。
 * 用第一个数组中的整型数除以第二个数组中相应位置的元素。
 * 考虑各种可能产生的异常,并设计程序捕获和处理这些异常。
	提示:当第一个数组的长度大于第二个数组的长度时,
		可能产生的ArrayIndexOutOfBoundsException异常;
		当被除数为0时,
		可能产生ArithmeticException的异常

 * 
 * 
 * */


public class Task1 {

	public static void main(String[] args) {
		
		int[] arr1 = {234,56,23,54,65};
		int[] arr2 = {23,0,4,7};
		for(int i = 0;i<arr1.length;i++){
			try{
			System.out.println(arr1[i]+"/"+arr2[i]+"="+arr1[i]/arr2[i]);
			}catch(ArrayIndexOutOfBoundsException e){
				System.out.println("数组下标越界");			
			}catch(ArithmeticException e){
				System.out.println("除数不能为 0");
			}
			
		}
		
	}
}

 

/*
 * 		Throwable
 * 			|-- Error 错误 
 * 				一般是由于 jvm 或者 硬件 引发的问题,所以一般没有办法通过代码去处理
 * 			|-- Exception 异常
 * 
 * 
 * 
 * */


public class Demo2 {

	public static void main(String[] args) {
		//jvm默认管理的内存 为 64M
		//java.lang.OutOfMemoryError: Java heap space
		byte[] arr = new byte[1024*1024*200]; //需要200M的一块空间
		System.out.println("hello world");
	}
}
/*	
 * 	疑问:怎么会有 异常 的栈信息出现呢?
 * 		异常的栈信息 是 用过 printStackTrace的方法打印的,那么异常对象从何而来?
 * 	
 * 	jvm虚拟机 在 执行 a/b代码的时候,发现b(除数)等于 0 ,在现实生活中属于一种
 * 	不正常的情况,jvm一旦发现了不正常的情况,那么就会马上创建一个 相应的异常对象,
 * 	并且调用  该 异常对象的 printStackTrace方法把异常信息 打印处理
 * 
 * 	(没有处理 异常的情况下,一旦报错,程序就停止运行)
 * 
 * 	异常的处理方式:
 * 	方式1: 捕获异常
 * 
 * 	try{
 * 		可能会发生异常的代码
 * 	}catch(异常的类型  变量名){
 * 		异常的处理代码
 * 	}
 * 
 * 	捕获异常要注意的细节:
 * 
 * 	1.如果一个 try块 的代码 出现了 异常 
 * 	经过处理之后,那么try-catch块外面的代码可以正常执行
 * 
 * 	2.如果一个 try块中出现了异常的代码
 * 	那么在try块中出现异常代码后面的所有代码都无法正常执行
 * 	
 * 	
 * 
 * 	
 * 
 * */

public class Demo4 {

	public static void main(String[] args) {
		
		div(4,0);
	}
	public static void div(int a,int b){
		//捕获异常
		try{
			/*
			 * 
			 * 当 jvm 执行到 c = a/b ,发现 b为 0 ,
			 * 那么 就会 创建一个ArithmeticException 对象
			 * ArithmeticException e = new ArithmeticException("/by Zero");
			 * 
			 * */
			int c =a /b;
			System.out.println("两者相除结果为 :"+c);
			System.out.println("------------");
		
		/* catch语句 捕获 try语句中的异常,
		 * try语句中一旦出现了异常,并且 能够匹配catch参数的异常类型
		 * 那么就处理该异常,就是执行 catch语句中的代码
		*/
		}catch(ArithmeticException e){
			/*
			 * ArithmeticException e
			 * 指的就是 报错 时 ,jvm给我们创建好的异常对象
			 * 
			 * */
			
			System.out.println("除数不能为 0");
			System.out.println(e.getMessage());
		}
		
		int d = a*b;
		
		System.out.println("两者相乘结果为:"+d);
	}
}
/*
 * 		try-catch的细节:
 * 
 * 		1.try块 中 如果 可能会 出现 多个异常
 * 			一个 try 块的后面 可以 跟多个 catch块,也就是一个快 可以捕获 多种异常类型
 * 		2.一个try块 后面 可以跟多个 catch块
 * 			但是 捕获 的异常类型 必须按照 从小到大进行捕获
 * 		3.多个 catch块 捕获异常, 异常匹配 catch语句的 顺序为从上至下
 * 
 * */


public class Demo5 {

	public static void main(String[] args) {
		
		div(4,0,null);
	}
	
	public static void div(int a,int b,int[] arr){
		try{
			int c = a/b;
			System.out.println("两者相除 ,结果为"+c);
			System.out.println("传进来数组的长度为:"+arr.length);
		}catch(ArithmeticException e){
			System.out.println("除数不能为 0");
		}catch(NullPointerException e){
			System.out.println("传进来的数组 不能为null");
		}catch(Exception e){
			System.out.println(e.getMessage());
		}
		
		System.out.println("try-catch之后的代码");
	}
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值