我们可以在 java 中覆盖 catch 块吗?

java 8object oriented programmingprogramming

描述

当特定方法中的一段代码抛出异常时,使用 try-catch 对进行处理。如果我们从另一个方法调用此方法,则调用行包装在 try-catch 对中。现在,我如何通过调用方法的 catch 块覆盖 catch 块。

当方法中的一段代码抛出异常(编译时)时,我们必须通过将其包装在 try-catch 对中来处理它,或者使用 throws 关键字将其抛出(推迟)到调用方法,否则会发生编译时错误。

在下面的 Java 示例中,readFile() 方法中的代码生成 FileNotFoundException,而我们没有处理它。

示例

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ExceptionExample{
   public static String readFile(String path){
      String data = null;
      Scanner sc = new Scanner(new File("E://test//sample.txt"));
      String input;
      StringBuffer sb = new StringBuffer();
      sb.append(sc.next());
      data = sb.toString();
      return data;
   }
   public static void main(String args[]) {
      String path = "E://test//sample.txt";
      readFile(path);
   }
}

编译时错误

在编译时,上述程序会产生以下编译时错误。

ExceptionExample.java:7: error: unreported exception FileNotFoundException; must be caught or declared to be thrown
         Scanner sc = new Scanner(new File("E://test//sample.txt"));
                                  ^
1 error

为了解决此错误,我们需要使用 try-catch 对处理异常,例如 −

示例

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ExceptionExample{
   public static String readFile(String path){
      String data = null;
         try {
            Scanner sc = new Scanner(new File("E://test//sample.txt"));
            String input;
            StringBuffer sb = new StringBuffer();
            sb.append(sc.next());
            data = sb.toString();
         } catch (FileNotFoundException ex) {
            System.out.println("exception occurred");
         }
         return data;
   }
   public static void main(String args[]) {
      String path = "E://test//sample.txt";
      readFile(path);
   }
}

输出

exception occurred

或者,使用 throws 关键字抛出。如果这样做,异常将被推迟到此方法的调用行,即错误现在发生在该行。

示例

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ExceptionExample{
   public static String readFile(String path)throws FileNotFoundException {
      String data = null;
      Scanner sc = new Scanner(new File("E://test//sample.txt"));
      String input;
      StringBuffer sb = new StringBuffer();
      sb.append(sc.next());
      data = sb.toString();
      return data;
   }
   public static void main(String args[]) {
      String path = "E://test//sample.txt";
      readFile(path);
   }
}

编译时错误

ExceptionExample.java:17: error: unreported exception FileNotFoundException; must be caught or declared to be thrown
      readFile(path);
               ^
1 error

要解决此问题,您需要包装调用行或使用 throws 关键字再次引发异常。

public static void main(String args[]) {
   String path = "E://test//sample.txt";
   OverridingException obj = new OverridingException();
   try {
      readFile(path);
   }catch(Exception ex) {
      System.out.println("Exception occured");
   }
}

话虽如此,如果您在源方法(最初生成异常的方法)中使用 try-catch 对处理异常,则无需在调用方法中再次处理它。在两个地方都有 try-catch 是没有意义的。

执行两个 catch 块中的内容的唯一方法是重新抛出异常。

重新抛出异常

当异常缓存在 catch 块中时,您可以使用 throw 关键字(用于抛出异常对象)重新抛出它。

在重新抛出异常时,您可以抛出相同的异常,而无需对其进行调整

try {
   int result = (arr[a])/(arr[b]);
   System.out.println("Result of "+arr[a]+"/"+arr[b]+": "+result);
} catch(ArithmeticException e) {
   throw e;
}

或者,将其包装在新的异常中并抛出。当您将缓存的异常包装在另一个异常中并抛出时,这被称为异常链或异常包装,通过这样做,您可以调整您的异常,抛出更高级别的异常以保持抽象。

try {
   int result = (arr[a])/(arr[b]);
   System.out.println("Result of "+arr[a]+"/"+arr[b]+": "+result);
} catch(ArrayIndexOutOfBoundsException e) {
   throw new IndexOutOfBoundsException();
}

示例

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ExceptionExample{
   public static String readFile(String path){
      String data = null;
         try {
            Scanner sc = new Scanner(new File("E://test//sample.txt"));
            String input;
            StringBuffer sb = new StringBuffer();
            sb.append(sc.next());
            data = sb.toString();
         }catch (FileNotFoundException ex){
            System.out.println("Exception occurred: source method");
         throw ex;
      }
      return data;
   }
   public static void main(String args[]) {
      String path = "E://test//sample.txt";
         try {
            readFile(path);
         }catch(Exception ex) {
            System.out.println("Exception occurred: calling method");
      }
   }
}

输出

Exception occurred: source method
Exception occurred: calling method

相关文章