目录
1.2 使用 try - catch 块和不使用 try - catch 块的区别
1.1 前言
try - catch 块是在异常机制中用来捕获异常的。为什么要捕获异常,原因很简单,当我们在做项目的时候,代码量很多甚至是非常庞大,使用 try - catch 块方便我们快速定位出现异常的代码,方便快速调试。曾经的我对它不以为然,后来就真香。
1.2 使用 try - catch 块和不使用 try - catch 块的区别
使用 try - catch 块的简单示例
public class Test1 {
public static void main(String args[]) {
try {
// 出现异常,不能除以 0
int data = 50 / 0;
}
catch (ArithmeticException e) {
// 打印异常
System.out.println(e);
}
System.out.println("看得到这段文字,说明异常外的代码可运行");
}
}
不使用 try - catch 块的简单示例
public class Test1 {
public static void main(String args[]) {
// 出现异常,不能除以 0
int data = 50 / 0;
System.out.println("看得到这段文字,说明异常外的代码可运行");
}
}
使用 try - catch 块示例的运行结果
运行结果:
java.lang.ArithmeticException: / by zero
看得到这段文字,说明异常外的代码可运行
不使用 try - catch 块的运行结果
运行结果:(报错)
Exception in thread "main" java.lang.ArithmeticException: / by zero
可以发现代码中使用了 try - catch 块,当块中出现异常时,不在块中的代码还是可以运行的。而不使用 try - catch 块,一旦出现异常,异常后的代码是不会执行的。这样的话,如果后面的代码一多就很难确定是哪出问题了。
1.3 try 块
- try 块用于封装可能引发异常的代码,也就是把可能会引发异常的代码放在 try 块中。它必须在方法内使用;
- 不要将不会引发异常的代码放在 try 块中;
- try 块之后必须是 catch 块或 finally 块;
- try 块之后有一个或多个 catch 块(多重 catch 块);
- try 块中也可以继续使用 try - catch 块(也就是嵌套 try - catch 块);
1.4 catch 块
- catch 块需要参数,参数用于声明异常类型来处理异常;
- catch 块参数常用异常类型有 ArithmeticException , ArrayIndexOutOfBoundsException,FileNotFoundException ,Exception,如果不清楚异常类型,可以只使用父类异常 Exception 作为参数,但效果会差一些;
1.5 多重 catch 块
public class Test1 {
public static void main(String args[]) {
try {
int a[] = new int[3];
// 这里的下标不能为 3,且不能除以 0
a[3] = 30 / 0;
}
catch (ArithmeticException e) {
System.out.println(e.toString());
}
catch (ArrayIndexOutOfBoundsException e) {
System.out.println(e.toString());
}
}
}
运行结果:
java.lang.ArithmeticException: / by zero
- 一个 try 块之后可以有多个 catch 块,可以在发生不同的异常时执行不同的任务时使用;
- 一次只发生一个异常,一次只执行一个catch块,所以运行结果只打印一个异常;
- 每个 catch 块中的参数必须从最特定到最通用进行排序,常用的几种类型的排序就是 ArithmeticException , ArrayIndexOutOfBoundsException,FileNotFoundException ,Exception 。所有异常类型中 Eception 的范围最大,一定放最后;
1.6 嵌套 try - catch 块
有时 try 块中的一部分可能出现一个异常,另一部分可能出现另一个异常,嵌套 try - catch 块就派用场;
public class Test1 {
public static void main(String args[]) {
try {
try {
// 不能除以 0
int a = 50 / 0;
}
catch (ArithmeticException e) {
System.out.println(e.toString());
}
try {
int b[] = new int[3];
// 下标不能 >= 3
b[3] = 3;
}
catch (ArrayIndexOutOfBoundsException e) {
System.out.println(e.toString());
}
}
catch (Exception e) {
System.out.println(e.toString());
}
}
}
运行结果:
java.lang.ArithmeticException: / by zero
java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
1.7 finally 块
- finally 块用于封装无论是否处理异常都会执行的代码;
public class Test1 {
public static void main(String args[]) {
// 统计异常数目
int count = 0;
try {
try {
// 不能除以 0
int a = 50 / 0;
}
catch (ArithmeticException e) {
System.out.println(e.toString());
count++;
}
try {
int b[] = new int[3];
// 下标不能 >= 3
b[3] = 3;
}
catch (ArrayIndexOutOfBoundsException e) {
System.out.println(e.toString());
count++;
}
}
catch (Exception e) {
System.out.println(e.toString());
count++;
}
finally {
System.out.println("运行结束,一共有" + count + "个异常");
}
}
}
运行结果:
java.lang.ArithmeticException: / by zero
java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
运行结束,一共有2个异常
- 但也有四种特殊情况,finally 块是不会执行的:在前面的代码中使用了System.exit()退出程序;在finally语句块中发生异常;程序所在线程死亡;CPU 关闭了;
1.8 总结