Java难题 之 为什么try-catch-finally块需要大括号?

我们都知道如何用Java编写try-catch-finally块。甚至我们所有人都在编写if-else语句。让我们理解为什么try-catch-finally块需要大括号?

1.大括号if-else块–正常工作

让我们写一个if-else块。

boolean condition = false;  
     
if(condition)            
	System.out.println("OK");        
else            
	System.out.println("Not so OK");

上面的代码将被编译,编译器不会报告任何错误。编译器了解else块与上面编写的if块有关。

让我们添加另一个else块。

if(conditionOne)
if(conditionTwo)
 	System.out.println("OK");
else
 	System.out.println("Not so OK");
else
 	System.out.println("Not so OK");

现在,这段代码有点吓人了。如果我们删除缩进,它将变得更加可怕并且难以理解。但是,编译器以飞扬的色彩通过了它。因为它仍然能够确定任何给定else块的相关if块,方法是将仍未配对的第一个遇到的if块配对(从下到上)。

2.大括号在try-catch-finally块中

现在,让我们编写try-catch块而不使用大括号。

try
	System.out.println("try one");
catch(NullPointerException npe)
	//handle npe

奇怪的是,编译器无法理解上述简单的构造。编译器希望我们在try和catch块中添加括号。为什么??

为了理解这一点,让我们用更多的语句扩展try-catch块。

try
	System.out.println("try one");
try
	System.out.println("try two");
catch(NullPointerException npe)
	System.out.println("catch one");
catch(Exception e)
	System.out.println("catch two");
finally
	System.out.println("finally");

您将如何解决以上陈述。我们可以通过多种方式解决上述问题。例如,

选项1。

try
{
	System.out.println("try one");
	try
	{
		System.out.println("try two");
	} catch (NullPointerException npe) {
		System.out.println("catch one");
	}
}
catch (Exception e)
{
	System.out.println("catch two");
}
finally
{
	System.out.println("finally");
}

选项2。

try
{
	System.out.println("try one");
	try
	{
		System.out.println("try two");
	} catch (NullPointerException npe) {
		System.out.println("catch one");
	}
	catch (Exception e)
	{
		System.out.println("catch two");
	}
}
finally
{
	System.out.println("finally");
}

显然,以上两种代码构造都是正确的,因此编译器会困惑如何解释try-catch块。

3.原因

主要原因似乎是单个try块允许多个catch块,而if-else语句则不允许

这就是Java设计人员在try-catch-finally块中强制使用花括号的原因。所以现在我们知道了为什么try-catch-finally块需要大括号。

学习愉快!

saigon has written 1440 articles

Leave a Reply