欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

异常总结

程序员文章站 2022-07-15 13:04:08
...

所有的异常都是 Throwable 的子类!

而在 Throwable 下有两个子类:

Error 和 Exception ! 请解释区别?

Error:指的是JVM错误! 即:此时的程序还没有执行!如果没有执行用户无法处理!
Exception:指的是程序运行中产生的异常!用户可以处理!

所谓的异常处理指的是所有Exception以及它的子类异常!

异常处理流程:

1.当程序在运行的过程之中出现异常之后,JVM会自动根据异常的类型产生实例化一个与之类型匹配的异常对象
(用户不用关心new,由系统自动负责处理)!

2.产生了异常对象之后会判断当前的语句上是否存在异常处理,如果没有异常处理,就会交给JVM进行默认的异常处理!
处理的方式:输出异常信息,而后结束程序的调用!

3.如果此时存在由异常的捕获操作,会由try语句来捕获产生的异常类实例化对象,而后与try语句后的每一个catch进行比较!
如果现在有符合的catch捕获类型,则使用当前catch的语句来进行处理,如果不匹配,则向下继续匹配其它的catch!

4.不管最后异常处理是否能够匹配,都要向后执行,如果此时程序中存在finally语句,先执行finally中的代码
但是执行完毕后需要根据之前的catch匹配结果来决定如何执行,如果之前捕获成功,就继续执行finally之后的代码
如果没有捕获成功,就将此异常交给JVM进行默认处理(输出异常信息,而后结束程序执行)!

整个过程就好比方法重载!根据catch后面的参数类型进行匹配,但是所有的Java对象都存在自动向上转型操作支持!
简单的做法是 匹配它们的父类Exception处理就ok!

使用Exception捕获异常:

1. 在编写多个catch捕获异常时,捕获范围大的异常要放在后面!

2.虽然直接捕获比较方便,但也有缺点!因为所有的异常都会按照同样一种方式处理!
在一些要求严格的项目里,异常一定要分开处理!

throws关键字:

throws关键字主要用于方法的声明上,指的是方法之中出现异常后交给被调用处处理!

调用了使用throws声明的方法之后,不管操作是否出现异常,都必须使用try...catch进行处理!

如果在main()使用throws抛出异常,异常将交给JVM进行处理,采用默认的处理方式,输出异常信息,而后结束程序调用!

主方法上不要使用throws,因为如果程序出错,也希望可以正常执行结束调用!

throw关键字:

在程序之中可以直接使用throw手工的抛出一个异常类的实例化对象!

解释throw 和 throws 的区别?

throw:指的是在方法之中人为抛出一个异常对象(这个异常类对象可能是自己实例化或者是抛出已经存在的)!

throws:在方法声明上使用,表示此方法在调用时必须处理异常!

异常的使用格式:

代码:

class MyMath {
	// 此时div()方法上如果出现异常交给被调用处处理
	public static int div(int x,int y) throws Exception{
		int result = 0;
		System.out.println("***1.除法计算开始***");
		try {
			result = x/y;
		} catch (Exception e) {
			throw e; // 继续抛出异常
		} finally {
			System.out.println("***2.除法计算结束***");
		}
		return result;
	}
}
public class Demo {
	public static void main(String[] args) {
		try {
			System.out.println(MyMath.div(10, 0));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

  

RuntimeException类:(运行时异常)

在Java中为了方便用户编写代码,专门提供一种RuntimeException类!这种异常类最大的特征是:
程序在编译的时候不会强制性的要求用户处理异常,用户了可以根据自己的需要选择型的进行处理!
但是如果没有处理又发生异常了,将交给JVM进行默认的处理!
也就是说RuntimeException的子异常类,可以根据用户需要选择进行处理!

请解释Exception 和 RuntimeException 的区别?

Exception 是 RuntimeException的父类,使用Exception定义的异常必须要被处理,而RuntimeException的异常可以选择性得到进行处理!

Exception(强制处理!)、RuntimeException(选择处理!)

请列举出几个常见的 RuntimeException 类?

ArithmeticException NullPointerException ClassCastException

assert关键字:

主要功能是进行 断言!

Java中的断言指的是程序执行到某行代码处时一定是预期的结果!

默认情况下断言是不应该影响程序运行的,也就说在Java解释程序的时候,断言是默认不起作用的!

启用断言: java -ea Demo

public class Demo {
	public static void main(String[] args) {
		int num = 10;
		// 中间可能经了20行代码来操作num的内容
		// 期望中的内容应该是20
		assert num == 20 : "num的内容不是20";
		System.out.println("num="+num);
	}
}

  

自定义异常:

虽然Java中提供了大量的异常,但是在实际开发中往往不够用!

例如:AddException

 

class AddException extends Exception {
	public AddException(String msg){
		super(msg);
	}
}
public class Demo {
	public static void main(String[] args) {
		int num = 20;
		try {
			if(num > 10){ // 出现错误,英爱产生异常
				throw new AddException("数值传递过大!");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

  

总结:

1.Exception的父类是Throwable,但是在编写代码的时候尽量不要使用Throwable,因为Throwable下还包含对了Error子类!
我们能够处理的只有Exception子类!

2.异常处理的标准格式:try,catch,finally,throw,throws;

3.RuntimeException 和 Exception 的区别!