异常的概述
没有人能保证自己的程序永远不会出现错误,就算能够提前预知到发生的错误,用条件语句来对错误进行处理,但事实上世界上的意外是不可穷举。要处理意外错误的方法,可以使用java提供的异常处理机制解决这个问题。try---catch
其实可以将try---catch理解为一种非常强大的if---else块,例如://try---catch
try{
//执行代码
要执行的业务代码
}
//如果有异常被抛出则扑捉异常并处理
catch(Exception e){
异常的处理
}
//----------------------------
//if---else
//如果一切正常没有出现错误,则正常运行代码
if(一切正常){
业务代码
}
//否则对出现的错误进行处理
else{
错误处理
}
异常的继承关系
Java将所有非正常的情况分为错误类(Error)和异常类(Exception),Error类的错误一般指与虚拟机有关的问题,如系统奔溃、虚拟机错误、动态链接失败等,这种错误无法捕获或者恢复,将直接造成应用程序的中断。
Checked异常体系和Runtime异常体系
所有的RuntimeException类及其子类异常被称作Runtime异常体系,其他异常为Checked异常体系,RuntimeException体系的异常不需要显式声明抛出或者捕捉,如果需要捕捉也可以使用try---catch块来进行捕获处理。 Checked体系的异常被认为是可修复的异常,要么显式的声明抛出要么捕获处理,不可对Checked的异常不闻不问。Throws 和Throw
throws是声明在方法体后,告知可能发生异常。而throw是用在方法体中,直接抛出异常,例子如下:public class Test{
public static void main (String[] args)throws IndexOutOfBoundsException{
try{
String a=args[0];
String b=args[1];
System.out.println("这两个数相加的和是:"+(a+b));
}
catch(IndexOutOfBoundsException e){
//如果捕获到异常输出提示
System.out.println("发生一个异常,可能是数组越界造成的");
System.out.println(e.getMessage());
//然后抛出一个新的异常
throw new IndexOutOfBoundsException();
}
结果如图
自定义异常类
在通常情况下,程序很小会自行抛出系统异常,因为异常的类名通常也包含了改异常的有用信息。所以在选择异常抛出时,应该选择合适的异常类,从而可以明确地描述该异常的枪口。在这种情形下,用程序常常需要抛出自定义异常。 用户自定义异常都应该继承Exception基类,如果希望定义Runtime异常,则应该继承RuntimeException基类。定义异常类时,常常需要提供两个构造器:一个是无参构造器;另一个是带一个字符串参数的构造器,这个字符串将作为该异常对象的描述信息(也就是异常对象的getMessage()方法的返回值)下面定义了一个自定义异常类public class AuctionException extends Exception{
//无参构造器
public AuctionException(){}
//带一个字符串的构造器
public AuctionException(String msg){
super(msg);
}
}
异常的跟踪栈
异常对象的printStackTrace()方法用于打印异常的跟踪栈信息,根据printStackTrace()方法的输出结果,开发者可以找到异常的源头,并跟踪到异常一路触发的过程。观察如下例子程序public class PrintException {
public static void main(String[] args) {
first();
}
public static void first() {
second();
}
public static void second() {
third();
}
public static void third() {
//由于异常属于Runtime体系,不需要捕获,系统会隐式捕获执行printstackTrace()方法
throw new MyException("自定义错误信息");
}
}
class MyException extends RuntimeException{
private static final long serialVersionUID = 1L;
MyException(){}
MyException(String msg){
super(msg);
}
}
输出结果如图