`

java 异常捕捉 ( try catch finally ) 你真的掌握了吗?

阅读更多
前言:
java 中的异常处理机制你真的理解了吗?掌握了吗?
catch 体里遇到 return 是怎么处理? finally 体遇到 return 怎么办?finally 体里有 System.exit() 方法怎么处理?当 catch 和 finally 体里同时遇上 return 怎么办?

相信你在处理异常的时候不是每次都把它 throws 掉就完事了,很多时候异常是需要我们自己来 catch 并针对所抛出的 Exception 做一些后续的处理工作。

直接上代码,先贴下面测试需要调用的方法:
1
2    // catch 后续处理工作
3    public static boolean catchMethod() {
4        System.out.print("call catchMethod and return  --->>  ");
5        return false;
6    }
7    // finally后续处理工作
8    public static void finallyMethod() {
9        System.out.println();
10        System.out.print("call finallyMethod and do something  --->>  ");
11    }
12


1. 抛出 Exception,没有 finally,当 catch 遇上 return
1
2public static boolean catchTest() {
3        try {
4            int i = 10 / 0;   // 抛出 Exception,后续处理被拒绝
5            System.out.println("i vaule is : " + i);
6            return true;    // Exception 已经抛出,没有获得被执行的机会
7        } catch (Exception e) {
8            System.out.println(" -- Exception --");
9            return catchMethod();    // Exception 抛出,获得了调用方法并返回方法值的机会
10        }
11    }
12

后台输出结果:
1
2 -- Exception --
3call catchMethod and return  --->>  false
4

2. 抛出 Exception,当 catch 体里有 return,finally 体的代码块将在 catch 执行 return 之前被执行
1
2public static boolean catchFinallyTest1() {
3        try {
4            int i = 10 / 0; // 抛出 Exception,后续处理被拒绝
5            System.out.println("i vaule is : " + i);
6            return true;   // Exception 已经抛出,没有获得被执行的机会
7        } catch (Exception e) {
8            System.out.println(" -- Exception --");
9            return catchMethod();  // Exception 抛出,获得了调用方法的机会,但方法值在 finally 执行完后才返回
10        }finally{
11            finallyMethod();  // Exception 抛出,finally 代码块将在 catch 执行 return 之前被执行
12        }
13    }
14

后台输出结果:
1
2 -- Exception --
3call catchMethod and return  --->> 
4call finallyMethod and do something  --->>  false
5

3. 不抛 Exception,当 finally 代码块里面遇上 return,finally 执行完后将结束整个方法
1
2public static boolean catchFinallyTest2() {
3        try {
4            int i = 10 / 2;  // 不抛出 Exception
5            System.out.println("i vaule is : " + i);
6            return true;   // 获得被执行的机会,但执行需要在 finally 执行完成之后才能被执行
7        } catch (Exception e) {
8            System.out.println(" -- Exception --");
9            return catchMethod();
10        }finally{
11            finallyMethod();
12            return false; // finally 中含有 return 语句,这个 return 将结束这个方法,不会在执行完之后再跳回 try 或 catch 继续执行,方法到此结束,返回 false
13        }
14    }
15

后台输出结果:
1
2i vaule is : 5
3
4call finallyMethod and do something  --->>  false
5

4. 不抛 Exception,当 finally 代码块里面遇上 System.exit() 方法 将结束和终止整个程序,而不只是方法
1
2public static boolean finallyExitTest() {
3        try {
4            int i = 10 / 2;  // 不抛出 Exception
5            System.out.println("i vaule is : " + i);
6            return true;   // 获得被执行的机会,但由于 finally 已经终止程序,返回值没有机会被返回
7        } catch (Exception e) {
8            System.out.println(" -- Exception --");
9            return true;
10        }finally {
11            finallyMethod();
12            System.exit(0);// finally 中含有 System.exit() 语句,System.exit() 将退出整个程序,程序将被终止
13        }
14    }
15

后台输出结果:
1
2i vaule is : 5
3
4call finallyMethod and do something  --->> 
5

5. 抛出 Exception,当 catch 和 finally 同时遇上 return,catch 的 return 返回值将不会被返回,finally 的 return 语句将结束整个方法并返回
1
2public static boolean finallyTest1() {
3        try {
4            int i = 10 / 0; // 抛出 Exception,后续处理被拒绝
5            System.out.println("i vaule is : " + i);
6            return true;   // Exception 已经抛出,没有获得被执行的机会
7        } catch (Exception e) {
8            System.out.println(" -- Exception --");
9            return true;  // Exception 已经抛出,获得被执行的机会,但返回操作将被 finally 截断
10        }finally {
11            finallyMethod();
12            return false;  // return 将结束整个方法,返回 false
13        }
14    }
15

后台输出结果:
1
2 -- Exception --
3
4call finallyMethod and do something  --->>  false
5

6. 不抛出 Exception,当 finally 遇上 return,try 的 return 返回值将不会被返回,finally 的 return 语句将结束整个方法并返回
1
2public static boolean finallyTest2() {
3        try {
4            int i = 10 / 2;  // 不抛出 Exception
5            System.out.println("i vaule is : " + i);
6            return true;   // 获得被执行的机会,但返回将被 finally 截断
7        } catch (Exception e) {
8            System.out.println(" -- Exception --");
9            return true;
10        }finally {
11            finallyMethod();
12            return false; // return 将结束这个方法,不会在执行完之后再跳回 try 或 catch 继续执行,返回 false
13        }
14    }
15

后台输出结果:
1
2i vaule is : 5
3
4call finallyMethod and do something  --->>  false
5

结语:
(假设方法需要返回值)
java 的异常处理中,
在不抛出异常的情况下,程序执行完 try 里面的代码块之后,该方法并不会立即结束,而是继续试图去寻找该方法有没有 finally 的代码块,
如果没有 finally 代码块,整个方法在执行完 try 代码块后返回相应的值来结束整个方法;
如果有 finally 代码块,此时程序执行到 try 代码块里的 return 语句之时并不会立即执行 return,而是先去执行 finally 代码块里的代码,
若 finally 代码块里没有 return 或没有能够终止程序的代码,程序将在执行完 finally 代码块代码之后再返回 try 代码块执行 return 语句来结束整个方法;
若 finally 代码块里有 return 或含有能够终止程序的代码,方法将在执行完 finally 之后被结束,不再跳回 try 代码块执行 return。
在抛出异常的情况下,原理也是和上面的一样的,你把上面说到的 try 换成 catch 去理解就 OK 了 *_*
分享到:
评论

相关推荐

    实验五 Java异常处理实验.docx

    本实验的目的是让学生熟悉 Java 异常处理的概念,掌握异常捕获和处理的方法,并能自定义异常。 实验内容 ### 一、了解什么是异常,异常的概念,如何产生异常 在 Java 中,异常是指程序执行过程中出现的非正常情况...

    java异常处理试题及答案.doc

    本文档提供了 Java 异常处理的基本概念、关键字、异常类继承关系、异常处理的出口、多重 catch 块、异常抛出和捕捉等知识点,并提供了 best practice 和常见问题的解答,旨在帮助读者更好地理解和掌握 Java 异常处理...

    Java-异常(习题).doc

    try 语句块用于尝试执行可能产生异常的代码,catch 语句块用于捕捉和处理异常,finally 语句块用于释放资源。 在上面的习题中,我们使用 try-catch-finally 语句处理 EOFException、IOException、SQLException 等...

    java基础第七章内部类与异常类.doc

    try-catch 语句可以捕捉和处理异常,而 throws 子句可以将异常抛出给上一级调用者。throw 语句可以抛出一个异常对象,从而中断程序的执行。 在 Java 中,异常类是通过继承 Exception 或 RuntimeException 类来实现...

    《Java程序设计案例教程》教学课件07异常处理.pptx

    03 掌握使用try-catch-finally语句块捕捉并处理异常。 05 掌握设计和使用用户自定义异常。 04 掌握使用throw语句抛出异常,以及使用throws语句声明方法异常。 《Java程序设计案例教程》教学课件07异常处理全文共31...

    java面向对象程序设计第08章异常处理.ppt

    可以使用多个 catch 块来捕捉不同的异常类型,每个 catch 块都可以捕捉一个特定的异常类型。 2.3 finally 语句 finally 语句用于执行异常处理结束前的执行程序体,finally 语句在所有 catch 块执行完毕后执行,...

    实习生java面试题集及详细答案.pdf

    Java中的try-catch语句是一种异常处理机制,用于捕捉和处理异常。try-catch语句的作用是可以捕捉异常,避免程序崩溃,并提供异常处理机制。 3. 什么是Java中的finally语句?finally语句的作用是什么? Java中的...

    软通动力Java笔试题.pdf

    try块中发生异常时,catch块将捕捉异常,finally块将始终执行。 Java程序设计 Java程序设计中,String对象是不可变对象,Char数组是可变对象。在Java中,方法参数传递是按值传递的,基本类型和对象引用的传递方式...

    【09-异常处理】

    •如果程序需要捕捉Runtime异常,也可以使用try...catch块来捕捉Runtime异常。 使用throws声明抛出异常 •throws声明抛出异常的思路是:当前方法不知道应该如何这种类型的异常,该异常应该由上一级调 ...

    Java第6章完整.pptx

    Java语言中的异常处理语句有try、catch、finally和throws。try语句中包含可能发生异常的语句,catch语句用来捕获异常,finally语句用来执行异常处理结束前的执行语句。throws语句用来声明方法可能抛出的异常。 7. ...

    Java常用英语单词.pdf

    * Catch:捕捉异常 * Finally block:finally块 八、多线程编程 * Thread:线程 * Process:进程 * Synchronization:同步 * Deadlock:死锁 * Starvation:饥饿 本文总结了Java常用英语单词,涵盖了Java基础概念...

    Java中高级核心知识全面解析.pdf

    * try-catch-finally 是捕捉异常的基本结构。 4.3 多线程 * 线程是程序执行的基本单位,可以实现高效的并发处理。 * 线程有五种基本状态:新建、运行、阻塞、等待、死亡。 4.4 文件与 I/O 流 * Java 中的 I/O 流...

    Java 训练营-new.ppt

    try-catch 语句用于捕捉异常,throw 语句用于抛出异常,finally 语句用于执行清理工作。 IO 流 IO 流是 Java 中用于输入和输出数据的机制,包括文件流、网络流、字符流等。文件流用于读写文件,网络流用于读写网络...

    Java基础核心总结.pdf

    try...catch语句可以用来捕捉和处理异常,finally语句可以用来释放资源。throw语句可以用来抛出异常,throws语句可以用来声明方法可能抛出的异常。 4. Java集合框架:包括ArrayList、LinkedList、Vector、HashSet、...

    java 面试题 总结

    java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 6、说出Servlet的生命周期,并说出Servlet和CGI的区别。 Servlet被服务器实例化后,容器运行其init方法,...

    某国有企业工程师笔试.docx

    * try-catch-finally语句是JAVA中的异常处理语句,try语句块中可能抛出异常,catch语句块中捕捉异常,finally语句块中执行清理工作。 四、流 * JAVA中的流可以分为输入流和输出流两种,输入流用于读取数据,输出流...

    JAVA面向对象程序设计(期末考试试题及答案).pdf

    JAVA提供了try-catch-finally语句,用于捕捉和处理异常。 五、JAVA集合框架 JAVA集合框架是JAVA标准库的一部分,提供了一系列集合类,用于存储和管理大量数据。 5.1 集合框架概述 JAVA集合框架提供了一系列接口...

    2023年Java编程基础知识点汇总及习题集答案.docx

    异常知识点汇总包括 try 语句、catch 语句、finally 语句、throw 语句等知识点。 1. try 语句 try 语句用于捕捉异常,避免程序的崩溃。 2. catch 语句 catch 语句用于捕捉异常,并执行相应的处理。 3. finally ...

    java jdk实列宝典 光盘源代码

    throw和throws、try和catch;自定义异常类;使用finally;使用异常的技巧和原则; 7 IO输入输出流 获取文件的基本信息;列出指定目录下的文件,并可过滤文件;创建文件和目录;删除文件和目录;移动文件和目录; 复制...

    day26作业1

    3. 异常处理:Java语言提供了多种异常处理机制,例如使用try-catch语句捕捉异常,使用finally语句释放资源。 day26作业1涵盖了Java语言的基础知识、控制结构、函数、面向对象编程和异常处理等多个方面,旨在帮助...

Global site tag (gtag.js) - Google Analytics