Java try-catch块与示例
健壮的代码也应该能够处理特殊情况。在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块。