/*
* 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之后的代码");
}
}