- 浏览: 3046510 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (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分享的概要
打捞回复帖。嗯这无聊的语法问题…
原文地址:http://www.iteye.com/topic/1064881?page=6#2136913
嘛,这个的理由很简单:因为局部变量声明不是“语句”。
这是Java语言规范里非常搞笑的一个地方:请看Java语言规范第三版18.1所指定的语法规则中的几条:
方法体必须是一个block。
Block是由花括号包围的零或多个BlockStatement。
BlockStatement可以是局部变量声明,或者类/接口声明(注:这样的类或接口被称为“局部类”(local class)“局部接口”(local interface)),或者是可选带label的语句Statement。
语句有若干中可能,其中一种是if语句;if语句的then分支必须是一个Statement。
关注点是:LocalVariableDeclarationStatement虽然叫做“Statement“,但在语法规则中它却不是一种”Statement“。所以说根据这个规则,局部变量声明就不是语句,自然也就不能单独出现在if的then分支位置上。被花括号包围起来的话它就是一个Block了,而Block是Statement的一种所以没问题。
槽点:叫做“语句”但却不是语句的局部变量声明。
顺带一提,NS提醒我,在javac里代表局部变量声明的节点类型是JCVariableDecl,该类继承了代表了语句的JCStatement类;但是,javac仍然会按照语法规范来检查…所以if的then分支上还是不能单独放一个局部变量声明 =_=|||
想看源码的请点:
http://hg.openjdk.java.net/jdk6/jdk6/langtools/file/tip/src/share/classes/com/sun/tools/javac/tree/JCTree.java
要这么说的话,Java和C#又不像Go做得那么彻底:Go里未被使用的局部变量是编译时错误。
C#语言规范3.0里的几条语法规则:
你看C#的规范里local-variable-declaration就是一种statement,只不过if的then和else分支的内容必须是embedded-statement,而local-variable-declaration不是一种embedded-statement。这跟Java的效果是一样的,但是至少它没有说“LocalVariableDeclarationStatement不是Statement”…
原文地址:http://www.iteye.com/topic/1064881?page=6#2136913
lion1354 写道
好吧看代码,把下面两段代码粘到eclipse中你就会知道了
至于原因请高人来回答
public class Test { public static void main(String[] args) { if (true) { String i = new String("Test"); } } }上面的编译正确
public class Test { public static void main(String[] args) { if (true) String i = new String("Test"); } }上面的编译错误
至于原因请高人来回答
嘛,这个的理由很简单:因为局部变量声明不是“语句”。
这是Java语言规范里非常搞笑的一个地方:请看Java语言规范第三版18.1所指定的语法规则中的几条:
Block: { BlockStatements } BlockStatements: { BlockStatement } BlockStatement : LocalVariableDeclarationStatement ClassOrInterfaceDeclaration [Identifier :] Statement LocalVariableDeclarationStatement: [final] Type VariableDeclarators ; Statement: Block assert Expression [ : Expression] ; if ParExpression Statement [else Statement] for ( ForControl ) Statement while ParExpression Statement do Statement while ParExpression ; try Block ( Catches | [Catches] finally Block ) switch ParExpression { SwitchBlockStatementGroups } synchronized ParExpression Block return [Expression] ; throw Expression ; break [Identifier] continue [Identifier] ; StatementExpression ; Identifier : Statement MethodBody: Block
方法体必须是一个block。
Block是由花括号包围的零或多个BlockStatement。
BlockStatement可以是局部变量声明,或者类/接口声明(注:这样的类或接口被称为“局部类”(local class)“局部接口”(local interface)),或者是可选带label的语句Statement。
语句有若干中可能,其中一种是if语句;if语句的then分支必须是一个Statement。
关注点是:LocalVariableDeclarationStatement虽然叫做“Statement“,但在语法规则中它却不是一种”Statement“。所以说根据这个规则,局部变量声明就不是语句,自然也就不能单独出现在if的then分支位置上。被花括号包围起来的话它就是一个Block了,而Block是Statement的一种所以没问题。
槽点:叫做“语句”但却不是语句的局部变量声明。
顺带一提,NS提醒我,在javac里代表局部变量声明的节点类型是JCVariableDecl,该类继承了代表了语句的JCStatement类;但是,javac仍然会按照语法规范来检查…所以if的then分支上还是不能单独放一个局部变量声明 =_=|||
想看源码的请点:
http://hg.openjdk.java.net/jdk6/jdk6/langtools/file/tip/src/share/classes/com/sun/tools/javac/tree/JCTree.java
评论
6 楼
w445097062
2012-07-31
刚好和同事讨论这个问题,他坚持单命令行也加大括号,我坚持不加,个人习惯而已,随便;随后他用上面的例子来考我,翻到到了这篇文章,才解释得通
5 楼
wyp12
2011-07-29
又多了一个小知识
4 楼
lwwin
2011-06-01
这个也被你挖出来了^-^
3 楼
william_ai
2011-06-01
恩,规范里这么规定,应该是从实际出发的,在if(true)后,只做定义一个变量(赋值)的操作,这个变量以后也不能用,这么定义变量没有意义。所以,就直接抛一个compile error。
2 楼
RednaxelaFX
2011-06-01
幸存者 写道
貌似C#也是同样的语法,不过这个规范倒也不是全无道理,毕竟局部变量如果不被使用的话就毫无意义了。
要这么说的话,Java和C#又不像Go做得那么彻底:Go里未被使用的局部变量是编译时错误。
C#语言规范3.0里的几条语法规则:
statement: labeled-statement declaration-statement embedded-statement declaration-statement: local-variable-declaration ; local-constant-declaration ; if-statement: if ( boolean-expression ) embedded-statement if ( boolean-expression ) embedded-statement else embedded-statement
你看C#的规范里local-variable-declaration就是一种statement,只不过if的then和else分支的内容必须是embedded-statement,而local-variable-declaration不是一种embedded-statement。这跟Java的效果是一样的,但是至少它没有说“LocalVariableDeclarationStatement不是Statement”…
1 楼
幸存者
2011-06-01
貌似C#也是同样的语法,不过这个规范倒也不是全无道理,毕竟局部变量如果不被使用的话就毫无意义了。
发表评论
-
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 16266以前要在Java里实现所谓“静态工具类”(static uti ... -
Java 8的default method与method resolution
2014-03-19 02:23 10448先看看下面这个代码例子, 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 22385(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 21866之前有同学在做龙书(第二版)题目,做到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 48349刚写了个学习JVM用的豆列跟大家分享。 豆列地址:http: ...
相关推荐
ListyFly是基于命令行的应用程序,用于创建和编辑待办事项列表。 它包括任务嵌套,任务元信息和许多其他有用的功能。 用法 首先,克隆存储库并将当前工作目录更改为新下载的文件夹。 然后,运行listy.rb文件。 $ ...
标题中的“答复: 一道经典线程面试题的4种解法”暗示了这是一个关于多线程编程的问题,通常在面试中出现,用于评估候选人的并发处理能力。在这个问题中,可能涉及到同步、线程安全、锁机制等关键概念。 在Java中,...
- 错误处理:优雅地处理错误,提供清晰的错误信息,有助于用户理解问题并修复。 7. **标签“源码”和“工具”** - 源码:可能指的是提供验证功能的PHP代码示例,帮助开发者理解并应用到自己的项目中。 - 工具:...
cmdide-从命令行启动CodeWarrior的工具 cmdide允许从MacOSX中的命令行编译Metrowerks CodeWarrior项目。 CodeWarrior是用于680x0和PowerPC的Mac OS和Mac OSX应用程序的旧版开发系统。 这是一个响应AppleEvents的桌面...
- 肯定答复与否认答复:对一般疑问句的回答,肯定答复用“Yes, + 主语 + 助动词/情态动词。”,否定答复用“No, + 主语 + 助动词/情态动词 + not。” 2. 具体题目解答: - 1. It is fun at school. 否认句:It is...
标题中的“答复: 通过代码简单介绍JDK 7的MethodHandle,并与.NET的委托对比(二)”表明本文将深入探讨Java中的MethodHandle概念,并将其与.NET平台上的委托进行对比。MethodHandle是JDK 7引入的一个强大特性,它...
博文链接:https://eric2007.iteye.com/blog/158580
9. 签名与盖章:答复人应在文件上加盖公章,法定代表人或委托代理人签字确认,以证明文件的真实性和合法性。 10. 附件:随答复意见书一同提交的证据材料清单,列明所有支持行政行为的证据文件,以便复议机关审查。 ...
标题中的“答复:答复‘通向开放未来的捷径’”暗示了这是一篇对某个讨论或议题的回应,特别是关于开放科学和知识发布的路径。在描述中提到的SpringerNature是一家知名的学术出版机构,它涉及的社论可能讨论了如何在...
肯定答复:Yes, there are. 否定答复:No, there aren't. 对于情态动词,如can,否定形式是在其后加"not",一般疑问句则将其提前到句首。例如: 2. 肯定句:Li Ming's father can drive the car. 否定句:Li ...
【OA答复原则及策略】 在专利申请过程中,审查意见通知书的答复是一项至关重要的任务,它直接关系到专利能否顺利授权。以下将详细阐述OA答复的原则和策略,以及如何理解和分析审查意见通知书。 首先,理解审查意见...
### 在Word2021中如何答复批注 #### 知识点概述 在Microsoft Word 2021中,用户可以通过多种方式对文档中的批注进行答复。这对于团队协作和文档审查非常重要,因为它允许作者和其他参与者就文档内容的具体部分进行...
"License申请答复单模板"通常涉及到开发者或企业向软件供应商申请使用、分销或定制特定软件时需要填写的文档。这个过程对于确保合规性和避免潜在的法律问题至关重要。 许可证申请通常包括以下关键信息: 1. **申请...
【锐捷园区交换机常见问题答复集】 锐捷园区交换机是企业网络基础设施的重要组成部分,主要服务于企业园区内的网络连接需求。本答复集旨在解决在使用锐捷园区交换机过程中遇到的各种常见问题,帮助网络工程师、技术...
理解并妥善答复审查意见通知书对于专利申请的成功至关重要。下面详细阐述在答复审查意见通知书时应注意的几个关键知识点。 1. 审查意见通知书的分类和内容: 审查意见通知书主要分为两类:第一次审查意见通知书和...
通过这些精选的答复,开发者可以迅速找到对应问题的解答,提高问题解决效率。 "VB源码"标签则明确了这是一个以源代码为主导的学习资源,它提供了实际可运行的代码示例,使得学习者能够通过观察和修改代码来深化理解...
作为一个AI语言模型,我能够理解和回答许多问题,但是有些技巧可以帮助你更有效地与我交流,以获得最佳的答复: 简明扼要地表达你的问题:尽可能简明地表达你的问题,并使用清晰的语言和结构来传达你的意思。这样...
选课问题收集-答复1 根据提供的文件信息,我们可以总结出以下几点关于选课问题的知识点: 1. 课程改革:之前的 4+1 学分课程现在变成了 3+2 学分,可以直接课程替代,但按照学校文件规定,-10 分替代。 2. 公选课...