Java异常抛出和捕获
2020-09-17 本文已影响0人
丿星纟彖彳亍
Java中把非正常情况分为两种,异常(Exception)和错误(Error)。

- Error:一般是指与虚拟机相关的问题(虚拟机错误、线程死锁等),这种错误无法回复或不可能捕获
- Exception:强制性要求用户必须处理
- RuntimeException:非检查异常,是Exception的子类,由用户选择是否进行处理
- 自定义异常:继承自Exception类,可以使用父类的大量的方法,也可自己编写方法来处理特定的事件。
自定义异常示例:
class MyException extends Exception {
public MyException(String message) {
super(message);
}
}
public class DefinedException {
public static void main(String[] args) {
try {
throw new MyException("\n自定义异常类!");
} catch(MyException e) {
System.out.println(e);
}
}
}
1、 异常抛出
1.1 throws关键字
使用throws将异常进行抛出,throws声明的方法表示该方法不处理异常,而由系统自动将所捕获的异常信息抛给上级调用方法。抛出的异常由上级调用者处理,上级调用者可以进行处理或抛出异常,上级调用者可以抛出更广泛的异常。
如果main方法也不知道如何处理异常就也可以使用throws抛出异常,那么该异常就会交给JVM处理。JVM将打印异常的跟踪栈信息,并中止程序运行。
- 示例
public class throwsDemo {
public static void main(String[] args) {
int[] a = new int[5];
try {
setZero(a,10);
} catch(ArrayIndexOutOfBoundsException ex) {
System.out.println("数组越界错误!");
System.out.println("异常:"+ex);
}
System.out.println("main()方法结束。");
}
private static void setZero(int[] a,int index) throws ArrayIndexOutOfBoundsException {
a[index] = 0;
}
}
1.2 throw关键字
除了使用throws抛出异常外也可以使用throw自行抛出异常。throw语句可以单独使用, throw语句抛出的不是异常类,而是一个异常实例,而且每次只能抛出一个异常实例。
- 示例
public class ExceptionDemo {
public static void main(String[] args) {
int[] a = new int[5];
try {
setZero(a,10);
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("异常:"+e);
}
System.out.println("main()方法结束!");
}
public static void setZero(int[] a,int index) throws ArrayIndexOutOfBoundsException {
System.out.println("setZero方法开始:");
try {
a[index] = 0;
} catch(ArrayIndexOutOfBoundsException ex) {
throw ex;
} finally {
System.out.println("setZero方法结束。");
}
}
}
对应抛出的异常实例,既可以显式捕获该异常,也可完全不理会该异常,把该异常交给该方法调用者处理。
2、 异常捕获
而对于Exception我们乐意使用try...catch进行捕获。try...catch不允许存在单独的try或者catch块,可存在多个catch块。try块中存放业务功能代码,catch块中存放异常处理代码。对于捕获的异常一般可以使用printStackTrace()方法追踪输出至标准错误流。
try...catch后可以添加finally,使用finally可以保证系统退出,finally块中代码绝对执行,捕获异常需要先补货小异常,否则小异常将无法被捕获。
- 示例
public class DealException {
public static void main(String args[]) {
try { //要检查的程序语句
int a[] = new int[5];
a[10] = 7;//出现异常
} catch(ArrayIndexOutOfBoundsException ex) {//异常发生时的处理语句
System.out.println("超出数组范围!");
ex.printStackTrace();//显示异常的堆栈跟踪信息
} catch(ArithmeticException ex) {//在异常捕捉的过程中要进行两个判断,第一是try程序块是否有异常产生,第二是产生的异常是否和catch()括号内想要捕捉的异常相同。
//可以在一个try语句后跟上多个异常处理catch语句,来处理多种不同类型的异常。
System.out.println("算术运算异常");
ex.printStackTrace();
} finally{ //这个代码块一定会被执行
System.out.println("*****");
}
System.out.println("异常处理结束!");
}
}
参考文档: