IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 【Java系列】:异常-Exception -> 正文阅读

[游戏开发]【Java系列】:异常-Exception

??1 问题引入

运行下面的代码,看看有什么问题?

public static void main(String[] args) {
	int num1 = 10;
	int num2 = 0;
	int res = num1 / num2;
	System.out.println("程序继续运行....");
}

💻运行结果:

Exception in thread "main" java.lang.ArithmeticException: / by zero
	at com.hj.第十二章异常.a.main(a.java:21)

🧐解读:

  1. num1 / num2 => 10 / 0
  2. 当执行到 num1 / num2 因为 num2 = 0, 程序就会出现(抛出)异常 ArithmeticException
  3. 当抛出异常后,程序就退出,崩溃了 , 下面的代码就不在执行
  4. 大家想想这样的程序好吗? 不好,因为出现了一个不算致命的问题,就导致整个系统崩溃

??2 解决方案-异常捕获

java 设计者,提供了一个叫 异常处理机制来解决该问题,如果程序员,认为一段代码可能出现异常/问题,可以使用try-catch异常处理机制来解决从而保证程序的健壮性,将该代码块->选中->快捷键 ctrl + alt + t -> 选中 try-catch

public class a {
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 0;
        try {
            int res = num1 / num2;
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("程序继续运行....");
    }
}

💡如果进行异常处理,那么即使出现了异常,程序可以继续执行
💻运行结果:

java.lang.ArithmeticException: / by zero
	at com.hj.第十二章异常.a.main(a.java:22)
程序继续运行....

可以看到运行结果中不仅提示了我们异常,还让程序(输出语句)继续执行下去。

如果想要知道异常的信息,可以使用下面代码:

try {
    int res = num1 / num2;
} catch (Exception e) {
    //e.printStackTrace();
    System.out.println("出现异常的原因:" + e.getMessage());//输出异常信息
}

??3 异常介绍

? 基本概念:
Java语言中,将程序执行中发生的不正常情况称为“异常”。(开发过程中的语法错误和逻辑错误不是异常)

执行过程中所发生的异常事件可分为两大类:

  1. Error(错误):Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如:StackOverflowError[栈溢出]和OOM(out of memory). Error是严重错误,程序会崩溃。
    2)Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如空指针访问,试图读取不存在的文件,网络连接中断等等,Exception 分为两大类:运行时异常[程序运行时,发生的异常]和编译时异常[编程时,编译器检查出的异常]。

??4 异常体系图

在这里插入图片描述
🧐异常体系图的小结

  1. 异常分为两大类,运行时异常和编译时异常.
  2. 运行时异常,编译器检查不出来。一般是指编程时的逻辑错误,是程序员应该避免其出现的异常。java.lang.RuntimeException类及它的子类都是运行时异常
  3. 对于运行时异常,可以不作处理,因为这类异常很普遍,若全处理可能会对程序的可读性和运行效率产生影响
  4. 编译时异常,是编译器要求必须处置的异常。

??5 常见的运行时异常

🚀5.1 常见的运行时异常包括

  1. NullPointerException 空指针异常
  2. ArithmeticException 数学运算异常
  3. ArrayIndexOutOfBoundsException 数组下标越界异常
  4. ClassCastException 类型转换异常
  5. NumberFormatException 数字格式不正确异常

🚀5.2 常见的运行时异常举例

① NullPointerException 空指针异常
在这里插入图片描述
当应用程序试图在需要对象的地方使用 null 时,抛出该异常,看案例演示。

public class NullPointerException_ {
    public static void main(String[] args) {
        String name = null;
        System.out.println(name.length());
    }
}

💻运行结果:

Exception in thread "main" java.lang.NullPointerException
	at com.hj.第十二章异常.运行时异常.NullPointerException_.main(NullPointerException_.java:9)

② ArithmeticException 数学运算异常
在这里插入图片描述
当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例,案例如问题引出代码。

③ ArrayIndexOutOfBoundsException 数组下标越界异常
在这里插入图片描述
用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。

public class ArrayIndexOutOfBoundsException_ {
    public static void main(String[] args) {
        int[] arr = {1,2,4};
        for (int i = 0; i <= arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

💻运行结果:

1
2
4
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
	at com.hj.第十二章异常.运行时异常.ArrayIndexOutOfBoundsException_.main(ArrayIndexOutOfBoundsException_.java:10)

④ ClassCastException 类型转换异常
在这里插入图片描述
当试图将对象强制转换为不是实例的子类时,抛出该异常。例如,以下代码将生成一个 ClassCastException

public class ClassCastException_ {
    public static void main(String[] args) {
        A b = new B(); //向上转型
        B b2 = (B)b;//向下转型,这里是 OK
        C c2 = (C)b;//这里抛出 ClassCastException
    }
}
class A {}
class B extends A {}
class C extends A {}
Exception in thread "main" java.lang.ClassCastException: com.hj.第十二章异常.运行时异常.B cannot be cast to com.hj.第十二章异常.运行时异常.C
	at com.hj.第十二章异常.运行时异常.ClassCastException_.main(ClassCastException_.java:10)

⑤NumberFormatException 数字格式不正确异常
在这里插入图片描述

当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常 => 使用异常我们可以确保输入是满足条件数字.

public class NumberFormatException_ {
    public static void main(String[] args) {
        String name = "hujian";
        //将 String 转成 int
        int num = Integer.parseInt(name);//抛出 NumberFormatException
        System.out.println(num);//1234
    }
}

💻运行结果:

Exception in thread "main" java.lang.NumberFormatException: For input string: "hujian"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:580)
	at java.lang.Integer.parseInt(Integer.java:615)
	at com.hj.第十二章异常.运行时异常.NumberFormatException_.main(NumberFormatException_.java:10)

??6 编译异常

🚀6.1介绍

编译异常是指在编译期间,就必须处理的异常,否则代码不能通过编译。

🚀6.2 常见的编译异常

在这里插入图片描述

🚀6.3 案例说明

因为我们还没有学习SQL,文件编程等等,这里我们先举一个(FileNotFoundException)案例来说明,其它异常使用方式类似。

import java.io.FileInputStream;
import java.io.IOException;

/**
 * @author Baridhu
 */
public class Exception02 {
    public static void main(String[] args) {
        try {
            FileInputStream fis;
            fis = new FileInputStream("d:\\aa.jpg");
            int len;
            while ((len = fis.read()) != -1) {
                System.out.println(len);
            }
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

??8 异常处理

🚀8.1 基本介绍:

异常处理就是当异常发生时,对异常处理的方式。

🚀8.2 异常处理的方式

try-catch-finally
程序员在代码中捕获发生的异常,自行处理

throws
将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是JVM

🚀8.3 示意图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

??9 try-catch 异常处理

🚀9.1 try-catch 方式处理异常说明

① Java提供trycatch块来处理异常。try块用于包含可能出错的代码。catch块用于处理try块中发生的异常。可以根据需要在程序中有多个try...catch块。

② 基本语法

try {
	//可疑代码
	//将异常生成对应的异常对象,传递给catch块
}catch(异常){
	//对异常的处理
}
//如果没有finally,语法是可以通过
public static void main(String[] args) {
        int num1 = 10;
        int num2 = 0;
        try {
            int res = num1 / num2;
        } catch (Exception e) {
            //e.printStackTrace();
            System.out.println("出现异常的原因:" + e.getMessage());//输出异常信息
        }
        System.out.println("程序继续运行....");
    }

🚀9.2 try-catch 方式处理异常-注意事项

注意事项一:如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch块.

public class TryCatchDetail {
    public static void main(String[] args) {
        //ctrl + atl + t
        //解读
        //1. 如果异常发生了,则异常发生后面的代码不会执行,直接进入到 catch 块
        try {
            String str = "Baridhu";
            int a = Integer.parseInt(str);
            System.out.println("数字:" + a);
        } catch (NumberFormatException e) {
            System.out.println("异常信息=" + e.getMessage());
        }
        System.out.println("程序继续...");
    }
}

💻运行结果:

异常信息=For input string: "Baridhu"
程序继续...

注意事项二: 如果异常没有发生,则顺序执行try的代码块,不会进入到catch.

public class TryCatchDetail {
    public static void main(String[] args) {
        //ctrl + atl + t
        //解读
        //1. 如果异常发生了,则异常发生后面的代码不会执行,直接进入到 catch 块
        //2. 如果异常没有发生,则顺序执行 try 的代码块,不会进入到 catch
        try {
            String str = "123";
            int a = Integer.parseInt(str);
            System.out.println("数字:" + a);
        } catch (NumberFormatException e) {
            System.out.println("异常信息=" + e.getMessage());
        } finally {

        }
        System.out.println("程序继续...");
    }
}

💻运行结果:

数字:123
程序继续...

注意事项三:如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)则使用如下代码- finally

public class TryCatchDetail {
    public static void main(String[] args) {
        //ctrl + atl + t
        //解读
        //1. 如果异常发生了,则异常发生后面的代码不会执行,直接进入到 catch 块
        //2. 如果异常没有发生,则顺序执行 try 的代码块,不会进入到 catch
        //3. 如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)则使用如下代码- finally
        try {
            String str = "Baridhu";
            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("程序继续...");
    }
}

💻运行结果:

异常信息=For input string: "Baridhu"
finally 代码块被执行...
程序继续...

注意事项四:可以有多个catch语句,捕获不同的异常(进行不同的业务处理),要求父类异常在后,子类异常在前,比如(Exception在后,NullPointerException在前),如果发生异常,只会匹配一个catch,案例演示。

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 {
        }
    }
}
class Person {
    private String name = "jack";
    public String getName() {
        return name;
    }
}

💻运行结果:

空指针异常=null
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 {
        }
    }
}
class Person {
    private String name = "jack";
    public String getName() {
        return name;
    }
}

💻运行结果:

jack
算术异常=/ by zero

注意事项五可以进行try-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("程序继续执行..");
    }
}

💻运行结果:

执行了 finally..
Exception in thread "main" java.lang.ArithmeticException: / by zero
	at com.hj.第十二章异常.trycatch.TryCatchDetail03.main(TryCatchDetail03.java:16)

🚀9.3 异常处理课堂练习

T1:下面代码的输出是多少?

public class Exception01 {
    public static int method() {
        try {
            String[] names = new String[3];//String数组
            if (names[1].equals("tom")) {
                System.out.println(names[1]);
            } else {
                names[3] = "hspedu";
            }
            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());
    }
}

🧐答案:4

🧐分析:
因为String[] names = new String[3];后,数组都是null,而names[1].equals("tom")会触发NullPointerException,然后会进入catch语句中,我们看到catch (NullPointerException e) { return 3;},有些同学就会觉得输出就是3了,这是错误的,因为finally语句是一定会执行的,所以会去执行finally的语句,从而输出4

T2:
在这里插入图片描述
T3:

public class Exception02 {
    public static int method() {
        int i=1;
        try {
            i++;
            String[] names = new String[3];//String数组
            if (names[1].equals("tom")) {//NullPointerException
                System.out.println(names[1]);
            } else {
                names[3] = "hspedu";
            }
            return 1;
        } catch (ArrayIndexOutOfBoundsException e) {
            return 2;
        } catch (NullPointerException e) {
            return ++i;//i=3 => 保存临时变量 temp=3
        } finally {//必须执行
            i++;
            System.out.println("i=" + i);//i=4
        }
    }

    public static void main(String[] args) {
        System.out.println(method());
    }
}

💻运行结果:

i=4
3

🧐分析:
先执行method语句,所以会执行finally语句输出:4,method会返回一个3。

🚀9.5 try-catch-finally 执行顺序小结

①如果没有出现异常,则执行try块中所有语句,不执行catch块中语句,如果有finally,最后还需要执行finally里面的语句

②如果出现异常,则try块中异常发生后,try块剩下的语句不再执行。将执行catch块中的语句,如果有finally,最后还需要执行finally里面的语句!

🚀9.6 课后练习题

T:如果用户输入的不是一个整数,就提示他反复输入,直到输入一个整数为止

public class TryCatchExercise {
    public static void main(String[] args) {
        //如果用户输入的不是一个整数,就提示他反复输入,直到输入一个整数为止
        //思路
        //1. 创建 Scanner 对象
        //2. 使用无限循环,去接收一个输入
        //3. 然后将该输入的值,转成一个 int
        //4. 如果在转换时,抛出异常,说明输入的内容不是一个可以转成 int 的内容
        //5. 如果没有抛出异常,则 break 该循环
        Scanner sc=new Scanner(System.in);
        int num=0;
        String intputStr="";
        while(true){
            System.out.println("请输入一个整数:");
            intputStr=sc.next();
            try {
                num=Integer.parseInt(intputStr);//这里可能抛出异常
                break;
            } catch (NumberFormatException e) {
                System.out.println("你输入的不是一个整数!");
            }
        }
        System.out.println("你输入的值为:" + num);
    }
}

💻运行结果:

请输入一个整数:
a
你输入的不是一个整数!
请输入一个整数:
1
你输入的值为:1

??10 throws 异常处理

🚀10.1 throws 异常处理

?声明抛出异常是Java中处理异常的第二种方式

① 如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理

import java.io.FileInputStream;
import java.io.FileNotFoundException;

/**
 * @author Baridhu
 */
public class Throws01 {
    public static void main(String[] args) {

    }

    public void f2() throws FileNotFoundException {
        //创建一个文件流对象
        //解读:
        //1. 这里的异常是一个FileNotFoundException
        //2. 使用throws,抛出异常,让调用f2方法的调用者(方法)处理
        FileInputStream fis = new FileInputStream("d://aa.txt");
    }
}

② 在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可
以是方法中产生的异常类型,也可以是它的父类

1.在方法声明中用throws语句可以声明抛出异常的列表

import java.io.FileInputStream;
import java.io.FileNotFoundException;

/**
 * @author Baridhu
 */
public class Throws01 {
    public static void main(String[] args) {

    }

    public void f2() throws FileNotFoundException,NullPointerException{
        //创建一个文件流对象
        //解读:
        //1. 这里的异常是一个FileNotFoundException
        //2. 使用throws,抛出异常,让调用f2方法的调用者(方法)处理
        //3. 在方法声明中用throws语句可以声明抛出异常的列表
        FileInputStream fis = new FileInputStream("d://aa.txt");
    }
}

2.throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类

import java.io.FileInputStream;

/**
 * @author Baridhu
 */
public class Throws01 {
    public static void main(String[] args) {

    }

    public void f2() throws Exception {
        //创建一个文件流对象
        //解读:
        //1. 这里的异常是一个FileNotFoundException
        //2. 使用throws,抛出异常,让调用f2方法的调用者(方法)处理
        //3. throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类
        FileInputStream fis = new FileInputStream("d://aa.txt");
    }
}

🚀10.2 注意事项和使用细节

①对于编译异常,程序中必须处理,比如 try-catch或者throws

import java.io.FileInputStream;

/**
 * @author Baridhu
 */
public class Throws01 {
    public static void main(String[] args) {

    }

    public void f2() {
        FileInputStream fis = new FileInputStream("d://aa.txt");
    }
}

在这里插入图片描述

解决方案就是try-catch或者throws,参考前面案例。

②对于运行时异常,程序中如果没有处理,默认就是throws的方式处理[举例]

public class ThrowsDetail {
    public static void main(String[] args) {
        f2();
    }

    public static void f2() /*throws ArithmeticException*/ {
        //对于运行时异常,程序中如果没有处理,默认就是 throws 的方式处理
        int n1 = 10;
        int n2 = 0;
        double res = n1 / n2;
    }
}

💻运行结果:

Exception in thread "main" java.lang.ArithmeticException: / by zero
	at com.hj.第十二章异常.抛出异常throws.注意事项.ThrowsDetail.f2(ThrowsDetail.java:18)
	at com.hj.第十二章异常.抛出异常throws.注意事项.ThrowsDetail.main(ThrowsDetail.java:10)

③子类重写父类的方法时,对抛出异常的规定:子类重写的方法,所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常的类型的子类型

class Father { //父类
    public void method() throws RuntimeException {
    }
}
class Son extends Father {//子类
    //3. 子类重写父类的方法时,对抛出异常的规定:子类重写的方法,
    //所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常类型的子类型
    @Override
    public void method() throws ArithmeticException {
    }
}

④在throws过程中,如果有方法 try-catch,就相当于处理异常,就可以不必throws

🧐补充:
看下面代码:

public static void f1() {
            f3(); 
}
public static void f3() throws FileNotFoundException {
    FileInputStream fis = new FileInputStream("d://aa.txt");
}

在这里插入图片描述

这里f3会报错,大家想一想这是为什么?

因为 f3() 方法抛出的是一个编译异常,即这时,就要 f1() 必须处理这个编译异常,在 f1() 中,要么 try-catch-finally ,或者继续 throws 这个编译异常

再来看看下面代码:

public static void f4() {
      f5();
}
public static void f5() throws ArithmeticException {
}

在这里插入图片描述
f5()不会报错,大家想想这又是为什么?
🧐分析:

在 f4()中调用方法 f5() 是 OK, 原因是 f5() 抛出的是运行异常 ,而 java 中并不要求程序员显示处理,因为有默认处理机制。

??11自定义异常

🚀11.1 基本概念

当程序中出现了某些“错误”,但该错误信息并没有在Throwable子类中描述处理,这个时候可以自己设计异常类,用于描述该错误信息。

Throwable子类
在这里插入图片描述

🚀11.2 自定义异常的步骤

  1. 定义类:自定义异常类名(程序员自己写)继承Exception或RuntimeException
  2. 如果继承Exception,属于编译异常
  3. 如果继承RuntimeException,属于运行异常(一般来说,继承RuntimeException)

🚀11.3 自定义异常的应用实例

当我们接收Person对象年龄时,要求范围在18-120之间,否则抛出一个自定义异常(要求继承RuntimeException),并给出提示信息。

public class CustomException {
    public static void main(String[] args) {
        int age = 180;
        //要求范围在18~120之间,否则抛出一个异常
        if(!(age >= 18 && age <= 120)) {
       		 //这里我们可以通过构造器,设置信息
            throw new AgeException("年龄需要在 18~120之间");
        }
        System.out.println("你的年龄范围是正确的。");
    }
}
//自定义一个异常
class AgeException extends RuntimeException {
    public AgeException(String message){//构造器
        super(message);
    }
}

💻运行结果:

Exception in thread "main" java.lang.ArithmeticException: / by zero
	at com.hj.第十二章异常.抛出异常throws.注意事项.ThrowsDetail.f2(ThrowsDetail.java:18)
	at com.hj.第十二章异常.抛出异常throws.注意事项.ThrowsDetail.main(ThrowsDetail.java:10)

🧐说明:

class AgeException extends RuntimeException {
    public AgeException(String message){//构造器
        super(message);
    }
}

这里的super(message);调用了RuntimeException的构造器

    public RuntimeException(String message) {
        super(message);
    }

同理再向上调用Exception的构造器:

    public Exception(String message) {
        super(message);
    }

最后调用Throwable的构造器:

    public Throwable(String message) {
        fillInStackTrace();
        detailMessage = message;
    }

💡总结:

自定义一个异常一般情况下,我们自定义异常是继承RuntimeException,即把自定义异常做成运行时异常,好处是:我们可以使用默认的处理机制,即比较方便。

??12 throw 和 throws 的区别

在这里插入图片描述
在这里插入图片描述

我们给一个练习,通过练习加深印象

T:判断程序的输出结果

public class ReturnExceptionDemo {
    static void methodA() {
        try {
            System.out.println("进入方法A");
            throw new RuntimeException("制造异常");
        }finally {
            System.out.println("用A方法的finally");
        }
    }
    static void methodB() {
        try {
            System.out.println("进入方法B");
            return;
        } finally {
            System.out.println("调用B方法的finally");
        }
    }
    public static void main(String[] args) {
        try {
            methodA();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        methodB();
    }
}

💻输出结果:

进入方法A
用A方法的finally
制造异常
进入方法B
调用B方法的finally

🧐分析:
methodA();调用方法

static void methodA() {
        try {
            System.out.println("进入方法A");
            throw new RuntimeException("制造异常");
        }finally {
            System.out.println("用A方法的finally");
        }
    }

第一步methodA():进入try语句,首先是输出语句:System.out.println("进入方法A");
然后执行的并不是手动抛出异常:throw new RuntimeException("制造异常");,而是finally里面的语句:System.out.println("用A方法的finally");,因为如果我们先处理throw new RuntimeException("制造异常");的话,程序就会之间结束这个方法(参考try-catch 方式处理异常 注意事项五可以进行try-finally 配合使用,这种用法相当于没有捕获异常,因此程序会直接崩掉/退出),而finally语句必须要执行,所以会先执行System.out.println("用A方法的finally");再执行throw new RuntimeException("制造异常");,主方法的catch语句catch (Exception e) { System.out.println(e.getMessage()); }对其进行处理输出信息。

第二步methodB();:先执行:System.out.println("进入方法B");然后同理在返回之前一定要执行语句finally { System.out.println("用A方法的finally"); }

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-03-12 17:53:59  更:2022-03-12 17:54:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/23 6:03:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计