2013-02-26 27 views
2

之间有什么区别:的Java的try-catch或外部

while(true) { 
    try { 
     // something 
    } catch(Exception e) { 
     break; 
    } 
} 

try { 
    while(true) { 
    // something 
    // break; // eventually 
    } 
} catch(Exception e) { 

} 

是否前者运行一个try-catch在每个迭代上或做编译器生成相同的代码。 哪个是首选?

编辑:打破;因为没有必要,所以在第二个例子中从catch块中移除。

+0

不仅是有没有必要在第二个例子中'break',如在我的答案是,严禁在那里。 – jlordo 2013-02-27 07:06:21

回答

6

不同的是,该一个冷杉将编译和按预期方式工作(中断循环的发生异常时),第二个将不编译。

编译器错误将是break cannot be used outside of a loop or a switch这是非常自我解释(你试图使用break以外的循环(语法上),这是不允许的)。

我会修改你的例子来说明这一点:如果出现异常,我插入注释,应该怎样爆发的

try { 
    while(true) { 
    // something 
    // break; // eventually 
    } 
    /* --> more code, that could throw an exception <-- */ 
} catch(Exception e) { 
    break; 
} 

显式地回答你的问题:

是否前者运行在每次迭代或一个try-catch请问 编译器生成相同的代码?

是的,前者在每次迭代中运行try/catch块。

这是首选?

显然是第一个。

的首选方法是第二种方式中,只是在没有catch块的break关键字。正如Ren在他的评论中指出的那样,当发生异常时,你将执行catch块(记录错误或类似的东西),然后执行catch块下面的代码。不需要break关键字。

+0

那么每次迭代都会首选try-catch?对我来说,假设它会涉及额外的开销而不是运行一次,这似乎是违反直觉的。 – BAR 2013-02-26 23:31:44

+0

@ user417896:我同意你的思路。但另一种方式是不可能的,所以是的,首选的方式是没有编译器错误的方式。 – jlordo 2013-02-26 23:33:37

+2

使用第二种方法,当出现异常时,您将进入循环外部的catch块。所以你不需要在那里休息。 – Ren 2013-02-26 23:37:29