作者:Mr_cool | 来源:互联网 | 2023-09-16 09:26
一、Java中异常类的体系结构1.程序出现异常时正常现象【就跟人会生病一样】2.Java中异常类Throwable【类】是顶级异常类3.Throwable【类】有两个子类:(1)E
一、Java中异常类的体系结构
1.程序出现异常时正常现象【就跟人会生病一样】
2.Java中异常类Throwable【类】是顶级异常类
3.Throwable【类】有两个子类:
(1)Error【错误】
(2)Exception【异常】
二、Error与Exception的区别
Error是java程序运行中不可预料的异常情况,这种异常发生后,会直接导致JVM不可处理或者不可恢复的情况。所以这种异常不可能抓取到,比如OutOfMemoryError、NoClassDefFoundError等。【癌症】
Exception是java程序运行中可预料的异常情况,咱们可以获取到这种异常,并且对这种异常进行业务外的处理。【感冒】
三、运行时异常与非运行时异常的区别
非运行时异常—>检查性异常 必须在编写代码时,使用try catch捕获(比如:IOException异常)。
运行时异常—>非检查性异常 在代码编写使,可以忽略捕获操作(比如:ArrayIndexOutOfBoundsException),这种异常是在代码编写或者使用过程中通过规范可以避免发生的。
四、Java异常处理的原理
1.问题自己处理不了
如果出现异常,java会根据问题所描述的异常类,创建一个对象(实例)具体异常对象,然后将该对象抛给上一级【谁调用谁就是上一级】,具体步骤:
method具体出异常处 —> main主方法 —> jvm虚拟机 —> 将异常出现的位置和原因打印在控制台。
2.问题可以自己处理掉–通过try-catch代码块处理异常
将可能出现异常的java代码使用”try{异常可能发生的代码}catch(要抓捕的异常){异常处理方式}”块包裹,如果出现异常try{}就会捕获异常,终止代码的运行,将捕获的异常交给catch(){}去处理异常。
五、try{}catch(){}finally{}的用法
异常可以自己处理掉 — 通过try-catch代码块处理异常
格式:
try{
}catch(
}finally{
}
(1)try —> 捕获可能发生的异常
(2)catch(//要抓捕的异常){//异常处理方式} —> 处理异常
catch后面的" ( ) "中专门定义具体异常类型
catch的 {} —> 具体异常的处理过程
(3)finally{} —> 有无异常都要执行的动作
例如:
package com.wangxing.test1;
public class TestMain {public static void main(String[] args) {try{int numbers[]=new int[2];numbers[0]=10;numbers[1]=0;int num1=numbers[0];int num2=numbers[1];int num3=num1/num2;numbers[2]=num3;System.out.println("程序执行完毕!!");}catch(IndexOutOfBoundsException e3) {System.out.println("处理数组下标越界异常!");}catch(ArithmeticException e2) {System.out.println("处理除数为0的异常!");}catch(Exception e1) {System.out.println("exception异常!");}catch(Throwable e) {System.out.println("Throwable异常!");}finally {System.out.println("有无异常都要执行");}}
}
运行结果:
1.当我们无法判断try{}何种具体异常的时候,我们可以在catch块的参数中通过定义Exception/Throwable类的对象来代替具体异常类型。
2.一个try{}后面可以跟随多个catch块,多个catch块需要按照具体异常的级别由第到高排列
3.finally{}–有无异常都要执行的动作
4.当try{}catch(){}finally{}出现在一个有返回值的方法中时,finally{}中的内容实在本方法的return语句之前运行。
例如:
package com.wangxing.test2;
public class TestClass {public int testMehtod() {try {int a=10;return a;}catch(Exception e) {e.printStackTrace();}finally {System.out.println("有无异常都执行");}return 0;}
}
package com.wangxing.test2;public class TestMain {public static void main(String[] args) {TestClass tc=new TestClass();System.out.println(tc.testMehtod());}
}
六、throws与throw关键字的用法
throws —> 声明方法抛出异常给上一级【谁调用谁就是上一级】
格式:访问限制修饰符 返回值类型 方法名称()throws 具体异常类型{ }
当我们无法判断读具体异常类型的时候使用Exception/Throwable代替
例如:
package com.wangxing.test3;
public class DoClass {public int testMethod() throws Exception{int a=10/0;return a;}
}
package com.wangxing.test3;
public class TestMain {public static void main(String[] args) throws Exception{DoClass dc=new DoClass();int res=dc.testMethod();System.out.println("res=="+res);}
}
throw —> 手动引发一个具体异常
自定义异常 —> 编写一个新类,继承Exception/Throwable,在构造方法中访问父类的构造方法。
package com.wangxing.test4;
public class MyException extends Exception{public MyException(String info) {super(info);}
}
package com.wangxing.test4;
public class Person {private int age;public void setAge(int inputage) throws MyException{if(inputage > 0 && inputage <= 200) {age=inputage;}else{throw new MyException("你提供的年龄不符合要求!!");}}public int getAge() {return age;}
}
package com.wangxing.test4;
public class TestMain {public static void main(String[] args) throws MyException{Person person=new Person();person.setAge(-10);System.out.println("age=="+person.getAge());}
}
七、Java中常见运行时异常
1. NullPointerException - 空指针引用异常
2. ClassCastException - 类型强制转换异常。
3. IllegalArgumentException - 传递非法参数异常。
4. ArithmeticException - 算术运算异常
5. ArrayStoreException - 向数组中存放与声明类型不兼容对象异常
6. IndexOutOfBoundsException - 下标越界异常
7. NegativeArraySizeException - 创建一个大小为负数的数组错误异常
8. NumberFormatException - 数字格式异常
9. SecurityException - 安全异常
10. UnsupportedOperationException - 不支持的操作异常
总结