- 浏览: 3053033 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
看看这段代码,
TestFinally.java:
运行的话会看到怎样的结果呢?
于是两次对foo()的调用都返回了false。嗯?
foo()里,控制流不是应该在try语句块里就返回了么?try里的两条分支,无论哪条应该返回才对啊?
但是同时,我们也知道finally语句块一定会在try-catch语句之后执行一次。
如果finally里的不是return那很好理解,但偏偏这里就是return语句……
Java Language Specification, 3rd里的对try-catch-finally语句执行的规定在这里。不过并没有提到return的值的问题。
唉,总之那啥……虽然很合理,但Java里的这finally子句的处理还是很诡异。居然能改写返回值,让一般的控制流与异常处理变得不怎么正交了 = =
Sun的javac从1.4.2开始就不再生成jst/ret指令来处理异常,而是直接把异常处理的代码嵌在方法里,通过异常表来确定handler的位置。
TestFinally.java:
public class TestFinally { public static void main(String[] args) { System.out.println(foo(-1)); System.out.println(foo(1)); } private static boolean foo(int value) { try { if (value < 0) { return false; } else { return true; } } finally { return false; } } }
运行的话会看到怎样的结果呢?
D:\temp>javac TestFinally.java D:\temp>java TestFinally false false
于是两次对foo()的调用都返回了false。嗯?
foo()里,控制流不是应该在try语句块里就返回了么?try里的两条分支,无论哪条应该返回才对啊?
但是同时,我们也知道finally语句块一定会在try-catch语句之后执行一次。
Java Language Specification, 3rd 写道
A finally clause ensures that the finally block is executed after the try block and any catch block that might be executed, no matter how control leaves the try block or catch block.
如果finally里的不是return那很好理解,但偏偏这里就是return语句……
Java Language Specification, 3rd里的对try-catch-finally语句执行的规定在这里。不过并没有提到return的值的问题。
唉,总之那啥……虽然很合理,但Java里的这finally子句的处理还是很诡异。居然能改写返回值,让一般的控制流与异常处理变得不怎么正交了 = =
Sun的javac从1.4.2开始就不再生成jst/ret指令来处理异常,而是直接把异常处理的代码嵌在方法里,通过异常表来确定handler的位置。
评论
8 楼
kingquake21
2011-05-17
public static void main(String[] args) { System.out.println(test()); // 1 System.out.println(s_val); // 2 }
7 楼
driftcloudy
2011-04-30
哈哈,这个问题我曾经看到过的额,帮你翻了翻
《java puzzlers》第36题
在一个 try-finally语句中,finally语句块总是在控制权离开try语句块时执行的[JLS 14.20.2]。无论try语句块是正常结束的,还是意外结束的,情况都是如此。
一条语句或一个语句块在它抛出了一个异常,或者对某个封闭型语句执行了一个 break 或continue,或是象这个程序一样在方法中执行了一个return时,将发生意外结束。它们之所以被称为意外结束,是因为它们阻止程序去按顺序执行下面的语句。
在这个程序中,在try语句块中的 return 语句所引发的意外结束将被丢弃,而try-finally语句意外结束是由finally语句块中的return造成的。
《java puzzlers》第36题
在一个 try-finally语句中,finally语句块总是在控制权离开try语句块时执行的[JLS 14.20.2]。无论try语句块是正常结束的,还是意外结束的,情况都是如此。
一条语句或一个语句块在它抛出了一个异常,或者对某个封闭型语句执行了一个 break 或continue,或是象这个程序一样在方法中执行了一个return时,将发生意外结束。它们之所以被称为意外结束,是因为它们阻止程序去按顺序执行下面的语句。
在这个程序中,在try语句块中的 return 语句所引发的意外结束将被丢弃,而try-finally语句意外结束是由finally语句块中的return造成的。
6 楼
beneo
2011-04-29
碰到这个问题的时候,谈求最深的一次,也就看了JLS,从来不知道
jst/ret指令来处理异常,而是直接把异常处理的代码嵌在方法里,通过异常表来确定handler的位置。
对R大各种羡慕极度恨
引用
jst/ret指令来处理异常,而是直接把异常处理的代码嵌在方法里,通过异常表来确定handler的位置。
对R大各种羡慕极度恨
5 楼
RednaxelaFX
2011-04-29
Dino以前也有篇跟C#的finally相关的帖子:.NET Trivia
4 楼
raomengwen
2009-09-04
这个讨论是什么意思啊
3 楼
RednaxelaFX
2008-05-20
发现原来M$的Mike Stall也blog过关于C#里的return与finally的矛盾的问题:
Pop quiz: Who wins in finally vs. return?
Return vs. Finally (2)
看来C#里也是有一样的问题啊……hmm
于是回头把那边的例子换成Java试了下,行为看来一样:
Pop quiz: Who wins in finally vs. return?
Return vs. Finally (2)
看来C#里也是有一样的问题啊……hmm
于是回头把那边的例子换成Java试了下,行为看来一样:
public class Test { static int test() { int val = 1; try { return val; } finally { val = 2; } } public static void main(String[] args) { System.out.println(test()); // 1 } }
public class Test { static int s_val; static int test() { s_val = 1; try { return s_val; } finally { s_val = 2; } } public static void main(String[] args) { System.out.println(test()); // 1 } }
2 楼
RednaxelaFX
2008-05-06
那是啊……有记录才有积累,有积累才有进步嘛。不记下来下次又忘了 T T
1 楼
poweryoung
2008-05-06
乃果然记下来了么...
发表评论
-
The Prehistory of Java, HotSpot and Train
2014-06-02 08:18 0http://cs.gmu.edu/cne/itcore/vi ... -
MSJVM and Sun 1.0.x/1.1.x
2014-05-20 18:50 0当年的survey paper: http://www.sym ... -
Sun JDK1.4.2_28有TieredCompilation
2014-05-12 08:48 0原来以前Sun的JDK 1.4.2 update 28就已经有 ... -
IBM JVM notes (2014 ver)
2014-05-11 07:16 0Sovereign JIT http://publib.bou ... -
class data sharing by Apple
2014-03-28 05:17 0class data sharing is implement ... -
Java 8与静态工具类
2014-03-19 08:43 16294以前要在Java里实现所谓“静态工具类”(static uti ... -
Java 8的default method与method resolution
2014-03-19 02:23 10465先看看下面这个代码例子, interface IFoo { ... -
HotSpot Server VM与Server Class Machine
2014-02-18 13:21 0HotSpot VM历来有Client VM与Server V ... -
Java 8的lambda表达式在OpenJDK8中的实现
2014-02-04 12:08 0三月份JDK8就要发布首发了,现在JDK8 release c ... -
GC stack map与deopt stack map的异同
2014-01-08 09:56 0两者之间不并存在包含关系。它们有交集,但也各自有特别的地方。 ... -
HotSpot Server Compiler与data-flow analysis
2014-01-07 17:41 0http://en.wikipedia.org/wiki/Da ... -
字符串的一般封装方式的内存布局 (1): 元数据与字符串内容,整体还是分离?
2013-11-07 17:44 22409(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局
2013-11-01 12:55 0(Disclaimer:未经许可请 ... -
关于string,内存布局,C++ std::string,CoW
2013-10-30 20:45 0(Disclaimer:未经许可请 ... -
对C语义的for循环的基本代码生成模式
2013-10-19 23:12 21886之前有同学在做龙书(第二版)题目,做到8.4的练习,跟我对答案 ... -
Java的instanceof是如何实现的
2013-09-22 16:57 0Java语言规范,Java SE 7版 http://docs ... -
oop、klass、handle的关系
2013-07-30 17:34 0oopDesc及其子类的实例 oop : oopDesc* ... -
Nashorn各种笔记
2013-07-15 17:03 0http://bits.netbeans.org/netbea ... -
《深入理解Java虚拟机(第二版)》书评
2013-07-08 19:19 0值得推荐的中文Java虚拟机入门书 感谢作者赠与的样书,以下 ... -
豆列:从表到里学习JVM实现
2013-06-13 14:13 48398刚写了个学习JVM用的豆列跟大家分享。 豆列地址:http: ...
相关推荐
17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句...
try、catch、finally、return 执行顺序详细讲解 try、catch、finally、return 执行顺序是 Java 编程语言中的一种 exception 处理机制,用于处理程序中的异常情况。下面我们来详细讲解 try、catch、finally、return ...
标题“try-finally-return-in-finally.rar_return”暗示了我们正在讨论`return`语句如何与`finally`块内的`return`交互。在JavaScript中,如果`try`块或`finally`块包含`return`语句,程序的行为可能会变得复杂。 ...
标题 "try-catch-finally-return-in-finally.rar_return" 提到了 `try-catch-finally` 结构与 `return` 语句的交互,这涉及到程序执行流程的关键方面。 `try` 块是用来包含可能会抛出异常的代码。如果在 `try` 块中...
Java 中 finally 语句块与 return 的执行关系 Java 中的 finally 语句块是用于保证无论出现什么情况,一定要执行的代码块。在 try-catch-finally 结构中,finally 语句块的执行顺序是非常重要的。下面我们来详细...
try() , catch() , finally()函数 自定义错误对象 快的 -- import creates a base Error class and global funcs try(), catch(), finally() local Error = require ' lua_error ' -- do this anywhere in your ...
本教程将深入探讨Python中的异常处理机制,特别是`try/except/finally`块的应用。异常是程序运行过程中出现的错误,可能由语法错误、逻辑错误或外部条件(如文件未找到)引起。Python提供了一种优雅的方式来捕获并...
VB.NET 演示带Finally的Try Catch 异常处理用法演示,这个源码就是捕捉VB.NET运行错误的,结合了最常规的try catch组合,并且使用了Finally处理的情况,那么为什么要使用Finally呢?使用Finally的好处是,把资源释放...
即使在`finally`块中有`return`,原始的`return`语句的返回值也不会丢失,因为编译器已经将其保存。`finally`块执行完毕后,才会使用其自身的`return`(如果有)或者原始`return`的值来返回结果。 在实际编程中,...
Java语言finally语句详解,finally到底是在return之前还是之后执行.zip
Java中finally和return的关系实例解析 Java中finally和return的关系实例解析是Java编程语言中一个重要的知识点。finally语句是Java语言中的一种特殊语句,它用于释放资源、关闭文件、关闭网络连接等操作。return...
在Java的异常机制中,如果finally中含有return语句,则try和catch中的return语句将会被JVM忽视
The Git interface you've been missing all your life has finally arrived..zip,The Git interface you've been missing all your life has finally arrived.
Larry graduated this year and finally has a job. He's making a lot of money, but somehow never seems to have enough. Larry has decided that he needs to grab hold of his financial portfolio and solve ...
try except finally的用法.doc
关于`return`语句的使用,有一个重要的原则:既不在`try`内部使用`return`语句,也不在`finally`内部使用`return`语句,而应该在`finally`语句之后使用`return`来表示函数的结束和返回。 通过以上的详细介绍,我们...
比较爱考的是 finally 里没有 return 语句,这时虽然 finally 里对 return 的值进行了修改,但 return 的值并不改变这种情况 ## 三.finally代码块和finalize()方法有什么区别? 无论是否抛出异常,finally代码块...
### Delphi异常处理try_except语句和try_finally语句用法以及区别 #### 异常的来源 在Delphi的应用程序中,多种...通过合理运用try...except...end和try...finally...end等结构,开发者可以构建出更加健壮的应用程序。
java.try-except-finally(解决方案).md