Throwable体系:
-
Error:严重错误Error,无法通过处理的错误,只能事先避免。
-
Exception:表示异常,异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须要处理的。
Throwable中的常用方法:
-
包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace。
-
public String getMessage()
:获取发生异常的原因。提示给用户的时候,就提示错误原因。
-
public String toString()
:获取异常的类型和异常描述信息(不用)。
-
-
运行时期异常:runtime异常。在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错)。(如数学异常)
总结:如果抛出异常,异常则由调用者处理,如果调用者也不处理,最终由JVM处理(并中断程序的执行)
在java中,提供了一个throw关键字,它用来抛出一个指定的异常对象。那么,抛出一个异常具体如何操作呢?
-
创建一个异常对象。封装一些提示信息(信息可以自己编写)。
-
需要将这个异常对象告知给调用者。怎么告知呢?怎么将这个异常对象传递到调用者处呢?通过关键字throw就可以完成。throw 异常对象。
throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行。
使用格式:throw new 异常类名(参数);
throw new ArrayIndexOutOfBoundsException("数组下标越界了~~~");
声明异常:将问题标识出来,报告给调用者。如果方法内通过throw抛出了编译时异常,而没有捕获处理(稍后讲解该方式),那么必须通过throws进行声明,让调用者去处理。
声明异常格式:修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2…{ }
public static void main(String[] args) throws IOException {}
如果异常出现的话,会立刻终止程序,所以我们得处理异常:
-
该方法不处理,而是声明抛出,由该方法的调用者来处理(throws)。
-
在方法中使用try-catch的语句块来处理异常。
try-catch的方式就是捕获异常。
-
捕获异常:Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理。
捕获异常语法如下:
try{ 编写可能会出现异常的代码 }catch(异常类型 e){ 处理异常的代码 //记录日志/打印异常信息/继续抛出异常 }finally{
}
总结:
try{}中是可能出现异常的代码
当代码出现异常后会执行catch{}中的代码
finally{}无论代码是否出现异常都会执行。finally中一般用与关闭资源。注意finally中国有return语句就永远会返回finally中的结果,要避免在finally中写return
1.多个异常分别处理。
try {
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
} catch (IndexOutOfBoundsException e) {
}
......
2.多个异常一次捕获,多次处理。处理的异常必须是从上往下异常范围递增
try {
} catch (ArrayIndexOutOfBoundsException e) {
} catch (IndexOutOfBoundsException e) {
}
3.多个异常一次捕获一次处理。
try {
} catch (Exception e) {
}
注意:
-
-
如果finally有return语句,永远返回finally中的结果,避免该情况.
-
如果父类抛出了多个异常,子类重写父类方法时,抛出和父类相同的异常或者是父类异常的子类或者不抛出异常。
-
父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出
异常类如何定义:
-
自定义一个编译期异常: 自定义类 并继承于
java.lang.Exception
。 -
自定义一个运行时期的异常类:自定义类 并继承于
java.lang.RuntimeException
。
java中的异常类:模拟该异常定义即可
查看源码发现,所有的异常都会有一个异常信息的构造方法,
方法内部会调用父类带异常的构造方法,让父类来处理这个异常信息
自定义异常需要继承Exception或者继承RuntimeException
继承了Exception,出现了异常就必须去处理。抛出或者捕获
继承了RuntimeException,运行时异常被抛出可以不处理。即不捕获也不声明抛出。
/**
* 自定义异常类
* 格式:public class ***Exception extends Excetption
*/
public class MyExctption extends RuntimeException /*Exception*/{
public MyExctption () {
super();
}
/*
* 查看源码发现,所有的异常都会有一个异常信息的构造方法,
* 方法内部会调用父类带异常的构造方法,让父类来处理这个异常信息
*/
public MyExctption (String message) {
super(message);
}
}
使用自定义异常
public static void main(String[] args) {
String name="zhangsan";
if (name.equals("zhangsan")) {
throw new MyExctption ("用户名已经被注册");
}else {
System.out.println("注册成功");
}
}