6.4.Java中异常类的体系结构

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

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

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

Java非运行异常 java运行异常类_运行时异常


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("有无异常都要输出");	
		}
	}
}

运行结果为

Java非运行异常 java运行异常类_Java非运行异常_02

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());
	}
}

运行结果为:

Java非运行异常 java运行异常类_java_03


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);
	}
}

Java非运行异常 java运行异常类_Java非运行异常_04


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());
	}
}

Java非运行异常 java运行异常类_异常类型_05


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

  1.NullPointerException - 空指针引用异常

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

  3.IllegalArgumentException - 传递非法参数异常。

  4.ArithmeticException - 算术运算异常

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

  6.IndexOutOfBoundsException - 下标越界异常

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

  8.NumberFormatException - 数字格式异常

  9.SecurityException - 安全异常

  10.UnsupportedOperationException - 不支持的操作异常