一.异常分支

中图可看到,所有异常都继承Throwable,下层有两个大分支。
1.Error 错误类:是指java运行时产生的系统内部错误和资源耗尽的错误,这样的错误是无法修改的,只能终止程序。
2.Exception 异常类:它表示程序本身可以处理控制的异常,在java开发中进行的异常处理,主要针对Exception和它的子类。在Exception子类中有一个特殊类RuntimeException,它表示程序运行时错误,其他子类都是编译时异常。
在RuntimeException中常见异常有:NullPointerException(空指针),ArrayIndexOutOfBoundsException(数组越界),ClassCastException(类型转换错误)
二.异常捕获
在程序中发生了异常,为了可以让程序继续执行,java提供了异常捕获。
try {
//执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容
} catch (Exception e){
//除非try里面执行代码发生了异常,否则这里的代码不会执行
} finally {
//不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally
}
案例:
public class Test {
public static void main(String[] args) {
int i = 0;
String[] str = {"a","b"};
try {
System.out.println("----程序开始----");
i++;
System.out.println(str[2]); //数组越界,抛出异常
}catch (Exception e) { //捕获异常
//打印异常信息
e.printStackTrace();
i++;
//开启return,则当finally代码块执行完毕,才会调用,面试常见题
//return;
} finally {
//无论是否发生异常,或者return都会执行
System.out.println("i = "+i);
}
System.out.println("----程序继续走----");
}
}
执行结果:
----程序开始----
java.lang.ArrayIndexOutOfBoundsException: 2 at cs.test.Test.main(Test.java:12)
i = 2
----程序继续走----
三.抛出异常
抛出异常分为throws(方法抛出)和throw(行内抛出)
1.throws抛出异常,在方法头部添加
案例
public class Test {
public static void main(String[] args) {
//调用方法如果抛出异常,在调用时要么捕获异常,要么继续抛出异常
try {
divide(1,0);
} catch (Exception e) {
e.printStackTrace();
}
}
public static int divide(int a, int b) throws ArithmeticException {
//因为除数可能存在为0,所有在方法头抛出一个算术异常
return a/b;
}
}
运行结果:
java.lang.ArithmeticException: / by zero at cs.test.Test.divide(Test.java:15) at cs.test.Test.main(Test.java:7)
2.throw抛出异常,在行内添加
public class Test {
public static void main(String[] args) {
//调用方法如果抛出异常,在调用时要么捕获异常,要么继续抛出异常
try {
int a = 2;
int b = 0;
if(b == 0) {
throw new DivideException("除数不能为0");//行内抛出异常
}
System.out.println(a/b);
} catch (Exception e) {
e.printStackTrace();
}
}
}
//自定一异常类,在系统异常不够使用时可以自定义异常,继承Exception就行
class DivideException extends Exception {
public DivideException() { //定义一个无参构造函数
super();
}
public DivideException(String message) {//定义一个有参构造函数
super(message);
}
}
运行结果
cs.test.DivideException: 除数不能为0 at cs.test.Test.main(Test.java:10)
转载: