如果我不考虑异常丢失的情况下
还有别的限制要求try后面一定要跟catch吗
请看下面两段代码 int i = 1;
            try
            {
                i = 2;
                return i;
            }
            
            finally
            {
                i = 3;
                System.out.println("finally block executed");
            }
//执行结果是
//finally block executed
//2
//间接证明了finally在return的前面执行
然而加上catch之后 int i = 1;
         try
         {
             i = 2;
             return i;
         }catch(Exception e){
          
         }finally
         {
             i = 3;
             System.out.println("finally block executed");
             return i;
         }
//不但编译通不过了而且结果完全不同
//结果是
//finally block executed
//3
//这样的话finally是在return后面执行
两段程序的执行结果完全不一样
就因为多了个catch
请教各位大牛可否给予一个比较详细的解释  感激不尽

解决方案 »

  1.   

    应该是你finally多了个 return
      

  2.   

    两段程序的执行结果完全不一样
    就因为多了个catch
    其实不是这样吧lz可以把第二段代码的finally中的return语句放到catch语句中这样结果就一样了。
      

  3.   

    首先try一定要有个catch。只有try里面有异常 catch才会执行,你看看。
    finally的意思是,不管你try里面有没有异常,finally里的语句都会执行。
      

  4.   

    1 finally肯定在try return和catch return之前执行,这不会有问题的。
    2 finally中如果有return就会将try return和catch return作废掉(不给它们执行的机会)
      

  5.   

    finally 不管怎么样多会执行的
      

  6.   

    我请教一下    java编程思想是从底层慢慢 的到高吗??
      它们之间是不是存在联系    就是不可以脱节呢?
      

  7.   

    没有限制必须在try后面加catch,完全可以把一般捕捉异常的代码分离成
    try {    try {
            ............
       }
        catch(){
       }
    }finally{
    }返回值的改变并不是因为catch的原因,而是当finally中有return语句的时候,try中的return会被抛弃,执行finally的return并返回值。
      

  8.   

    有个疑问 难道finally里面更改变量的值没效果????
      

  9.   


    finally不加return 程序编译会报错
      

  10.   

    int i = 1;
            try
            {
                i = 2;
                return i;
            } catch(Exception e) {
             return i;
            }
            
            finally
            {
                i = 1000;
                System.out.println("finally block executed");
            }
    这个返回的为什么还是2  应该是 1000 呀感觉
      

  11.   

    是啊,向楼上的说的
    要是finally先执行的话那程序输出应该是1000啊
    怎么回事呢  谁能解释一下呢
      

  12.   


    美女乱说话,try可以不跟catch,常见的套用如下:try {
      try {
        // do something
      } catch(Exception e) {
        // deal the problem
      }
    } finally {
      // clean the end
    }finally不是在 某某 “之前”之行,不存在这样的前后关系,实际情况是,如果你把try catch finall翻译成中文,那么是:
    “尝试”执行某组代码,“最终”执行这个
    对于try {return true;} finally {return false}这这样的代码,翻译成中文就是:
    “尝试”返回真,“最终”返回假,
    其实这是很容易理解的了。catch捕捉的到底是什么呢?你仔细研究一下这样的代码:import java.io.IOException;
    public class Arcane1 {
        public static void main(String[] args) {
            try {
                System.out.println("Hello world");
            } catch(IOException e) {
                System.out.println("I've never seen
                   println fail!");
            }
        }
    }public class Arcane2 {
        public static void main(String[] args) {
            try {
                // If you have nothing nice to say, say nothing
            } catch(Exception e) {
                System.out.println("This can't 
                    happen");
            }
        }
    }interface Type1 {
        void f() throws CloneNotSupportedException;
    }interface Type2 {
        void f() throws InterruptedException;
    }interface Type3 extends Type1, Type2 {
    }public class Arcane3 implements Type3 {
        public void f() {
            System.out.println("Hello world");
        }
        public static void main(String[] args) {
            Type3 t3 = new Arcane3();
            t3.f();
        }
    }
    解释:
    第一个程序,Arcane1,展示了被检查异常的一个基本原则。它看起来应该是可以编译的:try子句执行I/O,并且catch子句捕获IOException异常。但是这个程序不能编译,因为println方法没有声明会抛出任何被检查异常,而IOException却正是一个被检查异常。语言规范中描述道:如果一个catch子句要捕获一个类型为E的被检查异常,而其相对应的try子句不能抛出E的某种子类型的异常,那么这就是一个编译期错误[JLS 11.2.3]。
    基于同样的理由,第二个程序,Arcane2,看起来应该是不可以编译的,但是它却可以。它之所以可以编译,是因为它唯一的catch子句检查了Exception。尽管JLS在这一点上十分含混不清,但是捕获Exception或Throwble的catch子句是合法的,不管与其相对应的try子句的内容为何。尽管Arcane2是一个合法的程序,但是catch子句的内容永远的不会被执行,这个程序什么都不会打印。第三个程序,Arcane3,看起来它也不能编译。方法f在Type1接口中声明要抛出被检查异常CloneNotSupportedException,并且在Type2接口中声明要抛出被检查异常InterruptedException。Type3接口继承了Type1和Type2,因此,看起来在静态类型为Type3的对象上调用方法f时,有潜在可能会抛出这些异常。一个方法必须要么捕获其方法体可以抛出的所有被检查异常,要么声明它将抛出这些异常。Arcane3的main方法在静态类型为Type3的对象上调用了方法f,但它对CloneNotSupportedException和InterruptedExceptioin并没有作这些处理。那么,为什么这个程序可以编译呢?上述分析的缺陷在于对“Type3.f可以抛出在Type1.f上声明的异常和在Type2.f上声明的异常”所做的假设。这并不正确,因为每一个接口都限制了方法f可以抛出的被检查异常集合。一个方法可以抛出的被检查异常集合是它所适用的所有类型声明要抛出的被检查异常集合的交集,而不是合集。因此,静态类型为Type3的对象上的f方法根本就不能抛出任何被检查异常。因此,Arcane3可以毫无错误地通过编译,并且打印Hello world。总之,第一个程序说明了一项基本要求,即对于捕获被检查异常的catch子句,只有在相应的try子句可以抛出这些异常时才被允许。第二个程序说明了这项要求不会应用到的冷僻案例。第三个程序说明了多个继承而来的throws子句的交集,将减少而不是增加方法允许抛出的异常数量。本谜题所说明的行为一般不会引发难以捉摸的bug,但是你第一次看到它们时,可能会有点吃惊。
      

  13.   

    楼上的,我将你的代码放到Eclipse中
     t3.f();   这行编译报错啊
      

  14.   

    不论怎样   finally里面的语句一定会执行的···
      

  15.   

    如果你不想写catch,放个空的在那里也不影响什么这是个好习惯,应该坚持
      

  16.   

    不管怎样,finally语句只要你写了就一定会执行的,除法你不写,catch语句是不可少的,不然你写try语句就没什么意义了,但catch语句不一定会执行,只有当你try语句捕获到异常时它才会运行!
      

  17.   

    这个结果跟你写的程序的返回值有关系,你写的方法里面肯定是返回int类型的,所以结果总是显示最后一个return值。实际上,try---catch一般是匹配使用的,但是不写catch也不会报错。而finally是在try---catch后再执行的。你可以试下下面的代码public class TryCatch {
      
       public static void main(String[] args){
       int i;
       try{
       i=2;
       //return i;
       System.out.println("Try"+i);
       }
       //catch(Exception ex){}
       finally{
       i=3;
       System.out.println("Finally"+i);
       //return i;
       }
    }
    }
      

  18.   

    简单地说当try里面有return的时候 此时有finally的时候不会立即退出 会先去执行finally里的程序,除非你在try里面调用了system.exit(0)强制退出方法 当执行finally里面的时候如果没有遇到return 则会回过去执行try里面的return 如果有return 则会返回结束方法