Java中的异常处理是一种独特的方法,可以即兴发挥Java应用程序的便利性和性能。异常如果处理不当,可能会对应用程序造成实时严重威胁。

什么是异常?

Exception-Handling-in-Java

异常是在程序的编译时或运行时可能发生的意外事件。它有足够的能力造成严重的潜在威胁,并破坏整个程序的流程。

现在您可能会想,一个错误做的事情是一样的,但它的不同之处要大得多。我们将在下一节中了解更多有关“错误”的信息。

什么是错误?

What-is-an-error-Exception-Handling-in-Java

异常会扰乱任何可运行程序的正常流程。但错误是导致程序无法执行,有时还会崩溃的原因。

现在,错误可以定义如下。

错误可以被定义为计算机程序无法恢复的状态,并且停留在不可执行模式中,或者有时从正常执行中崩溃。

为了清楚地理解异常和错误,我们现在应该学习它们之间的区别。

错误与异常

Error-vs-Exception-Exception-Handling-in-Java.

错误

异常

Library: java.lang.Error

Library: jav.lang.Exception

错误是未检查的类型

异常既有选中类型,也有未选中类型

编译器无法理解错误

编译器标识已检查的异常

错误主要在运行时遇到

只有未检查的异常才会在运行时遇到

程序本身无法从错误中恢复

当编译器自动添加“Try and Catch”块时,程序可以从异常中恢复

错误可能是由程序逻辑或运行时环境引起的

由应用程序引起的异常

既然我们对两者有了明确的区分和更好的理解,让我们继续学习Java中的异常层次结构。

异常层次结构

Exception-Hierarchy-Exception-Handling-in-Java

Java中的语法结构并不复杂。所有的错误和异常都是从名为'Throwable'的父类继承的。两个子类继承了throwable类。一个是Error类,另一个是Exception类。

现在,这两个类被更多的错误和异常进一步继承,如下图所示。

现在,我们对异常层次结构有了更好的了解,我们将简要了解异常的类型。为了获得更好的体验,让我们进入下一节,其中描述了各种类型的Java异常。

异常类型  

从技术上讲,有两种类型的错误,第三种是错误。现将这些问题介绍如下。

  • 已检查的异常

  • 未检查的异常

  • 错误

Checked Exceptions 

直接从可抛出的父类继承所有异常(但运行时异常除外)的类称为检查异常。

Example:
SQL Exception and IOException
//code 1:
//Checked exception (unresolved)
package Exceptions;
import java.io.*;
public class Checked {
public static void main(String[] args) {
FileReader file = new FileReader("C:\\Users\\besthub\\Documents\\data.txt");
BufferedReader Input = new BufferedReader(file);
for (int c = 0; c < 3; c++)
System.out.println(Input.readLine());
Input.close();
}
}

//code 2:
//Checked exception (resolved)
package Exceptions;
import java.io.*;
public class Checked {
public static void main(String[] args) throws IOException {
FileReader file = new FileReader("C:\\Users\\besthub\\Documents\\data.txt");
BufferedReader Input = new BufferedReader(file);
for (int c = 0; c < 5; c++)
System.out.println(Input.readLine());
Input.close();
}
}

未检查的异常

仅继承运行时异常的类被称为未检查异常。

Example:
ArithmeticException and NullPointerException
//code:
Unchecked Exceptions(Resolved)

package Exceptions;
public class Unchecked {
public static void main(String args[]) {
int Ary[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
System.out.println(Ary[11]);
}
}

错误

导致整个应用程序崩溃的不可恢复事件称为错误。

Example:

OutOfMemoryError and AssertionError

有了这个,我们就对Java中不同类型的线程有了详细的了解。进一步,为了更精确地澄清两种主要类型的例外,我们将了解两者之间的明显差异。

已检查的异常与未检查的异常

checked-vs-unchecked-exceptions-Exception-Handling-in-Javachecked-vs-unchecked-exceptions-Exception-Handling-in-Java

下表帮助我们了解检查异常和未检查异常之间的区别。

已检查的异常

未检查的异常

可以在编译时检查和处理

不能在编译时检查或处理

Except类的直接子类,但不继承运行时异常

Except类的直接子类,但仅继承运行时异常

编译器在编译阶段捕获这些异常

编译器无法在编译阶段识别和捕获它们

故障是可预测的故障

取消选中异常是不可预测的故障,主要由不正确的编程逻辑引起

例子:

SQL Exception

IOException

例子:

ArithmeticException

NullPointerException

这就是Java中检查异常和未检查异常之间的明显区别。更进一步,我们将学习在Java中执行异常处理过程所需的关键关键字。

Java中异常处理的关键字

以下是Java中异常处理过程中使用的主要关键字。

关键字

描述

try

关键字“try”用于指定异常块

catch

“catch”关键字用于指定解决方案

finally

“Finally”关键字具有强制可执行的代码

throw

“Throw”关键字引发异常

throws

“throws”关键字用于声明异常

讨论了这些关键字后,让我们进入Java中异常处理的核心部分。我们将学习Java中的异常处理方法。

Java中的异常处理方法

Java中有两种异常处理方法。它们如下。

  • Java中的默认异常处理

  • Java中的用户定义异常处理

Java中的异常处理

Java虚拟机处理默认异常。编译器识别异常的存在,它迅速将识别的异常打包成对象的形式。

编译器在运行时将异常对象发送到JVM。此过程称为抛出异常。

引发异常后,可能会执行许多方法来响应引发的异常。该列表称为调用堆栈。调用堆栈如下所述。

  • 抛出的异常到达调用堆栈,调用堆栈用可以处理抛出的异常的异常处理程序进行响应。

  • 如果运行时系统无法识别引发的异常的适当异常处理程序,则运行时系统将异常对象发送到默认异常处理程序。

  • 默认异常处理程序会导致异常输出,该输出会读出与异常遭遇相关的报告。

Java中的用户定义异常处理

Java中的自定义/用户定义的异常处理是通过使用异常处理关键字来管理的。它们是:

  • try

  • catch

  • throw

  • throws

  • finally

在自定义的异常处理中,用户应该在代码段的特定部分识别/预期异常。

一旦确定了异常的位置,代码块就应该包含在try和Catch块中。

在这种设置中,每当代码引发异常时,它都会由适当的Catch块处理。

关键字“throw”用于手动抛出异常。当程序抛出异常时,它由“throws”子句标识。

既然我们已经清楚了Java中的异常和异常处理过程,我们将直接处理Java中经常遇到的一些异常,并以编程的方式解决它们。

Java中的常见异常

array-out-of-bound-index-common-exceptions-Exception-Handling-in-Java.

以下是Java中异常处理过程中面临的一些常见异常。

ArrayIndexOutOfBound

当您尝试在数组位置中存储地址超过数组最大位置值的值时,会引发此异常。

Example:

//ArrayIndxOutOfBound

package Exceptions;

import java.util.Arrays;

import java.util.Scanner;

public class IndexOutOfBound {

public static void main(String args[]) {

int[] Array = {(int) 10.0,(int) 20.0,(int) 30.0,(int) 40.0,(int) 50.0};

System.out.println("The array elemens are as follows: \n");

System.out.println(Arrays.toString(Array));

Scanner scan = new Scanner(System.in);

System.out.println("Please provide the address of the required element:\n");

float numbers = scan.nextFloat();

System.out.println("Number at your selected address is "+Array[(int) numbers]);

}

}

NullPointer Exception

当您对空值执行数学运算时,会引发此异常。

Example:

//NullPointer

package Exceptions;

import java.util.Arrays;

import java.util.Scanner;

public class NullPointer {

private static String str;

public static void main(String[] args) {

str = "simplilearn";

foo(null);

bar(null);

}

static void foo(String abc) {

try {

System.out.println("First character in the string is:\n" + abc.charAt(0));

} catch (NullPointerException e) {

System.out.println("NullPointerException!");

}

}

static void bar(String abc) {

if (abc == null)

System.out.println("First character in the string is:\n " + abc.charAt(0));

else

System.out.println("NullPointerException!");

}

}

NumberFormat Exception

如果您尝试以错误的数字格式存储值,如不同的数据类型,则会引发此异常。

Example:

//NumberFormatted

package Exceptions;

public class NumFormat {

private static int num;

public static void main(String[] args) {

num = Integer.parseInt(null);

}

}

DividebyZero Exception

如果您尝试将一个数字除以零,则会引发此异常。

Example:

//Divide by zero

package Exceptions;

public class DBZ {

public static void main(String args[]) {

int n1, n2;

try {

n1 = 0;

n2 = 100 / n1;

System.out.println(n2);

} catch (ArithmeticException e) {

System.out.println("The divider cannot be zero, try a differnt number.");

} catch (Exception e) {

System.out.println("You cannot execute this program: DivideByZeroException");

}

}

}

到目前为止,我们已经在Java中处理了不同类型的异常和其他异常处理过程。在下一节中,我们将学习在Java中进行异常处理时需要遵循的最佳实践。

Java中异常处理的最佳实践

best-practices-Exception-Handling-in-Java

在我们了解了Java中经常遇到的异常之后,我们现在将了解在Java中实现异常处理过程时要遵循的最佳实践。

  • 保守地使用异常

  • 自定义异常

  • 异常记录

  • 早早抛出并失败

  • 关闭资源

保守地使用异常

use-exceptions-coversatively-best-practices-Exception-Handling-in-Java

Exceptions have proven that they can be costly if used recklessly. We should use Boolean values to indicate the successful implementation of smaller operations.

自定义异常

customized-exceptions-Exception-Handling-in-Java

这是一种在设计时定制异常而不是在旅途中计划它们的出色实践。

异常记录

exception-logging-Exception-Handling-in-Java

当用户理解为什么会弹出一个特定的异常时,跟踪异常就变得很方便了。

早早抛出并失败

early-throw-and-fail-Exception-Handling-in-Java

预计将尽早引发异常,并应以相同的速度解决该异常。

关闭资源

close-resources-Exception-Handling-in-Java

因为异常会停止整个程序,所以我们必须确保关闭系统资源以节省资源。

接下来的步骤

至此,我们已经结束了“Java中的异常处理”这篇文章。我们希望您喜欢学习Java中的接口的基本概念。

异常处理只是使用Java进行软件开发的关键概念之一。