Java中的异常处理教程

95 阅读5分钟

Java中的异常处理

简介

在我们的程序中,错误随时都可能发生。然而,重要的是我们如何捕捉和纠正它们,以保持我们应用程序的正常运行。

在这篇文章中,我们将使用Java,因为它是一种广泛使用的面向对象的编程语言。Java有一个强大的错误和异常处理系统。

Java中的异常处理是解决运行时错误的最有效方法之一。其中一些错误有:ClassNotFoundException,IOException,SQLException, 和RemoteException, 等等。

有效的异常处理使你的程序更健壮,更容易调试。

本文将介绍Java中异常处理的基本原理。

前提条件

要学习这篇文章,读者应该。

  • 安装了[IntelliJ]IDE。
  • 具备使用Java编程语言进行开发的基本知识。

什么是异常处理?

异常是指[在程序执行过程中出现的问题]。

Exception handling 是用来处理[Java运行时错误的]机制。

异常的发生有几个原因,如用户[的数据无效或需要访问的文件找不到]。

在这种情况下,可能会发生系统故障;因此处理它是至关重要的。

错误和异常的比较

  • 错误是无法恢复的,而异常是可以恢复的。
  • 异常会被检查或不被检查,而错误则总是不被检查。
  • 错误发生在运行时,而异常可能发生在编译或执行过程中。
  • 异常是由程序触发的,而错误是由程序的执行环境导致的。

异常的层次结构

所有的异常和错误类型都是[throwable类的子类,它是层次结构的基类]。

一个分支是以异常为首的,这个类用于用户程序可以处理的特殊情况。例如,NullPointerExceptionRuntimeException

Java运行时系统使用其他分支错误来识别[与运行时环境有关的错误]。例如,虚拟机错误或堆栈溢出错误。

现在,一个异常是如何被Java虚拟机处理的?

当一个方法抛出一个异常时,该方法会创建一个叫做异常对象的对象。这个对象提供给运行时框架。

这个异常对象存储了异常的属性和程序当前发生异常的位置。同时,它还创建了异常对象并将其提供给运行时系统进行异常处理。

使用try-catch-finally 方法处理这些异常。

这就是JVM内部处理异常的方式。

异常的类型

有两种类型的异常。

  • 已检查的
  • 未检查的
检查过的异常

这些是在编译时发生的异常,由编译器检查。

未检查的异常

这些是在执行过程中发生的异常。它们是Java中内置的异常。

异常处理关键字/方法

正如我们前面提到的,异常给出了将程序的控制权从一个部分转移到另一个部分的方法。Java用来处理异常的三个关键字是。

  • try - 它规定了代码的包围位置。它必须伴随着 或 。catch finally
  • catch - 它处理所发生的异常。它必须出现在 块之后。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的异常处理。