为什么Java中的try/catch或synchronized需要语句块?

为什么Java中的try/catch或synchronized需要语句块?,java,jls,Java,Jls,Java允许某些关键字后跟语句或语句块。例如: if (true) System.out.println("true"); do System.out.println("true"); while (true); try { System.out.println("try"); } finally { System.out.println("finally"); } synchronized(this) { System.out.println("s

Java允许某些关键字后跟语句或语句块。例如:

if (true)
    System.out.println("true");

do
    System.out.println("true");
while (true);
try {
    System.out.println("try");
} finally {
    System.out.println("finally");
}

synchronized(this) {
    System.out.println("synchronized");
}
编译以及

if(true) {
    System.out.println("true");
}

do {
   System.out.println("true");
} while (true);
这同样适用于
for
while
等关键字

但是,有些关键字不允许这样做<代码>同步需要块语句。同样适用于
尝试。。。抓住。。。最后
,它要求在关键字后面至少有两个块语句。例如:

if (true)
    System.out.println("true");

do
    System.out.println("true");
while (true);
try {
    System.out.println("try");
} finally {
    System.out.println("finally");
}

synchronized(this) {
    System.out.println("synchronized");
}
工作正常,但无法编译以下内容:

try
    System.out.println("try");
finally
    System.out.println("finally");

synchronized (this)
    System.out.println("synchronized");

那么,为什么Java中的一些关键字需要block语句,而其他关键字则允许block语句和单个语句?这是语言设计中的不一致,还是有某种原因?

这只是语言的设计决策,以及它的编译器机制


我同意这个决定。不需要代码块可能会使代码变短,但这肯定会导致混乱,并产生不可预见的后果。

如果你试图允许省略大括号,就会出现类似else的模糊性。虽然这可以用与其他悬而未决的问题类似的方式解决,但最好不要这样做

考虑

try
try 
fn();
catch (GException exc)
g();
catch (HException exc)
h();
catch (IException exc)
i();
这意味着什么

try
    try 
        fn();
    catch (GException exc)
        g();
    catch (HException exc)
        h();
catch (IException exc)
    i();


我相信在CLU中,catch块只包含一个语句(可能是错误的)。

不使用{}会有问题,即使使用允许这样做的语句也可能会产生混淆。解决这个问题的方法是严格使用代码格式化程序。许多地方总是要求{}来避免问题

e、 g

我相信您可以对某些语句执行此操作,而不是对来自C的其他语句执行此操作的原因。在C中,您可以使用if/do/while/for而不使用语句块。但是,Java中添加了try/catch和synchronized。为什么它们只有{}块有两个原因

  • 这被认为是最佳做法
  • 只允许一个选项更简单

鉴于Java是一种功能精简的语言,我怀疑它与前者一样晚,甚至更晚。

我怀疑单语句方法是不受欢迎的,只是因为在c语言中可能存在类似的东西才被使用。由于c没有同步或尝试,它们可能使用了“更安全”选项;好吧,没有技术上的理由必须有块,因为它可以自动创建。我猜,FWIW:语言设计者希望保持与其他语言足够相似的语法,以帮助学习。但是,如果添加了新的语言特性,它们将强制执行一些人认为更好的编码标准。或者,也许,对于使用频率较低的语言特性,他们追求更好的编码理念?Scala没有这样的限制;语法是组合的,大括号是统一处理的,这是我(显然是OP)碰巧欣赏的语言设计原则。我不想开始讨论这是好是坏。我只是想知道这个问题的根源,因为在我看来这是一个不一致的问题。我指的是编译器的设计,而不是它是否可以在没有它的情况下工作。Java编译器就是不接受它。也许更好的措辞应该是“编译器设计决策”。当然,这是语言的设计,但我感兴趣的是为什么它决定以这种方式实现它。if/else块也有类似的问题。我认为这是一个常见的问题,设计师希望避免这些问题。汤姆,谢谢你的好例子。但是,这并不能解释我关于同步表达式的问题。