原文: https://beginnersbook.com/2013/04/try-catch-in-java/

上一篇教程中,我们讨论了什么是异常处理以及我们为什么这样做。在本教程中,我们将看到用于异常处理的try-catch块。

try

try块包含可以发生异常的一组语句。try块后面总是跟一个catch块,它处理相关try块中发生的异常。try块必须后跟catch块或finally块或两者。

try块的语法

  1. try{
  2. //statements that may cause an exception
  3. }

在编写程序时,如果您认为程序中的某些语句可以抛出异常,请将它们包含在try块中并处理该异常

catch

catch块是处理异常的地方,此块必须遵循try块。单个try块可以有几个与之关联的catch块。您可以在不同的catch块中捕获不同的异常。当try块中发生异常时,将执行处理该特定异常的相应catch块。例如,如果在try块中发生算术异常,则执行catch块中用于算术异常的语句。

java 中try-catch的语法

  1. try
  2. {
  3. //statements that may cause an exception
  4. }
  5. catch (exception(type) e(object))‏
  6. {
  7. //error handling code
  8. }

示例:try-catch

如果try块中发生异常,则执行控制将传递给相应的catch块。单个try块可以有多个与之关联的catch块,您应该放置catch块,使得通用异常处理程序catch块位于最后(参见下面的示例)。

通用异常处理程序可以处理所有异常但是你应该放在最后,如果你把它放在所有catch块之前,那么它将显示通用消息。您始终希望为每种类型的异常提供有意义的消息,而不是通用消息。

  1. class Example1 {
  2. public static void main(String args[]) {
  3. int num1, num2;
  4. try {
  5. /* We suspect that this block of statement can throw
  6. * exception so we handled it by placing these statements
  7. * inside try and handled the exception in catch block
  8. */
  9. num1 = 0;
  10. num2 = 62 / num1;
  11. System.out.println(num2);
  12. System.out.println("Hey I'm at the end of try block");
  13. }
  14. catch (ArithmeticException e) {
  15. /* This block will only execute if any Arithmetic exception
  16. * occurs in try block
  17. */
  18. System.out.println("You should not divide a number by zero");
  19. }
  20. catch (Exception e) {
  21. /* This is a generic Exception handler which means it can handle
  22. * all the exceptions. This will execute if the exception is not
  23. * handled by previous catch blocks.
  24. */
  25. System.out.println("Exception occurred");
  26. }
  27. System.out.println("I'm out of try-catch block in Java.");
  28. }
  29. }

输出:

  1. You should not divide a number by zero
  2. I'm out of try-catch block in Java.

Java 中的多个catch

我们在上面看到的示例是有多个catch块,让我们在示例的帮助下看到关于多个catch块的一些规则。要详细阅读,请参阅在 java 中捕获多个异常

  1. 如上所述,单个try块可以包含任意数量的catch块。
  2. 通用catch块可以处理所有异常。无论是ArrayIndexOutOfBoundsException还是ArithmeticExceptionNullPointerException或任何其他类型的异常,它都会处理所有这些异常。要查看NullPointerExceptionArrayIndexOutOfBoundsException的示例,请参阅以下文章:异常处理示例程序
  1. catch(Exception e){
  2. //This catch block catches all the exceptions
  3. }

如果你想知道为什么我们需要其他捕获处理程序,当我们有一个可以处理所有的通用。这是因为在通用异常处理程序中,您可以显示消息,但您不确定它可能触发的异常类型,因此它将为所有异常显示相同的消息,并且用户可能无法理解发生了哪个异常。这就是你应该放置的原因是在所有特定异常catch块的末尾

  1. 如果try块中没有异常,则完全忽略catch块。
  2. 对应的catch块执行特定类型的异常:
    catch(ArithmeticException e)是一个可以解决ArithmeticExceptioncatch
    catch(NullPointerException e)是一个可以处理NullPointerExceptioncatch
  3. 你也可以抛出异常,这是一个高级主题,我在单独的教程中介绍了它:用户定义异常throw关键字throw vs throws

多个catch块的示例

  1. class Example2{
  2. public static void main(String args[]){
  3. try{
  4. int a[]=new int[7];
  5. a[4]=30/0;
  6. System.out.println("First print statement in try block");
  7. }
  8. catch(ArithmeticException e){
  9. System.out.println("Warning: ArithmeticException");
  10. }
  11. catch(ArrayIndexOutOfBoundsException e){
  12. System.out.println("Warning: ArrayIndexOutOfBoundsException");
  13. }
  14. catch(Exception e){
  15. System.out.println("Warning: Some Other exception");
  16. }
  17. System.out.println("Out of try-catch block...");
  18. }
  19. }

输出:

  1. Warning: ArithmeticException
  2. Out of try-catch block...

在上面的示例中,有多个catch块,当try块中发生异常时,这些catch块按顺序执行。这意味着如果你把最后一个catch块(catch(Exception e))放在第一个地方,就在try块之后,那么在任何异常的情况下,这个块将执行,因为它可以处理所有异常。该挡块应放在最后,以避免这种情况。

finally

我在这里单独介绍了这个:java finally。现在你只需知道这个块执行是否发生异常。您应该将这些语句放在finally块中,必须执行是否发生异常。