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