`
liss
  • 浏览: 842404 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

try-catch-finally的用法之finally

阅读更多

关于try-catch-finally的用法我就不多说了。网上搜一下,资料很多。

这里我想主要讨论下在finally块加入return语句,屏蔽异常的问题。

我们先来看这样一段代码,

 


代码1:

view plaincopy to clipboardprint?
public class FinallyTest {  
    public static void main(String[] args) {  
        new FinallyTest().print();  
    }  
    public void print() {  
        int i = -1;  
        try {  
            Thread.sleep(1);  
            i = 1 / 0;  
        } catch (Exception e) {  
            System.out.println("at catch block step 1.");  
            throw e;  
        } finally {  
            System.out.println("at finally block i = " + i);  
        }  
    }  

public class FinallyTest {
 public static void main(String[] args) {
  new FinallyTest().print();
 }
 public void print() {
  int i = -1;
  try {
   Thread.sleep(1);
   i = 1 / 0;
  } catch (Exception e) {
   System.out.println("at catch block step 1.");
   throw e;
  } finally {
   System.out.println("at finally block i = " + i);
  }
 }
}
 

 

以上代码在Eclipse里是不会编译通过的,因为在catch块中throw了一个异常,而print方法并没有声明要抛出异常。

 


现在我们修改代码,让它能够通过编译,代码2:

view plaincopy to clipboardprint?
public class FinallyTest {  
    public static void main(String[] args) throws Exception {  
        new FinallyTest().print();  
    }  
    public void print() throws Exception {  
… 
public class FinallyTest {
 public static void main(String[] args) throws Exception {
  new FinallyTest().print();
 }
 public void print() throws Exception {

 

就是在print和main方法后加throws Exception,然后运行,看运行结果:

view plaincopy to clipboardprint?
at catch block step 1.  
at finally block i = -1 
Exception in thread "main" java.lang.ArithmeticException: / by zero  
    at wxhx.csdn2.FinallyTest.print(FinallyTest.java:12)  
    at wxhx.csdn2.FinallyTest.main(FinallyTest.java:5) 
at catch block step 1.
at finally block i = -1
Exception in thread "main" java.lang.ArithmeticException: / by zero
 at wxhx.csdn2.FinallyTest.print(FinallyTest.java:12)
 at wxhx.csdn2.FinallyTest.main(FinallyTest.java:5)
 

 

程序先是走到了catch块的第一句,打印了at catch block step 1.

但并没有紧接着去throw e,即没有立刻抛出这个异常,之所以这样说,是因为异常的信息是在finally块的打印信息之后才打印的。

这个例子告诉我们,finally不管出现异常与否,都必须去执行的代码。(如果中途终止了jvm,就不必去执行了)

那么何时执行finally块中的代码呢?

在这个例子中,try块中有异常抛出,所以finally块中的代码是在执行了catch语句之后、退出方法之前被执行的 (如果这里执行了throw e,则方法就退出了) 。

 


 

下面再看另外一个代码,代码3:

view plaincopy to clipboardprint?
public class FinallyTest {  
    public static void main(String[] args) {  
        new FinallyTest().print();  
    }  
    public void print() {  
        int i = -1;  
        try {  
            Thread.sleep(1);  
            i = 1 / 0;  
        } catch (Exception e) {  
            System.out.println("at catch block step 1.");  
            throw e;  
        } finally {  
            System.out.println("at finally block i = " + i);  
            return;  
        }  
    }  

public class FinallyTest {
 public static void main(String[] args) {
  new FinallyTest().print();
 }
 public void print() {
  int i = -1;
  try {
   Thread.sleep(1);
   i = 1 / 0;
  } catch (Exception e) {
   System.out.println("at catch block step 1.");
   throw e;
  } finally {
   System.out.println("at finally block i = " + i);
   return;
  }
 }
}
 

 

这段代码与之前相比,在finally块中增加了return语句。

虽然在catch块中有throw e语句,但在print方法后并不用声明throws Exception,也可以通过编译。

因为在try块中有Thread.sleep(1);语句,所以必须要捕获InterruptedException,但在这种情况下,即使我们把catch块去掉了,也不会有问题,这是怎么回事呢?

因为在finally块中的return语句屏蔽了异常。

经过代码2我们已经知道了,异常在finally块被执行之前,虽然会执行catch块中的代码,但并不会退出方法,在退出方法之前,会转向finally块中执行,而在finally块中又恰好有return语句,所以方法就正常退出了,在try块中产生的异常就不会有机会被抛出。

 

 

总结:
1.执行retrun的话就会跳出函数返回了.
2.try-catch-finally的顺序是
没有异常的话,try一直执行至try中retrun前,就会去执行finally中的代码,如果finally中无retrun就会做try中的retrun,try中也没有retrun的话就会做try-catch-finally外的代码了.
如果在try中有异常的话,在异常处就会抛出,try中的就不再执行,去执行catch中的代码(前题是抛出的是catch中的异常,能被catch),catch中如果碰到retrun或到尽头,就会去执行finally中的代码,finally中的代码如有retrun就retrun,无就去catch中的retrun,如果catch都无retrun,就会执行try-catch-finally外的代码.
3.可见finally中的代码是一定会全执行的(retrun前)
4.retrun后的代码是无效的.


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/bzwm/archive/2009/02/13/3885720.aspx

分享到:
评论

相关推荐

    try-catch-finally捕获异常

    下面将详细介绍try-catch-finally语句的使用方法和注意事项。 一、try块 try块是try-catch-finally语句的核心部分,用于包装可能出现异常的代码。try块中的代码在执行时,如果出现异常,会被catch块捕获和处理。...

    使用try-catch-finally处理异常

    总的来说,正确地使用`try-catch-finally`可以帮助我们编写出更加健壮的代码,能够优雅地处理异常,保持程序的稳定运行,并提供有价值的错误反馈,从而提高用户体验。理解并熟练掌握异常处理是每个IT专业人士必备的...

    try-catch-finally-return-in-finally.rar_return

    在编程语言中,异常处理是确保程序稳定性和健壮性的重要...这些文件可能包含了具体的示例,演示了如何在不同情况下使用 `try-catch-finally` 结构以及 `return` 语句,从而帮助开发者更好地理解和掌握这一关键概念。

    try-catch的用法和含义

    ### try-catch 的用法与含义详解 在编程过程中,异常处理是确保程序稳定性和健壮性的关键环节之一。`try-catch` 结构作为异常处理的核心机制,在各种编程语言中广泛采用,如 Java、C# 和 JavaScript 等。本文将深入...

    try_catch_finally异常处理java

    在Java中,`try-catch-finally`结构可以单独使用,也可以嵌套使用。嵌套的`try-catch-finally`允许我们处理不同层次的异常,每个`try`块捕获不同类型的异常,`finally`块则确保所有必要的清理工作都能完成。 视频...

    try-catch用法

    ### try-catch 用法详解 #### 一、引言 ...理解并熟练掌握 `try-catch` 的使用方法对于每个开发者来说都是至关重要的。希望本文能够帮助读者更深入地了解 `try-catch` 机制,并在日常开发中灵活运用。

    异常+异常处理+try-catch-finally+教程

    异常+异常处理+try-catch-finally+教程 - 本资源是一个异常处理的教程,教你如何用Java的try-catch-finally语句处理异常,包括抛出和捕获异常,自定义异常,多个异常,finally块等。

    try-catch-finally.js:一个很小的库,用于在JavaScript中更灵活地捕获错误

    try-catch-finally.js 843字节库,可在JavaScript中更灵活地捕获错误。内容注意事项按名称捕获可能不起作用按类型捕获在跨框架/过程中不起作用错误被消耗测验 安装 浏览器< script src =" try-catch-finally.js ...

    try-catch-finally的说明和使用

    学习Java异常必要了解try_catch_finally的说明和使用讲解注意事项

    谈谈Java中try-catch-finally中的return语句

    在Java编程语言中,`try-catch-finally`语句块是异常处理的关键构造,它允许程序员优雅地处理可能出现的异常情况。`return`语句则用于从方法中返回一个值或者结束方法的执行。当这两者结合在一起时,就会出现一些...

    C#中Try-Catch语句真的影响程序性能吗?

    在编写代码时,应根据具体情况权衡是否使用Try-Catch,对于那些关键的、可能导致程序崩溃的代码,使用Try-Catch是非常必要的。而对于性能敏感的部分,可以通过适当的异常预防、减少不必要的Try-Catch块,或者利用try...

    java基础知识-try-catch的使用

    try块中包含可能会产生异常的代码,当try块内的代码发生异常时,程序...另外,finally块是可选的,它会在try-catch块执行完毕后始终被执行,无论是否发生异常。finally块通常用于释放资源、关闭文件等必要的清理工作。

    no-try:通过删除try-catch-finally块来清理代码! :rocket:

    :rocket: 不试 :rocket: 删除那些难看的try-catch-finally块,清理代码库! :smiling_face_with_heart-eyes: 关于在可能期望方法throw的代码库中工作可能会导致逻辑包裹在try-catch块中的情况。 它还导致其他代码...

    try 与 catch finally关键字

    Java的 try 与 catch finally关键字的使用

    java try…catch捕获异常的实例

    如果在`try`块中的任何代码抛出了一个异常,控制权将立即转移到与之匹配的`catch`块。例如,考虑以下代码片段: ```java try { int[] array = new int[5]; System.out.println(array[10]); // 这将抛出...

    try-catch-finally执行顺序验证

    try-catch-finally执行顺序验证(左边是.java文件,右边是.class文件) 提示: try、catch块内的return操作编译后会变成把return的值保存到变量var的操作。 总结: try、catch块内的return操作编译后会变成把return的值...

    java try…catch嵌套捕获异常的实例

    在这个结构中,`try`块包含可能会抛出异常的代码,每个`catch`块分别捕获不同类型的异常,`finally`块则包含需要无论发生何种情况都必须执行的代码,如资源清理。 接下来,我们来探讨嵌套的`try-catch`块。当一个`...

    375.373.JAVA基础教程_异常处理-处理异常:try-catch方式(375).rar

    如果try块中的代码抛出了一个异常,那么控制权将立即转移到与之关联的catch块。 2. **catch**:catch块用于捕获try块中抛出的异常。每个try可以有多个catch块,每个catch对应处理一种类型的异常。当try块中的异常被...

    17.javatry…catch…finally语句.zip

    17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句...

    java中try catch的用法

    ### Java中try-catch的用法详解 #### 一、基本概念 在Java编程语言中,`try-catch`结构是一种用于处理程序运行时可能出现的异常情况的重要机制。通过使用`try-catch`块,开发者可以更加精细地控制程序的行为,并...

Global site tag (gtag.js) - Google Analytics