java中异常的分类
异常时java中的一个类,所有的异常都有一个公共的父类Throwable,它有两个直接的子类,Error和Exception;
Error: 系统级异常,是java中无法处理的异常,比如栈溢出
Exception : 是程序员可以自己捕获处理的异常
Throwable的继承关系
按照处理方式不同,异常还可以分为:
**checked exception:语法要求必须要用try catch 语句或者throws语句处理的异常
**uncheck exception:语法不要求一定要用try catch语句或者throws语句处理的异常
Error和RuntimeException是unchecked exception的子类,我们一般使用RuntimeException
try …catch 语句
public static void main(String[] args) {
// >> TODO try 语句中如果发生了异常(Exception),那么程序会跳转到catch语句。
// >> TODO Java会将异常相关信息封装在一个异常类的实例中,ex是指向这个异常实例的引用
// >> TODO "处理"最简单的方法,就是调用printStackTrace将异常信息输出到控制台
// >> TODO catch语句执行完毕,程序会继续向下顺序执行
try {
int[] arr = new int[1];
arr[1] = 9;
} catch (Exception ex) {
int abc = 999;
ex.printStackTrace();
}
throws和throw关键字
1.抛出别人抛过来的异常
// >> TODO 可以使用throws关键字,抛出一个异常。
// >> TODO 抛出的异常类型,可以是实际异常的父类或者本身。
// >> TODO 可以抛出多种类型的异常,用逗号分开就可以。
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
Class clazz = Class.forName("abc");
clazz.getField("");
}
2.抛出自己创建的异常
public static void causeException() throws Exception {
// >> TODO 可以创建一个checked exception,然后用throw关键字扔出去
// >> TODO 这时候就需要方法也要有throws语句,同样的,throws语句的类型要能覆盖实际异常的类型
throw new Exception("");
}
抽象方法里的异常
public void danger() throws Exception {
// >> TODO 接口中声明了抛出异常,实现类中可以抛,也可以不抛。抛的话必须是接口声明的类或其子类
throw new Exception("");
}
@Override
public void safe() {
// >> TODO 接口中没有声明抛出异常,实现类中可以抛RuntimeException,也可以不抛。
// >> TODO 如果抛 checked exception,就会出错
// >> TODO 可以选择catch住 checked exception,然后将它封在RuntimeException里
java异常的传递
方法调用栈里,异常会沿着调用栈传递,如果中间被catch住,就会中断
自定义异常