杂谈——运行时异常和普通异常有什么区别

article/2025/10/1 10:03:25

说到异常,大家都熟悉,只要程序出错了,那么肯定会说:“哎呀,我的程序出错啦~它抛出异常啦”。

但单单以“异常”的名称来称呼它们,未免也太粗糙了。我们毕竟是一个精致的程序员,当然得知道他们到底都有哪些种类啦。这就好比一个优质的男朋友(比如本帅博主)必须能够精准地区分女朋友的口红色号一般。

那Java到底有哪些异常呢?

其实也不多,Java提供了两种错误的异常类,分别是Error和Exception,它们的爸爸(即父类)都是Throwable,从这个角度来看,它们也算的上是亲兄弟啦。

但哪怕是兄弟,那也会有差别。那么咱们就来看看这两兄弟都有区别。

1.Error

Error,看名字就知道,这个错误肯定不会小,事实上也的确是如此,Error表示程序在运行期间出现了非常严重的错误,并且该错误是不可恢复的。

这个错误到底有多严重呢?“Error属于JVM层次的错误”。

JVM我们都知道,代码的顺利运行时离不开JVM这位大佬的。当JVM层次出现错误,那铁定会导致程序终止运行。此外,编译器不会检查Error是否被处理了,所以呀,在程序中我们不推荐去捕获Error类型的异常,主要的原因就是运行时异常大多都是逻辑错误导致的,它属于应该解决的错误,也就是说,一个正常的程序中是不应该存在Error的。像我们平常经常遇见的OutOfMemoryError、ThreadDeath等都是属于Error的,当这些错误发生的时候,JVM基本上都会选择让程序终止。

怎么理解上面的话呢,举个例子。假如咱们在面试的时候,和面试官爆发了语言上乃至身体上的冲突,这种错误就是Error,出现这种错误,面试铁定得中断了呀,毫无疑问的,咱们这次面试肯定也就凉凉了。对方不需要知道你在这件事情发生之后有没有进行反省或者挽救,反正你这回面试就是凉了,再怎么补救都没有用。我们只能放弃这次面试,改过自新,争取在下一次面试的时候不再出现这样的Error,这样才有可能让面试顺利进行,而不被中断。

所以呀,无论是写代码还是做别的事情,咱们都得谨慎,因为一旦出现了Error,无论咱们怎么补救,对本次程序运行或者事情都是无济于事的。

2.Exception

上面说到Error是一个超级重大的错误,那么作为它的兄弟,或多或少在这一方面会对Error的强硬有一些弥补。

Exception表示的是可恢复的异常,是编译器可以捕捉到的,而这家伙有包含这两种类型:检查异常恶化运行时异常。

(1)检查异常

检查异常是在程序中最经常碰到异常,所有继承自Exception并且不是运行时异常的异常都是检查异常,比如咱们最常见的IO异常和SQL异常。这种异常都发生在编译的阶段,Java编译器强制程序去捕获此类型的异常,即它会把可能会出现这些异常的代码放到try块中,把对异常的处理代码放到catch块中。这种异常一般在如下几种情况中使用:

  • 异常的发生并不会导致程序出错,进行处理之后可以继续执行后续的操作,比如,连接数据库失败之后可以重新连接之后再进行后续操作。
  • 程序依赖于不可靠的外部条件,比如系统IO。

(2)运行时异常

运行时异常不同于检查异常,编译器没有强制对其进行捕获并处理,如果不对异常进行处理,那么当出现这种异常的时候,会由JVM来处理,比如NullPointerException异常,它就是运行时异常。

在Java语言中,最常见的运行时异常包括NUllPointerException(空指针异常)、ClassCastException(类型转换异常)、ArrayIndexOutOfBoundsException(数组越界异常)、ArrayStoreException(数组存储异常)、BufferOverflowException(缓冲区溢出异常)、ArithmeticException(算术异常)等。

出现运行时异常之后,系统一般会把异常一直往上层抛,知道遇到处理代码位置,如果没有处理代码,那就一直抛到最上层;如果是多线程就会用Thread.run()的方法抛出;如果是单线程就用main()方法抛出。抛出之后呢,如果是线程,那么这个线程也就退出了,如果是主程序抛出的异常,那么这个主程序也就退出了。所以说,如果不对运行时的异常进行处理,后果也是非常严重的,一旦发生这种异常,要么是线程中止,要么就是主程序终止。

不过,在进行异常处理的时候,还需要注意一下几个问题:

(2.1)Java异常处理用到了多态的概念,如果在异常处理过程中,先捕获到了基类,然后再捕获子类,那么捕获子类的代码永远都不会被执行。因此,在进行以后才那个捕获的时候,正确的方法是先捕获子类,然后再捕获基类的异常信息。

错误示例如下:

try{//access db code
}catch(Exception e2)
{//deal with this exception
}catch(SQLException e1)

那要怎么写呢,如下: 

try{//access db code
}catch(SQLException e1)
{//deal with this exception
}catch(Exception e2)

(2.2)我们要尽早地抛出异常,同时对捕获的异常进行处理,或者从错误中恢复,或者让程序继续执行。咱们程序员得时刻记住,对捕获的异常不进行处理是一个非常不好的一贯,这样将非常不利于调试。但是,也不是抛出的异常越多越好,对于有些异常,比如运行时异常,实际上根本不必处理。

(2.3)可以根据实际的需求自定义一场类,这些自定义的一场类只要是继承自Exception类即可。

(2.4)异常能处理就处理,不能处理就抛出,对于一般异常来说,如果不能进行有效的处理,最好转换成为运行时异常抛出。而对于最终没有被处理的异常,JVM会进行处理。

关于检查异常和运行时异常,我们来看一个例子:

public class ExceptionTypeTest {public void doSomething()throws ArithmeticException{System.out.println("this is doSomething");}public static void main(String[] args) {// TODO Auto-generated method stubExceptionTypeTest ett=new ExceptionTypeTest();ett.doSomething();}
}

大家猜猜,这段程序可以编译通过吗?

我们来试一试。

上图表示这是可以的。那么,如果咱们更换一下异常的种类,将ArithmeticException换成IOException异常呢?

可以看到代码会提示错误。如果强行执行的话,将报错,如下图。

为什么ArithmeticException可以编译通过,而IOException不可以呢?因为前者属于运行时异常,编译器没有强制对其进行捕获并处理,因此编译可以通过。而IOException属于检查异常,编译器会强制去捕获此类型的异常,如果不对异常进行捕获的话将会有编译错误。

因此,我们只要捕获一下异常就可以了 用try-catch或者throws即可。如下图:

方法一:

方法二:

运行结果如下:

3.总结

 Error:是JVM(java虚拟机)中出现的不可恢复的错误。
 Exception:是类发生的异常,又具体分为以下三种:

  •    检查异常:  编译期发生
  •    运行时异常: 运行期(运行时)发生
  •    自定义异常

总而言之,对于异常,需谨慎,切记哟~。

好啦,以上就是关于运行时异常和普通异常的相关知识总结啦,如果大家有什么不明白的地方或者发现文中有描述不好的地方,欢迎大家留言评论,我们一起学习呀。

 

Biu~~~~~~~~~~~~~~~~~~~~宫å´éªé¾ç«è¡¨æå|é¾ç«gifå¾è¡¨æåä¸è½½å¾ç~~~~~~~~~~~~~~~~~~~~~~pia!


http://chatgpt.dhexx.cn/article/TaJssrCV.shtml

相关文章

常见的编译时异常和运行时异常

常见的编译时异常和运行是异常 1、粉红色的是编译时异常 2、绿色的异常是运行时异常 3、声明为Error的,则属于严重错误,如系统崩溃、虚拟机错误、动态链接失败等,这些错误无法恢复或者不可能捕捉,将导致应用程序中断,…

浅谈Java异常及其编译时异常和运行时异常的区别

异常是程序编码和运行时经常发生的事件,了解异常有助于我们提高代码质量,增强系统的健壮性,这里总结一下Java编程中的异常、以及Java编译时异常和运行时异常的区别,并列举几种常见的异常,以供参考学习。 一、什么是异…

Java 运行时异常和非运行时异常

异常类型分为两类:运行时异常和非运行时异常。 一、运行时异常: 运行时异常(RuntimeException),一般不需要程序员进行捕获。 例如:NullPointException,IndexOutOfBoundsException。如果不对该…

Java-异常处理(编译时异常、运行时异常及处理机制,自定义异常)

个人简介 大家好,我是翰慧腾。一名正在努力学JAVA的大一小白,本文章为初学的笔记,希望各位多多指教。💙欢迎点赞收藏留言💜你要批评指点四周风景,首先你要爬上屋顶🧡 一、异常 概述&#xff1a…

通俗理解运行时异常和非运行时异常(一般异常)

一,异常的概念 Java异常类层次结构图: Throwable: 有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类…

运行时异常与检查异常区别

首先,思考一个问题,看下面三个代码,当抛出异常时,后面的代码还会运行吗,是否要在异常后加上return语句? //代码1 public static void test() throws Exception {throw new Exception("参数越界"…

编译时异常与运行时异常

在实际开发中,经常会在程序编译时产生一些异常,必须要对这些异常进行处理,这种异常称为编译时异常,也称为checked异常。另外,还有一种异常是在程序运行时产生的,这种异常即使不编写异常处理代码&#xff0c…

异常Exception 和 运行时异常RuntimeException

文章目录 概念 概念 Java中的所有异常都来自顶级父类Throwable。 Throwable下有两个子类Exception和Error。 Error是程序无法处理的错误,一旦出现这个错误,则程序将被迫停止运行。Exception不会导致程序停止,又分为两个部分RunTimeExceptio…

运行时异常与检查异常

Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。Java中的异常分为两大类:错误Error和异常Exception,Java异常体系结构如下图所示: 1.Throwable Throwable类是所有异常或错误的超类&#xff0…

运行时异常和编译异常

1.概念: Java中将程序执行中发生的不正常情况称为异常(Exception) 2.分类 Error(错误):JVM无法解决的严重问题,程序会崩溃,比如JVM系统内部错误、资源耗尽等Exception:因编程错误等外在因素导致的一般性问题&#xff0…

Java Exception

Java Exception ####分类 Types of Exception There are mainly two types of exceptions: checked and unchecked where error is considered as unchecked exception. The sun microsystem says there are three types of exceptions: Checked Exception Unchecked Exce…

Java运行时异常和非运行时异常

1.Java异常机制 Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。Java中的异常分为两大类:错误Error和异常Exception,Java异常体系结构如下图所示: 图片来源:http://blog.csdn.net/w…

jdk和jre的区别还有maven

1.关于JDK的安装和配置问题 jdk我已经安装了(版本是1.8._60的--->并且完成相关的环境的配置) 还有环境的变量都配置好了的(java_home path 都配置好了的) JDK与JRE的区别 JRE: Java Runtime Environment JRE可以支撑Java程序的运行,包括JVM虚拟机&…

jdk与jre的区别,作用详解!

jdk与jre是Java开发和运行工具! jdk包含有jre,但是jre也可以单独安装 下图为jdk目录下的jre 在安装jdk分为两个步骤,我们是经常会将jdk与jre一起安装,如果混淆两个概念建议分开安装。 JRE是Java Runtime Environment的缩写&…

java jdk jre版本要一样吗a_JDK是什么?JRE是什么?JDK和JRE的区别?

原标题:JDK是什么?JRE是什么?JDK和JRE的区别? Java Runtime Environment (JRE) 包含: Java虚拟机、库函数、运行Java应用程序和Applet所必须文件 Java 2 SDK (Development Kit)包含: JRE的超集,包含编译器和调试器等用于程序开发的文件 Java运行环境的三项主要功能: n …

java面试必问:JDK和JRE的区别是什么?

前言 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一…

JDK和JRE的区别是什么?他们都有什么作用

相信很多java的初学者都卡在了JDK和JRE这儿,两者到底什么区别, 多数都是云里雾里的。其实笔者想说的是JDK 和JRE并没有想象中那么简单。 先给大家简单地介绍下Java的各种集成开发工具: JDK:开发工具包 JRE:(运行环境&#xff0…

Java之jdk与jre的区别

很多程序员已经干了一段时间java了依然不明白jdk与jre的区别。 JDK就是Java Development Kit.简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境。SDK是Software Development Kit 一般指软件开发包,可以包括函数库、编译程序等。 …

[JAVA学习] JDK与JRE的区别

最近在学习Python,安装Python IDE ——PyCharm,提示未安装Jave Run Time,于是到Oracle官网下载Jave安装包,发现有JDK和JRE两个版本。 JRE是Java Runtime Environment的缩写,顾名思义是java运行时环境,包含…

JDK、JRE的区别?以及相关面试题

1.JDK和JRE是java面试的基本问题。 下图是它们的直观区别,可从它们的面向对象、主要作用和组成部分三方面对比。其详细如下图所示: 2.JDK就是Java Development Kit 的英文缩写。 1). 主要面向开发人员。开发人员在软件开发时使用的SDK(Soft…