Java教程-Java中的异常处理

Java中的异常处理
Java中的异常处理是一种强大的机制,用于处理运行时错误,以便可以保持应用程序的正常流程。
在本教程中,我们将学习Java异常,它的类型以及已检查和未检查异常之间的区别。
什么是Java中的异常?
词典意义上:异常是一种异常情况。
在Java中,异常是中断程序正常流程的事件。它是在运行时抛出的对象。
什么是异常处理?
异常处理是一种处理运行时错误的机制,例如ClassNotFoundException、IOException、SQLException、RemoteException等。
异常处理的优点
异常处理的核心优点是保持应用程序的正常流程。异常通常会中断应用程序的正常流程,这就是为什么我们需要处理异常。让我们考虑一种情况:
statement 1;
statement 2;
statement 3;
statement 4;
statement 5;//发生异常
statement 6;
statement 7;
statement 8;
statement 9;
statement 10;
假设在Java程序中有10条语句,并且在第5条语句处发生了异常;其余的代码将不会被执行,即语句6到10将不会被执行。然而,当我们进行异常处理时,其余的语句将会被执行。这就是为什么我们在Java中使用异常处理的原因。
Java异常类的层次结构
java.lang.Throwable类是Java异常层次结构的根类,它被两个子类Exception和Error继承。Java异常类的层次结构如下所示:
Java异常的类型
主要有两种类型的异常:已检查异常和未检查异常。错误被视为未检查异常。然而,根据Oracle的说法,有三种类型的异常,即:
- 已检查异常
- 未检查异常
- 错误
已检查异常和未检查异常之间的区别
已检查异常
直接继承Throwable类的类,除了RuntimeException和Error之外的类,被称为已检查异常。例如,IOException、SQLException等。已检查异常在编译时进行检查。
未检查异常
继承RuntimeException的类被称为未检查异常。例如,ArithmeticException、NullPointerException、ArrayIndexOutOfBoundsException等。未检查异常在编译时不进行检查,但在运行时进行检查。
错误
错误是不可恢复的。一些错误的示例包括OutOfMemoryError、VirtualMachineError、AssertionError等。
Java异常关键字
Java提供了五个关键字用于处理异常。下表描述了每个关键字。
Keyword | Description |
---|---|
try | “try”关键字用于指定我们应该放置异常代码的块。这意味着我们不能单独使用 try 块。try 块必须跟在 catch 或 finally 之后。 |
catch | “catch”块用于处理异常。它前面必须有 try 块,这意味着我们不能单独使用 catch 块。后面可以跟着 finally 块。 |
finally | “finally”块用于执行程序的必要代码。无论是否处理异常都会执行。 |
throw | “throw”关键字用于抛出异常。 |
throws | “throws”关键字用于声明异常。它指定方法中可能会发生异常。它不会抛出异常。它总是与方法签名一起使用。 |
Java异常处理示例
让我们看一个Java异常处理的示例,其中我们使用try-catch语句来处理异常。
JavaExceptionExample.java
public class JavaExceptionExample{
public static void main(String args[]){
try{
//可能引发异常的代码
int data=100/0;
}catch(ArithmeticException e){System.out.println(e);}
//程序的其余代码
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;//算术异常
2.发生NullPointerException的场景
如果我们的变量中有一个空值,在该变量上执行任何操作都会引发NullPointerException。
String s=null;
System.out.println(s.length());//空指针异常
3.发生NumberFormatException的场景
如果变量或数字的格式不匹配,可能会导致NumberFormatException。假设我们有一个包含字符的字符串变量;将此变量转换为数字将引发NumberFormatException。
String s="abc";
int i=Integer.parseInt(s);//数字格式异常
4.发生ArrayIndexOutOfBoundsException的场景
当数组超过其大小时,会发生ArrayIndexOutOfBoundsException。还可能有其他原因导致ArrayIndexOutOfBoundsException。请考虑以下语句。
int a[]=new int[5];
a[10]=50; //ArrayIndexOutOfBoundsException异常