📜  Java中的异常处理

📅  最后修改于: 2020-09-26 06:55:04             🧑  作者: Mango

Java中的异常处理

Java中的异常处理是处理运行时错误的强大机制之一,因此可以维护应用程序的正常流程。

在此页面中,我们将学习Java异常,其类型以及已检查和未检查的异常之间的区别。

Java中的异常是什么

词典的含义:异常是一种异常情况。

在Java中,异常是中断程序正常流程的事件。它是在运行时引发的对象。

什么是异常处理

异常处理是一种处理运行时错误的机制,例如ClassNotFoundException,IOException,SQLException,RemoteException等。

异常处理的优势

异常处理的核心优势是保持应用程序的正常运行。异常通常会中断应用程序的正常流程,这就是我们使用异常处理的原因。让我们来一个场景:

statement 1;
statement 2;
statement 3;
statement 4;
statement 5;//exception occurs
statement 6;
statement 7;
statement 8;
statement 9;
statement 10;

假设您的程序中有10条语句,并且在语句5处发生异常,则其余代码将不会执行,即语句6至10将不会执行。如果我们执行异常处理,则语句的其余部分将被执行。这就是为什么我们在Java中使用异常处理。

Java异常类的层次结构

java.lang.Throwable类是Java异常层次结构的根类,它由两个子类继承:异常和错误。 Java异常类的层次结构如下:

Java异常类型

主要有两种类型的异常:选中和未选中。在这里,错误被视为未检查的异常。根据Oracle,有三种类型的异常:

  • 检查异常
  • 未经检查的异常
  • 错误

已检查和未检查的异常之间的区别

1)检查异常

除了RuntimeException和Error外,直接继承Throwable类的类称为检查异常,例如IOException,SQLException等。检查异常在编译时检查。

2)未经检查的异常

继承RuntimeException的类称为未检查的异常,例如ArithmeticException,NullPointerException,ArrayIndexOutOfBoundsException等。未检查的异常在编译时不检查,但在运行时检查。

3)错误

错误是无法恢复的,例如OutOfMemoryError,VirtualMachineError,AssertionError等。

Java异常关键字

Java中有5个关键字用于处理异常。

Keyword Description
try The “try” keyword is used to specify a block where we should place exception code. The try block must be followed by either catch or finally. It means, we can’t use try block alone.
catch The “catch” block is used to handle the exception. It must be preceded by try block which means we can’t use catch block alone. It can be followed by finally block later.
finally The “finally” block is used to execute the important code of the program. It is executed whether an exception is handled or not.
throw The “throw” keyword is used to throw an exception.
throws The “throws” keyword is used to declare exceptions. It doesn’t throw an exception. It specifies that there may occur an exception in the method. It is always used with method signature.

Java异常处理示例

让我们来看一个Java异常处理的示例,其中我们使用try-catch语句来处理异常。

public class JavaExceptionExample{
  public static void main(String args[]){
   try{
      //code that may raise exception
      int data=100/0;
   }catch(ArithmeticException e){System.out.println(e);}
   //rest code of the program 
   System.out.println("rest of the code...");
  }
}

输出:

Exception in thread main java.lang.ArithmeticException:/ by zero
rest of the code...

在上面的示例中,100/0引发ArithmeticException,该异常由try-catch块处理。

Java异常的常见方案

在某些情况下,可能会发生未经检查的异常。它们如下:

1)发生ArithmeticException的情况

如果将任何数字除以零,则会发生ArithmeticException。

int a=50/0;//ArithmeticException

2)发生NullPointerException的情况

如果我们在任何变量中都有一个null值,则对该变量执行任何操作都会引发NullPointerException。

String s=null;
System.out.println(s.length());//NullPointerException

3)发生NumberFormatException的情况

任何值的格式错误都可能发生NumberFormatException。假设我有一个包含字符的字符串变量,将此变量转换为数字将发生NumberFormatException。

String s="abc";
int i=Integer.parseInt(s);//NumberFormatException

4)发生ArrayIndexOutOfBoundsException的情况

如果在错误的索引中插入任何值,则将导致ArrayIndexOutOfBoundsException,如下所示:

int a[]=new int[5];
a[10]=50; //ArrayIndexOutOfBoundsException

Java异常索引

  • Java Try-Catch块
  • Java多重捕获块
  • Java嵌套尝试
  • Java的最终块
  • Java投掷关键字
  • Java异常传播
  • Java抛出关键字
  • Java投掷vs投掷
  • Java Final vs Final vs Finalize
  • 具有方法覆盖的Java异常处理
  • Java自定义异常