Java异常处理介绍__java

异常

java程序运行过程中出现的问题。
异常有 Throwable Error Exception
异常的继承体系
Throwable 类是 Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。类似地,只有此类或其子类之一才可以是 catch 子句中的参数类型。
Throwable 魔界首领
Error
Exception
runtimeException
在这里插入图片描述

JVM默认是如何处理异常的

异常分为三种:系统错误,异常和运行时异常。
系统异常(system error) 是由Java虚拟机抛出,用error类表现。(我们程序员的错误,ide一般会帮我们解决)
异常(exception)是描述程序和外部环境引起的错误,一般被捕捉和处理。
运行时异常(runtime Exception)设计错误,如数组越界、空指针等。

  • JVM默认是如何处理异常的
    • main函数收到这个问题时,有两种处理方式:
      • 自己将该问题处理,然后继续运行
      • 自己没有针对的处理方式,只有交给调用main的jvm来处理
    • jvm有一个默认的异常处理机制,就将该异常进行处理.
      • 并将该异常的名称,异常的信息.异常出现的位置打印在了控制台上,同时将程序停止运行
处理异常
  • try catch finally 方式
    try catch
    try catch finally
    try finally
    finall一般是为了关闭资源存在的。
  • throws方式
    try catch 用法
try{
XXXXX
}catch(RuntimeExcetpion e){
xxxxx
}catch(Excetption e){
xxxxx
}
//注意:顺序不可颠倒,Exception 可捕获所有异常

这里有一个考点:
finally运行吗?

//finally 在不遇到 system.exit(0),强制关机等意外情况时 不运行 其他情况都运行
int b=3;
int c = 0;
try{
int  a = b/c;
}catch(Excetion e){
System.out.println("异常找到了");
return  b;//运行到这里时,先将return b保存起来(临时存放),寻找finally 并运行 但它的运行不影响catch的返回值。
}finally{
b++;// 运行后 b = 4;
//return 2;  如果finally中有return,那么会覆盖掉上面的return(不推荐)
}
异常的分类

运行时异常 RuntimeException类
这个类及其子类都是程序运行出来时,的错误,比如 NullPointerException、ArrayIndexOutOfBoundsException等
而其他的异常是我们没有编译时异常,在Eclipse中会编译不让通过的。

Throwable 常用的方法

getMessage()
获取异常信息,返回字符串
在这里插入图片描述
toString()
获取异常类名和异常信息,返回字符串
在这里插入图片描述
printStackTrace()//默认调用
获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。
在这里插入图片描述

throws 处理异常
  • 定义功能方法时,需要把出现的问题暴露出来让调用者去处理。
  • 那么就通过throws在方法上标识。
throw的概述以及和throws的区别
  • throw的概述
    • 在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。
/**
	 * throws的方式处理异常
			* 定义功能方法时,需要把出现的问题暴露出来让调用者去处理。
			* 那么就通过throws在方法上标识。
	* 案例演示
			* 举例分别演示编译时异常和运行时异常的抛出
			* 编译时异常的抛出必须对其进行处理
			* 运行时异常的抛出可以处理也可以不处理
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		Person p = new Person();
		p.setAge(-17);
		System.out.println(p.getAge());
	}
class Person {
	private String name;
	private int age;
	public Person() {
		super();
		
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) throws AgeOutOfBoundsException {
		if(age >0 && age <= 150) {
			this.age = age;
		}else {
			//Exception e = new Exception("年龄非法");
			//throw e;
			throw new AgeOutOfBoundsException("年龄非法");
		}
	}
	
	
}

/**
	 * try...catch的方式处理多个异常
	 * JDK7以后处理多个异常的方式及注意事项
	 * 
	 * 安卓,客户端开发,如何处理异常?try{}catch(Exception e){}
	 * ee,服务端开发,一般都是底层开发,从底层向上抛
	 * 
	 * try后面如果跟多个catch,那么小的异常放前面,大的异常放后面,根据多态的原理,如果大的放前面,就会将所有的子类对象接收
	 * 后面的catch就没有意义了
	 */
	public static void main(String[] args) {
		//demo1();
		int a = 10;
		int b = 0;
		int[] arr = {11,22,33,44,55};
		
		//JDK7如何处理多个异常
		try {
			System.out.println(a / b);
			System.out.println(arr[10]);
		} catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
			System.out.println("出错了");
		} 
	}

	public static void demo1() {
		int a = 10;
		int b = 0;
		int[] arr = {11,22,33,44,55};
		
		try {
			System.out.println(a / b);
			System.out.println(arr[10]);
			arr = null;
			System.out.println(arr[0]);
		} catch (ArithmeticException e) {
			System.out.println("除数不能为零");
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("索引越界了");
		} catch (Exception e) {				//Exception e = new NullPointerException();
			System.out.println("出错了");
		}
		
		System.out.println("over");
	}
  • throws和throw的区别
    • throws
      • 用在方法声明后面,跟的是异常类名
      • 可以跟多个异常类名,用逗号隔开
      • 表示抛出异常,由该方法的调用者来处理
    • throw
      • 用在方法体内,跟的是异常对象名
      • 只能抛出一个异常对象名
      • 表示抛出异常,由方法体内的语句处理
注意点
  • 异常注意事项
    • 子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。(父亲坏了,儿子不能比父亲更坏)
    • 如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常
    • 如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws
  • 如何使用异常处理
    • 原则:如果该功能内部可以将问题处理,用try,如果处理不了,交由调用者处理,这是用throws

    • 区别:

      • 后续程序需要继续运行就try
      • 后续程序不需要继续运行就throws
    • 如果JDK没有提供对应的异常,需要自定义异常。

猜你喜欢

转载自blog.csdn.net/qq_40435621/article/details/84622574