Java try-catch块与示例

时间:2020-01-09 10:34:56  来源:igfitidea点击:

健壮的代码也应该能够处理特殊情况。在Java异常处理中,try和catch块用于处理异常,这有助于继续程序的流程,还可以防止程序自动终止。在这篇文章中,我们将看到有关Java中try-catch块的详细信息。

Java中try代码块

如果方法中的代码引发异常,则默认的异常处理机制将停止方法执行,并抛出该异常以由默认处理程序处理。如果要在方法中捕获该异常,则应将代码(可能会引发异常)封装在try块中。

Java中try块的一般形式如下:

try{
  ....
  ....
}
catch and finally blocks.

在try块之后必须是catch块,finally块或者两者。 try块之后也可以有多个catch块。

Java中的catch代码块

catch块用于处理try块中引发的异常。 catch块必须紧随try块之后。可以在try块中抛出针对不同异常类型的多个catch块。

了解如何使用Java中的Multi-Catch Exception在一个catch块中处理不同的异常。

Java中的try-catch-finally块具有以下形式

try {
   // Code that may throw excpetion
}
catch (ExceptionType1 exp){
   // Exception handler for  ExceptionType1
}
catch(ExceptionType2 exp){
  // Exception handler for  ExceptionType2
}
finally{
  // code that has to be executed after try block completes
}

如果try-catch不用于处理异常

首先,让我们看看当我们不使用Java中的try-catch块来处理代码中的异常时会发生什么。在这里,我们有一个方法以2的整数作为参数并将这些数字相除。在代码中,除数以零形式传递,这将导致ArithmeticException。

public class ExceptionDemo {
  public static void main(String[] args) {
    ExceptionDemo ed = new ExceptionDemo();
    double result = ed.division(7, 0);
    System.out.println("result is - " + result);
  }

  private double division(int num1, int num2){
    double result;
    result = num1/num2;
    
    return result;	
  }
}

输出:

Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.theitroad.ExceptionDemo.division(ExceptionDemo.java:13)
at com.theitroad.ExceptionDemo.main(ExceptionDemo.java:7)

由于代码中没有try-catch块,因此在发生异常的情况下将调用默认异常处理程序,该异常终止程序并打印堆栈跟踪。

使用try-catch块进行异常处理

我们可以在Java中使用try-catch块编写相同的代码,在其中处理代码中的异常情况,并在异常情况下将结果作为零传递给适当的消息。

public class ExceptionDemo {

  public static void main(String[] args) {
    ExceptionDemo ed = new ExceptionDemo();
    double result = ed.division(7, 0);
    System.out.println("result is - " + result);
  }
	
  private double division(int num1, int num2){
    double result;
    try{
      result = num1/num2;
    }catch(ArithmeticException exp){
      System.out.println("Exception occurred while dividing" + exp.getMessage());
      // assigining zero to result
      result = 0;
    }
    return result;	
  }
}

输出:

Exception occurred while dividing/ by zero
result is - 0.0

在此更改的代码中,我们可以看到发生异常时程序没有终止,现在显示结果值。在catch块中,通过为结果分配零来处理异常,并且还会显示一条消息,显示异常原因。

Java中的嵌套try语句

我们也可以在Java异常处理中使用嵌套的try语句。在嵌套的try-catch块中,try-catch块位于外部try-catch块中。一旦代码输入嵌套的try语句,该语句便成为异常处理的当前上下文。如果内部try中发生异常,并且找不到catch块来处理该类型的异常,则检查next(外部)try语句是否存在异常处理程序,依此类推。

Java中的嵌套try语句的一般形式

try{
  ..
  ..
  try{
	..
	..
  }catch(ExceptionType-1 e){
	..
	..
  }
}catch(ExceptionType-2 e){
	..
	..
}

嵌套try语句的优点

如果我们有一段代码可能引发特定的异常,则可以将该段包含在try-catch块中以处理该异常。包围整个代码的最外层try语句可能旨在捕获更多通用异常。

Java嵌套try语句示例

在这里,我们有一个Java程序,其中传递了两个参数,然后将一个传递的参数除以另一个。因此,我们可以检查参数数量并抛出非法参数异常,该异常应由最外层处理程序捕获。在将检查除以零例外时,应由嵌套的try语句处理。将传递的参数转换为int时,我们可以在嵌套的try语句中检查NumberFormatException。

public class NestedTryDemo {
  public static void main(String[] args) {
    int num1 = 0;
    int num2 = 0;
    try{
      if(args.length != 2){
        throw new IllegalArgumentException("Two parameters should be passed");
      }
      try{
        num1 = Integer.parseInt(args[0]);
        num2 = Integer.parseInt(args[1]);
        System.out.println("num1 = " + num1 + "num2 = " + num2);
      }catch(NumberFormatException e){
        System.out.println("Error while converting string to integer");
        throw e;
      }
      try{
        double result = num1/num2;
      }catch(ArithmeticException e){
        System.out.println("Error while division");
        e.printStackTrace();
      }
      
    }catch(Exception exp){
      exp.printStackTrace();
    }
  }
}

尝试使用参数" 2"和" t5"运行此代码将导致以下异常。

java.lang.NumberFormatException: For input string: "t5"
	at java.lang.NumberFormatException.forInputString(Unknown Source)
	at java.lang.Integer.parseInt(Unknown Source)
	at java.lang.Integer.parseInt(Unknown Source)
	at com.theitroad.NestedTryDemo.main(NestedTryDemo.java:14)

尝试使用参数" 3"和" 0"运行此代码将导致以下异常。

num1 = 3num2 = 0
Error while division
java.lang.ArithmeticException: / by zero
	at com.theitroad.NestedTryDemo.main(NestedTryDemo.java:21)

要点

  • 可能引发异常的代码应放在try块中。

  • 要将异常处理程序与try块相关联,必须在其后放置catch块。

  • 在try块的末尾与第一个catch块的开始之间不能有任何代码。

  • 我们还可以在try-catch块之后或者try块之后有一个finally块。