Java中的异常处理
简介
在我们的程序中,错误随时都可能发生。然而,重要的是我们如何捕捉和纠正它们,以保持我们应用程序的正常运行。
在这篇文章中,我们将使用Java,因为它是一种广泛使用的面向对象的编程语言。Java有一个强大的错误和异常处理系统。
Java中的异常处理是解决运行时错误的最有效方法之一。其中一些错误有:ClassNotFoundException,IOException,SQLException, 和RemoteException, 等等。
有效的异常处理使你的程序更健壮,更容易调试。
本文将介绍Java中异常处理的基本原理。
前提条件
要学习这篇文章,读者应该。
- 安装了[IntelliJ]IDE。
- 具备使用Java编程语言进行开发的基本知识。
什么是异常处理?
异常是指[在程序执行过程中出现的问题]。
Exception handling 是用来处理[Java运行时错误的]机制。
异常的发生有几个原因,如用户[的数据无效或需要访问的文件找不到]。
在这种情况下,可能会发生系统故障;因此处理它是至关重要的。
错误和异常的比较
- 错误是无法恢复的,而异常是可以恢复的。
- 异常会被检查或不被检查,而错误则总是不被检查。
- 错误发生在运行时,而异常可能发生在编译或执行过程中。
- 异常是由程序触发的,而错误是由程序的执行环境导致的。
异常的层次结构
所有的异常和错误类型都是[throwable类的子类,它是层次结构的基类]。
一个分支是以异常为首的,这个类用于用户程序可以处理的特殊情况。例如,NullPointerException 和RuntimeException 。
Java运行时系统使用其他分支错误来识别[与运行时环境有关的错误]。例如,虚拟机错误或堆栈溢出错误。
现在,一个异常是如何被Java虚拟机处理的?
当一个方法抛出一个异常时,该方法会创建一个叫做异常对象的对象。这个对象提供给运行时框架。
这个异常对象存储了异常的属性和程序当前发生异常的位置。同时,它还创建了异常对象并将其提供给运行时系统进行异常处理。
使用try-catch-finally 方法处理这些异常。
这就是JVM内部处理异常的方式。
异常的类型
有两种类型的异常。
- 已检查的
- 未检查的
检查过的异常
这些是在编译时发生的异常,由编译器检查。
未检查的异常
这些是在执行过程中发生的异常。它们是Java中内置的异常。
异常处理关键字/方法
正如我们前面提到的,异常给出了将程序的控制权从一个部分转移到另一个部分的方法。Java用来处理异常的三个关键字是。
try- 它规定了代码的包围位置。它必须伴随着 或 。catchfinallycatch- 它处理所发生的异常。它必须出现在 块之后。try
语法。
try{
// Code that could throw an exception}
catch(Exception x){
// The rest of the code}
}
finally- 这个块用来执行我们程序的必要代码。无论异常是否被抛出,它都会被执行。
语法:该块用于执行我们程序的必要代码,无论是否抛出异常。
try{
//program
}
catch(Exception x){
// catch block code
}
finally{
// finally block executes
}
throw- 它抛出了一个异常。throws- 它声明了异常。
让我们看一下一些例子,以便更好地理解这些内容。
例1:使用try-catch块处理异常
class Main {
public static void main(String[] args) {
try {
// code that generates exception
int divideByZero = 8 / 0;
System.out.println("Program in the block try");
}
catch (ArithmeticException x) {
System.out.println("ArithmeticException => " + x.getMessage());
}
}
}
输出。
ArithmeticException=> / by zero
上面的程序产生了一个异常。我们需要用8除以0。
我们将语句8 / 0 放在try 块中,用于处理异常。每当有异常抛出时,try 块内的其他代码都会被跳过。之后,catch 块被执行。
如果try 块中的语句都没有抛出异常,那么catch块就被绕过了。
例2:使用finally块处理异常
class Main {
public static void main(String[] args) {
try {
// code that throws an exception
int divideByZero = 8 / 0;
}
catch (ArithmeticException e) {
System.out.println("ArithmeticException = " + e.getMessage());
}
finally {
System.out.println("It is the finally block");
}
}
}
输出。
ArithmeticException= / by zero
It is the finally block
在上面的程序中,我们在try 块内用8除以0。该代码抛出了一个ArithmeticException 。catch块捕获了这个异常,然后执行final块。
注意:使用finally块是一个很好的习惯。这是由于它能够包含重要的清理代码。
例3:使用throw关键字处理异常
当一个异常被抛出时,程序流从try 转到catch 块。
class Main {
public static void divideByZero() {
// throw an exception
throw new ArithmeticException("Dividing by 0");
}
public static void main(String[] args) {
divideByZero();
}
}
输出。
Exception in thread “main” java.lang.ArithmeticException: Trying to divide by 0
at Main.divideByZero(Main.java:5)
at Main.main(Main.java:9)
使用throw 关键字,我们可以看到上面的程序是如何抛出ArithmeticException 的。
例四:使用throws关键字处理异常
throws 关键字可以声明在一个函数中可能发生的各种类型的异常。我们在方法的声明中使用它。
import java.io.*;
class Main {
// specifying the exception's type
public static void findFile() throws IOException {
// code that throws IOException
File newFile = new File("test.txt");
FileInputStream stream = new FileInputStream(newFile);
}
public static void main(String[] args) {
try {
findFile();
}
catch (IOException e) {
System.out.println(e);
}
}
}
输出。
java.io.FileNotFoundException: test.txt (The system is unable to locate the given file.)
当我们运行上面的程序时,文件test.txt 并不存在。结果,FileInputStream 类抛出了一个FileNotFoundException ,它扩展了IOException 类。
当使用findFile() 方法时,可以抛出一个IOException 。
main() 方法调用该方法,该方法处理任何抛出的异常。
当一个方法不处理异常时,throws 子句必须定义可能发生的异常类型。
总结
本文通过几个例子介绍了Java中的异常处理。
知道如何处理异常是一个开发人员应该具备的基本技能。
希望这篇文章能帮助你开始学习Java的异常处理。