携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第32天,点击查看活动详情
异常处理
基本介绍
异常处理就是,当异常发生时,对异常处理的方式!
异常处理方式
try-catch-finally程序员在代码中捕获发生的异常,自行处理throws将发生的异常交给调用者(方法)来处理,最顶级的处理者就是JVM
try-catch-finally处理方式介绍
//`try-catch-finally异常处理机制介绍
class Exception_1{
public static void exception_(){
//异常处理在方法中
try {//可能出现异常的代码用try包裹
String str = "try-catch-finally";
System.out.println("异常语句前面的代码会执行");
str = null; int len = str.length();//出现异常代码
//上方语句出现异常后,后面的语句将不会执行,直接到catch
System.out.println("异常的代码后面的代码不执行");
} catch (Exception e) {
//如果异常是catch里中的异常类型或者子类
//将会捕捉到异常对象e,我们可以通过异常对象得到异常信息...
System.out.println("catch捕捉到了异常!");
} finally {
//不管代码是否被捕捉到异常,finally语句都会被执行
// finally代码块中的语句一定会执行
}
System.out.println("程序继续...");
}
}
throws处理方式介绍
//throws机制处理异常方式
public class Test_3 {
//抛出异常通常定义在 方法头部()后面 throws + 异常类型
public static void main(String[] args) throws NumberFormatException{
f1();
}
public static void f1()throws NumberFormatException{
f2();//两种选择,处理或者抛出
}
public static void f2()throws NumberFormatException{
f3();//两种选择,处理或者抛出
}
public static void f3()throws NumberFormatException{
f4();//两种选择,处理或者抛出
}
public static void f4()throws NumberFormatException{
throw new NumberFormatException();
//出现异常,f4可选择try-catch-finally捕捉异常
// 或者throws抛出给调用者
}
}
JVM处理后,打印异常信息,退出程序
throws处理异常方式就是将异常抛出给调用者(方法),每个接收到异常的调用者(方法)都有两种处理异常的方式:1.向上抛给他的调用者 2.try-catch-finally捕获异常如果一直向上抛给调用者,如果最后的调用者main方法也继续抛出,那么最终会由JVM处理该异常,并输出异常信息,最后程序中断,退出程序。 还有我们的java程序如果我们程序员不处理异常,默认throws所以也就解释了为啥出现异常,程序便会中断,因为默认是throws机制处理异常,然后抛给JVM处理异常,打印异常信息,直接退出程序。
try-catch异常处理
我们刚刚介绍了try-catch处理异常的机制,我们现在来深入学习一下try-catch异常处理的一些细节!!
可以看到
java提供try和catch块来处理异常,try代码块中包含可能出错的代码,catch捕捉try块中出现的异常,如果捕捉到该异常,就在catch代码块中进行异常处理,打印异常等等,而try-cath-finally组合处理异常,finally代码块中不管是否捕捉到异常都将最后执行,并且一定会被执行!!也可以没有finally代码块,try-catch组合处理异常!
注意事项
我们通过下面的代码案例来学习一些try-catch异常处理的细节吧!
//案例一
public class TryCatchDetail {
public static void main(String[] args) {
//ctrl + atl + t 快捷键 try-catch-finally语句!
//1. 如果异常发生了,则异常发生后面的代码不会执行,直接进入到 catch 块
//2. 如果异常没有发生,则顺序执行 try 的代码块,不会进入到 catch
//3. 如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)则使用如下代码- finally
try {
String str = "bug郭";
int a = Integer.parseInt(str);
System.out.println("数字:" + a);
} catch (NumberFormatException e) {
System.out.println("异常信息=" + e.getMessage());
} finally {
System.out.println("finally 代码块被执行...");
}
System.out.println("程序继续...");
}
}
//案例二
class Person {
private String name = "jack";
public String getName() {
return name;
}
}
public class TryCatchDetail02 {
public static void main(String[] args) {
//1.如果 try 代码块有可能有多个异常
//2.可以使用多个 catch 分别捕获不同的异常,相应处理
//3.要求子类异常写在前面,父类异常写在后面
try {
Person person = new Person();
//person = null;
System.out.println(person.getName());//NullPointerException
int n1 = 10;
int n2 = 0;
int res = n1 / n2;//ArithmeticException
} catch (NullPointerException e) {
System.out.println("空指针异常=" + e.getMessage());
} catch (ArithmeticException e) {
System.out.println("算术异常=" + e.getMessage());
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
}
}
}
//案例三
public class TryCatchDetail03 {
public static void main(String[] args) {
/*
可以进行 try-finally 配合使用, 这种用法相当于没有捕获异常,
因此程序会直接崩掉/退出。应用场景,就是执行一段代码,不管是否发生异常,
都必须执行某个业务逻辑
*/
try{
int n1 = 10;
int n2 = 0;
System.out.println(n1 / n2);
}finally {
System.out.println("执行了 finally..");
}
System.out.println("程序继续执行..");
}
}
总结:
-
try-catch-finally异常处理可以有多种组合,try-catch(捕捉异常,不善后,程序继续运行,),try-finally(不捕捉异常,finally代码块一定会执行) -
可以有多个
catch语句,并且需要遵循异常子类在前原则,否者在前捕获到了异常,后面子类就会无法通过编译报错! -
如果有
fianlly代码块,那里面的语句一定为执行,不管是否捕捉了异常!!!
try-catch异常处理小测试
既然已经学到这里了,那我们来巩固测试一下!读代码写结果吧!
//测试一
public class Test_2 {
public static int method(){
try {
String[] names = new String[3];//String[]数组
if(names[1].equals("bug郭")){
System.out.println(names[1]);
}else {
names[3] = "java";
}
return 1;
}catch (ArrayIndexOutOfBoundsException e) {
return 2;
} catch (NullPointerException e) {
return 3;
} finally {
return 4;
}
}
public static void main(String[] args) {
System.out.println(method());//执行结果?
}
}
//测试一题解
public class Test_2 {
public static int method(){
try {
String[] names = new String[3];//String[]数组
if(names[1].equals("bug郭")){//null空指针异常names数组里的元素为null
System.out.println(names[1]);
}else {
names[3] = "java";
}
return 1;
}catch (ArrayIndexOutOfBoundsException e) {
return 2;
} catch (NullPointerException e) {
return 3;//捕捉到异常 先将3保存
} finally {
return 4; //一定要执行 所以最后return 4!!!
}
}
public static void main(String[] args) {
System.out.println(method());//执行结果:4
}
}
//测试二
public class Test_3 {
public static int method(){
int i =1;
try {
i++;
String[] names = new String[3];//String[]数组
if(names[1].equals("bug郭")){//空指针
System.out.println(names[1]);
}else {
names[3] = "java";
}
return 1;
}catch (ArrayIndexOutOfBoundsException e) {
return 2;
} catch (NullPointerException e) {
return ++i;
} finally {
return ++i;
}
}
public static void main(String[] args) {
System.out.println(method());//执行结果?
}
}
//测试二题解
public class Test_3 {
public static int method(){
int i =1;
try {
i++; //i=2!
String[] names = new String[3];//String[]数组
if(names[1].equals("bug郭")){//空指针异常直接执行catch语句!
System.out.println(names[1]);
}else {
names[3] = "java";
}
return 1;
}catch (ArrayIndexOutOfBoundsException e) {
return 2;
} catch (NullPointerException e) {
return ++i; //i = 3 并且保存了将要返回值为3
} finally {
return ++i; //i = 4 一定要执行,将 i = 4返回!
}
}
public static void main(String[] args) {
System.out.println(method());//执行结果:4!!!
}
}
//测试三
public class Test_4 {
public static int method(){
int i =1;
try {
i++;
String[] names = new String[3];
if(names[1].equals("bug郭")){
System.out.println(names[1]);
}else {
names[3] = "java";
}
return 1;
}catch (ArrayIndexOutOfBoundsException e) {
return 2;
} catch (NullPointerException e) {
return ++i;
} finally {
++i;
System.out.println("i="+i);
}
}
public static void main(String[] args) {
System.out.println(method());//执行结果?
}
}
//测试三题解
public class Test_4 {
public static int method(){
int i =1;
try {
i++;//i=2
String[] names = new String[3];
if(names[1].equals("bug郭")){//空指针异常
System.out.println(names[1]);
}else {
names[3] = "java";
}
return 1;
}catch (ArrayIndexOutOfBoundsException e) {
return 2;
} catch (NullPointerException e) {
return ++i; //i = 3 并且用临时变量保存了该返回值3!
} finally {
++i; // i = 4
System.out.println("i="+i); //打印 i= 4
}
} //最终函数返回:3
public static void main(String[] args) {
System.out.println(method());//执行结果:i= 4 3
}
}