前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >已检查和未检查异常详解-Java快速入门教程

已检查和未检查异常详解-Java快速入门教程

作者头像
jack.yang
发布于 2025-04-05 08:26:33
发布于 2025-04-05 08:26:33
8500
代码可运行
举报
运行总次数:0
代码可运行

前面的教程中,我们已经熟悉了 java 中有两种类型的异常:第一种是预定义的异常,第二种是用户定义的异常。

预定义的异常是那些已由 java 系统定义的异常。

所有预定义的异常进一步分为两组:

  1. 已检查的异常
  2. 未检查的异常

在 Java 中已检查异常


已检查异常是那些由 java 编译器本身在编译时检查的异常,不在运行时异常类层次结构下。

如果某个方法在程序中引发已检查的异常,则该方法必须处理该异常或将其传递给调用方方法。

我们必须通过使用 try 和 catch 块或在方法声明中使用 throws 子句来处理检查的异常。如果处理不当,它将给出编译时错误。

大多数人都感到困惑,并说检查异常发生在编译时,这是错误的。所有异常始终仅在运行时发生,但有些异常在编译时检测到,而另一些异常在运行时检测到。

Java 编译器在编译时检查的异常在 Java 中称为已检查异常。除运行时异常、错误及其子类之外的所有异常都是检查异常。

注意:编译时错误不是例外。它们会出现错误。在 Java 中,只有运行时错误属于异常。

Java 中已检查的异常列表


下面列出了一些重要的检查异常:

  • ClassNotFoundException
  • InterruptedException 中断异常
  • InstantiationException 实例化异常
  • IOException
  • SQLException
  • IllegalAccessException非法访问异常
  • FileNotFoundException, etc

让我们举一个示例程序,我们将暂停主线程指定的时间,看看程序执行时会发生什么。

程序代码 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package exceptionHandling; 
public class CheckedExceptionEx1 
{ 
public static void main(String[] args) 
{ 
 System.out.println("Hello Java"); 
 Thread.sleep(1000); // Here, main thread paused for a specified amount of time. // Compilation error. 
 } 
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Output: 
      Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
      Unhandled exception type InterruptedException

解释:

在上面的代码中,有一个编译错误:“未处理的异常类型中断异常”。这是因为 thread.sleep();方法抛出一个 InterruptedException,该异常尚未由 try-catch 或 throws 子句处理。

由于 InterruptedException 是一个经过检查的异常,由编译器本身检查以在运行时顺利执行程序,因此,我们在编译时出现编译错误-InterruptedException 异常。

在 Java 中处理已检查异常


为了避免这个编译错误,我们必须使用 try-catch 块或 throws 子句来处理这个检查异常。让我们处理它,看看输出是什么?

程序代码 2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class CheckedExceptionEx1 
{ 
public static void main(String[] args) 
{ 
   System.out.println("Hello Java"); 
// Apply the try-catch block to handle checked exception.
   try 
   { 
     Thread.sleep(1000); 
   } 
   catch(InterruptedException e) 
   { 
     e.printStackTrace(); 
    } 
 } 
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Output: 
       Hello Java

正如您在上面的代码中看到的,我们已经使用 try-catch 块处理了检查异常。您也可以使用 throws 子句代替 try-catch 块。


让我们举一个示例程序,其中我们将使用 throws 子句处理 Java 检查异常。

程序代码 3:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package exceptionHandling; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
public class CheckedExceptionEx 
{ 
public static void main(String[] args) throws FileNotFoundException 
{ 
 File file = new File("not_existing_file.txt"); 
 FileInputStream stream = new FileInputStream(file); 
 } 
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Output: 
       Exception in thread "main" java.io.FileNotFoundException: not_existing_file.txt 
       (The system cannot find the file specified)

解释:

在上面的代码中,没有编译错误,因为我们使用 throws 子句处理了检查异常。但是,在运行时,FileNotFoundException异常发生,因为我们正在尝试访问不存在的文件。

Java 中未经检查的异常(运行时异常)


Java 中未经检查的异常是由 JVM 而不是 Java 编译器检查的异常。它们发生在程序运行时。

运行时异常类下的所有异常在 Java 中称为未检查异常或运行时异常。

我们可以编写一个 Java 程序并对其进行编译。但是在运行程序之前,我们无法看到未经检查的异常和错误的影响。

这是因为 Java 编译器允许我们编写 Java 程序而无需处理未经检查的异常和错误。

Java 编译器不会在编译时检查运行时异常,无论程序员是否处理它们。

如果方法中发生运行时异常并且程序员不处理它,那么 JVM 将终止程序而不执行其余代码。

Java 中未经检查的异常列表


下面给出了运行时异常的一些重要示例:

  • ArithmeticException 算术异常
  • ClassCastException
  • NullPointerException 空指针异常
  • ArrayIndexOutOfBoundsException
  • NegativeArraySizeException
  • ArrayStoreException
  • IllegalThreadStateException
  • SecurityException 安全异常

让我们举一个基于 Java 运行时异常的示例程序。

程序代码 4:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class UncheckedExceptionEx1 { 
public static void main(String[ ] args) 
{ 
 int x = 10; 
 int y = 0; 
 int z = x/y; // runtime exception.
 System.out.println(z); 
 } 
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Output: 
   Exception in thread "main" java.lang.ArithmeticException: / by zero 
   at exceptionHandling.UncheckedExceptionEx1.main(UncheckedExceptionEx1.java:9)

你会注意到上面的代码已经成功编译,但是当你去执行它时,它会抛出ArithmeticException。这表明编译期间不会发生运行时异常。

在 Java 中处理运行时异常


为了避免这个运行时错误,我们必须使用 try-catch 块或 throws 子句来处理这个未经检查的异常。让我们处理它,看看输出是什么?

程序代码 5:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class HandleRuntimeException {
public static void main(String[] args) 
{
  int x = 10; 
  int y = 0; 
// Apply try-catch block to handle runtime exception.
  try {
    int z = x/y; // runtime exception.
    System.out.println(z);
  } catch(ArithmeticException ae) {
       System.out.println("A number cannot be divided by zero");
    }
  }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Output:
      A number cannot be divided by zero

在此示例中,我们使用 try-catch 块处理运行时异常,并在控制台上生成用户友好消息。我们还可以使用 throws 子句代替 try-catch 块来处理运行时异常。


让我们再看一个基于未经检查的异常的示例程序。

程序代码 6:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class UncheckedExceptionEx2 { 
public static void main(String[] args) 
{ 
   int x[ ] = {1, 2, 3, 4}; 
/* Here, an array contains only 4 elements, but we will try to * display the value of 6th element. 
   It should throw * ArrayIndexOutOfBoundsException */ 
   System.out.println(x[6]); 
 } 
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Output: 
      Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6

解释:

上面的代码也可以成功编译,但在运行时,我们将得到 ArrayIndexOutOfBoundsException uncheck 异常。当从索引之外访问数组元素时,将引发此异常。

我们可以通过使用 try-catch 块来处理上述代码中发现的异常。使用 try-catch 块,我们可以生成用户友好的消息,以便我们能够纠正此问题。让我们来处理它。

程序代码 7:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class UncheckedExceptionEx2 { 
public static void main(String[] args) 
{ 
 try 
 { 
   int x[ ] = {1, 2, 3, 4}; 
   System.out.println(x[6]); 
 } 
 catch(ArrayIndexOutOfBoundsException e)
 { 
   System.out.println("Specified index does not exist. " + "Please correct the error."); 
  } 
 }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Output: 
       Specified index does not exist. Please, correct the error.

Java 中已检查和未检查异常之间的区别


Java 中的已检查异常和未检查异常之间存在许多重要差异。它们如下:

1. 直接继承 Throwable 类(运行时异常和错误除外)的类称为检查异常,而直接继承运行时异常的类称为未检查异常。

2. 选中的异常在编译时检查和处理,而未检查的异常在编译时不检查和处理。它们在运行时进行检查。

3. 检查异常的示例包括 IOException、SQLException、ClassNotFoundException 等,而未经检查的异常示例包括 ArithmeticException、ClassCastException、NullPointerException、IllegalArgumentException 等。

4. 当方法中发生已检查的异常时,该方法必须捕获异常或将异常传递给其调用方方法。但是在未经检查的异常的情况下,Java 编译器不会强制捕获异常或在 throws 子句中声明它。

5. java 中的选中异常扩展了 Exception 类,而未检查的异常扩展了 RuntimeException 类。

6. 当故障率可能更高时,会发生检查异常。而未经检查的异常发生,主要是由于编程错误/错误。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-01-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Java】异常处理指南
异常种类繁多,为了对不同异常或者错误进行很好的分类管理,Java内部维护了一个异常的体系结构:
IsLand1314
2024/10/15
2170
【Java】异常处理指南
深入理解java异常处理机制
 1. 引子        try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解。不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单、听话。不信?那你看看下面的代码,“猜猜”它执行后的结果会是什么?不要往后看答案、也不许执行代码看真正答案哦。如果你的答案是正确,那么这篇文章你就不用浪费时间看啦。 <span style="background-color: rgb(255, 255, 255);">package T
大闲人柴毛毛
2018/03/09
9640
深入理解java异常处理机制
Java一分钟之——异常分类:检查异常与运行时异常
在Java编程中,异常处理是确保程序健壮性的重要手段。Java异常分为两大类:检查异常(Checked Exceptions)和运行时异常(Unchecked Exceptions)。理解这两者的区别对于编写稳定、可维护的代码至关重要。本文将探讨这两类异常的基本概念、常见问题、易错点及避免策略,并通过代码示例加以说明。
Jimaks
2024/05/28
5360
Java一分钟之——异常分类:检查异常与运行时异常
深入理解 java 异常处理机制
原文 https://blog.csdn.net/hguisu/article/details/6155636
猿芯
2021/05/27
6270
深入理解 java 异常处理机制
Java异常Exception详解
将可能出现异常的代码块选中->快捷键 ctrl + alt + t -> 选中 try-catch
timerring
2023/04/21
5620
Java异常Exception详解
Java:详解Java中的异常(Error与Exception)[通俗易懂]
异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。
全栈程序员站长
2022/09/08
2.5K0
Java:详解Java中的异常(Error与Exception)[通俗易懂]
JavaSE(十一)之异常处理详解
一、异常概述   在我们日常生活中,有时会出现各种各样的异常,例如:职工小王开车去上班,在正常情况下,小王会准时到达单位。但是天有不测风云,在小王去上班时,可能会遇到一些异常情况,比如小王的车子出了故障,小王只能改为步行.      异常指程序运行中出现的不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。      异常发生在程序运行期间,它影响了正常的程序执行流程。   比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error;如果你用System.out.pr
用户1195962
2018/01/18
1.3K0
JavaSE(十一)之异常处理详解
认识JAVA中的异常
1 异常的概念:在 Java 中,将程序执行过程中发生的 不正常行为 称为异常,
用户11305962
2024/10/09
1220
认识JAVA中的异常
Java Exception
异常指不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程。Java通 过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件。当条件生成时,错误将引发异常。 Java异常类层次结构图:
conanma
2021/12/06
8590
异常(Java)
1. Throwable : 是异常体系的顶层类,其派生出两个重要的子类 , Error 和 Exception
用户10921393
2024/01/23
2030
Java 异常-Exception
Java语言中,将程序执行中发生的不正常情况称为“异常”。(开发过程中的语法错误和逻辑错误不是异常)
用户9615083
2022/12/25
5520
Java 异常-Exception
【Java】认识异常
3️⃣数组下标越界异常(ArrayIndexOutOfBoundsException)
喜欢做梦
2024/11/25
1030
【Java】认识异常
Java异常(Error与Exception)分析与常见异常处理
代码中,我们也看到代码写错了编译器会提示报错,或者编译器没有提示,但是运行的时候报错了,比如前面的数组查询下标超过数组的长度。所以在使用计算机语言进行项目开发的过程中,即使程序员把代码写得很完美, 在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避。
小明爱吃火锅
2023/09/21
9070
Java异常(Error与Exception)分析与常见异常处理
Java异常 Throwable、Exception、Error
  Java通过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件。当条件生成时,错误将引发异常。
chenchenchen
2022/03/09
2.4K0
Java异常 Throwable、Exception、Error
Java 异常面试问题与解答
异常是在程序执行期间可能发生的错误事件,它会破坏其正常流程。异常可能源于各种情况,例如用户输入的错误数据,硬件故障,网络连接故障等。
淡定的蜗牛
2019/11/01
9770
Java 异常机制
Java把异常当做对象来处理,并定义了一个基类java.lang.Throwable作为所有异常的超类。这些异常分为两大类,即异常(Exception)和错误(Error)。其中,Exception类有两个主要的子类,即 IOException 类和 RuntimeException 类。
星姮十织
2021/12/25
4720
[ Java学习基础 ] Java异常处理
一、异常概述   异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出 java.lang.ArithmeticException 的异常。   异常发生的原因有很多,通常包含以下几大类: 用户输入了非法数据。 要打开的文件不存在。 网络通信时连接中断,或者JVM内存溢出。   这些异常有的是因为用
Kevin_Zhang
2018/05/22
2K0
Java基础——异常
在运行的时候发生不正常的情况。在Java中采用类的形式对异常问题进行描述和封装对象。
羊羽shine
2019/05/28
5680
【Java ——异常机制详解】
异常指不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程。Java通 过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件。当条件生成时,错误将引发异常。
奥耶可乐冰
2024/05/31
2890
Java异常面试问题
异常是在程序执行期间可能发生的错误事件,并且会中断它的正常流程。异常可能来自不同类型的情况,例如用户输入的错误数据,硬件故障,网络连接故障等。
用户1257393
2018/09/30
1.1K0
相关推荐
【Java】异常处理指南
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验