Java中的异常处理[附例子]
已发表: 2020-11-12异常是程序中不需要的和意外的事件,程序员从不想要但必须多次处理它。 好的一面是,使用面向对象的语言 Java 可以通过称为“Java 中的异常处理”的概念来减轻这些不良事件。 它不会修复异常,但提供了另一种处理方法。
发生异常的原因有很多,包括输入不正确的数据、硬件故障、连接失败、服务器宕机等。因此,异常处理在学习 Java 的过程中一直很重要,因为它有助于确保正常意外事件发生时的程序流程。 忽略异常可能会导致整个软件崩溃,并可能导致数据丢失。
现在我们对异常和异常处理有了一个概念,让我们深入研究它,并了解 Java 如何帮助处理异常。
阅读:异常处理面试问题
目录
什么是异常处理?
开发人员可以预测一段代码在运行时可能引发的异常。 许多学习者模糊不清的最重要的事情之一是所有异常都发生在运行时而不是编译时。 Java 只能在运行时处理异常。 Java 程序中使用某些关键字来创建异常处理程序块。
java.lang.Exception是所有异常类的父类。 Exception类是内置Throwable类的子类,后者是Object类的子类。 除了 Exception,Throwable 还有另一个类,即 Error,它是程序执行过程中的异常情况,Java 程序无法处理,这是 Error 和 Exceptions 之间的主要区别。

如上图所示,Java中的Exceptions主要有两类。 在下一节中,我们将详细了解 Java 中的异常类型。
Java 异常
异常的根本原因是程序员或物理资源由于某些原因而失败的原因。 基于此,Java 中的异常主要有两类,具体如下:
- 检查异常
- 未经检查的异常
1.检查异常
检查的异常被称为“编译时异常”,因为它们在编译期间由编译器检查以监视异常是否由程序员处理。 然后系统显示编译错误。
这些异常的一些示例是IOException 、 阅读:面向初学者的 Java 项目构想
2. 未经检查的异常
未经检查的异常被称为“运行时异常”,因为它们发生在程序运行时。 未经检查的异常通常在编译期间被忽略并且不被检查。
这些异常的示例可能是程序中的错误,例如逻辑错误,或者使用了不受程序员控制并需要系统管理员纠正的错误 API。
已检查与未检查的异常
区分点 | 检查异常未经检查的异常处理时间 | Checked Exceptions 在编译时被检查和处理。 | 未检查的异常在编译时不检查。 |
异常识别 | 如果方法抛出检查异常,程序会给出编译错误。 | 程序编译得很好,因为编译器无法检查异常。 | |
遗产 | 它们不继承 RuntimeException 类。 | 它们是 RuntimeException 类的子类。 | |
开发者的角色 | 可由开发人员处理。 | 开发人员无法处理。 |
了解异常是处理它们之前的主要步骤。
Java 如何帮助处理异常?
现在我们知道 Java 中有两种类型的异常,即已检查和未检查。 如果一个方法抛出一个检查的异常,它应该用try-catch 块来处理,或者应该声明' throws'关键字以避免程序中的编译错误。
已检查异常的示例:
这是一个读取名为“Java”的文件的程序。 有三个地方会抛出已检查的异常:
- FileInputStream:用于指定文件路径和名称 throw FileNotFoundException 。
- read() 方法:读取文件内容抛出IOException ;
iii. close() 方法:关闭文件输入流会抛出IOException 。
导入java.io.*;
类示例{
公共静态无效主要(字符串参数[])
{
FileInputStream fis = null ;
/*构造函数FileInputStream(文件文件名)
* 抛出一个检查异常 FileNotFoundException */
fis = new FileInputStream ( “B:/java.txt” );
诠释k;
/* FileInputStream 类的方法 read() throws
* 已检查异常:IOException
*/
而(( k = fis.read() ) != – 1 )
{
系统。 出来。 打印((字符)k);
}
/*close()方法关闭文件输入流
* 抛出 IOException*/
fis.close();
}
}
上述程序的输出:
在线程“main” java.lang中发现异常。 错误:未解决的编译问题:
发现未处理的异常FileNotFoundException
发现未处理的异常IOException
发现未处理的异常IOException
此编译错误的原因:未声明或处理异常。
必读: Java GitHub 项目
异常处理方法
有两种方法可以处理异常,如下所述:
方法 1:声明 'throws' 异常关键字
在上面的程序中,所有三个检查异常都在 main() 方法中。 因此,避免编译错误的一种方法是使用“throws”关键字在方法中声明异常。 由于 IOException 是 FileNotFoundException 的父类,它也将涵盖这一点。
使用 throws 关键字更新程序:
导入java.io.*;
类示例{
公共静态void main( String args[])抛出IOException
{
FileInputStream fis = null ;
fis = new FileInputStream ( “B:/java.txt” );
诠释k;
而(( k = fis.read() ) != – 1 )
{
系统。 出来。 打印((字符)k);
}
fis.close();
}
}
输出:
在屏幕上显示文件的内容。
方法 2:使用 try-catch 块处理异常。
这是对上述一种更高级的方法,也是最佳异常处理实践之一。 包含 try-catch 块的修改后的程序代码如下:

导入java.io.*;
类示例{
公共静态无效主要(字符串参数[])
{
FileInputStream fis = null ;
试试{
fis = new FileInputStream ( “B:/java.txt” );
}捕捉( FileNotFoundException fnfe){
系统。 out .println( "文件不是" +
“出现在指定的路径” );
}
诠释k;
试试{
而(( k = fis.read() ) != – 1 )
{
系统。 出来。 打印((字符)k);
}
fis.close();
}捕捉( IOException ioe){
系统。 out .println( “I/O错误” +ioe);
}
}
}
输出:
此代码最终将显示文件内容。
未经检查的异常示例
Unchecked 异常在编译时不会被检查。 如果没有声明或处理程序,程序不会给出编译错误,并且可以正常运行。 开发人员的工作是提前预测可能导致此类异常的情况并进行处理。 所有未经检查的异常都是RuntimeException类的子类。
类示例{
公共静态无效主要(字符串参数[])
{
整数1= 10 ;
整数2 = 0 ;
/*将任意数除以0
* 将抛出算术异常
*/
int res=num1/num2;
系统。 输出.println(res);
}
}
该代码将使用此代码成功编译,但在运行时,它会抛出ArithmeticException ,因为在编译时未检查未检查的异常。 让我们看另一个例子。
类示例{
公共静态无效主要(字符串参数[])
{
int arr[] ={ 1 , 2 , 3 , 4 , 5 };
/* 数组有 5 个元素,但我们想要
* 显示第 8 个元素值。 它会抛出
* ArrayIndexOutOfBoundsException
*/
系统。 输出.println(arr[ 7 ]);
}
}
此代码也将成功编译,因为ArrayIndexOutOfBoundsException是未经检查的异常。
在这里,为了处理未经检查的异常,应该向用户显示他想要显示的异常消息,但它不存在于数组中。
使用 try-catch 块处理上述代码异常
类示例{
公共静态无效主要(字符串参数[]){
试试{
int arr[] ={ 1 , 2 , 3 , 4 , 5 };
系统。 输出.println(arr[ 7 ]);
}
捕捉( ArrayIndexOutOfBoundsException e){
系统。 out .println( "指定的索引不存在" +
“在阵列中。” );
}
}
}
输出:
指定的索引在数组中不存在。
注意:一个 try 块内可以有多个 catch 块来处理不同的异常。
方法3 :使用'finally'关键字
有时即使发生异常,也需要执行代码。 这是使用final关键字的地方。 这是带有“finally”关键字的典型代码。
公共 int getPlayerScore(字符串播放器文件)
抛出 FileNotFoundException {
扫描仪内容 = null;
尝试 {
内容=新扫描仪(新文件(playerFile));
return Integer.parseInt(contents.nextLine());
}最后{
如果(内容!= null ){
内容.close();
}
}
}
在这里,最后一个块表示我们希望 Java 在尝试读取文件时运行的代码。
即使抛出FileNotFoundException ,Java 也会调用finally的内容。
我们可以通过修改以下代码来处理异常:
公共 int PlayerScore(字符串 playerRuns){
扫描仪内容;
尝试 {
内容=新扫描仪(新文件(playerRuns));
return Integer.parseInt(contents.nextLine());
} 捕捉(FileNotFoundException noFile){
logger.warn(“找不到文件。”);
返回0;
} 最后 {
尝试 {
如果(内容!= null){
内容.close();
}
} 捕捉(IOException ioexc){
logger.error(“无法关闭阅读器。”, ioexc);
}
}

}
结论
通过本文,我们尝试了解Java 中错误和异常以及异常处理的基础知识。 我们希望本指南能让您更好地了解 Java 提供的这一独特功能,并且您现在可以更好地处理异常并从中恢复。 结论
Java 提供了处理从特定异常到通用异常的方法。 事先无法轻易预测的异常称为未处理异常。 捕获所有异常可以让开发团队了解代码的质量以及可以快速修复的错误的根本原因。
如果您有兴趣了解有关 Java、全栈开发的更多信息,请查看 upGrad 和 IIIT-B 的全栈软件开发 PG 文凭。 它是为专业人士精心策划的,并确保 360 度的职业支持,并包括要开展的现场项目。 在课程结束时,您将能够设计和构建 Swiggy、IMDB 等应用程序。
这听起来是不是很令人兴奋!-