浅谈Java异常及其编译时异常和运行时异常的区别[通俗易懂]

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

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

一、什么是异常 :在程序定义中一般指不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间、或者代码编译时候,它干扰了正常的程序指令流程继续下去。Java通 过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件。当条件生成时,错误将引发异常。
在java api中的Throwable类结构如下:
Throwable类结构图
由其结构图可以看出,所有的异常都继承了父类Throwable。
二、 Throwable: 有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。
Error:是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。
这些错误表示故障发生于虚拟机自身、或者发生在虚拟机准备加载时、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在 Java中,错误通过Error的子类描述。

三、Exception(异常):是程序本身可以处理的异常。
Exception 类有一个重要的子类 RuntimeException。RuntimeException 类及其子类表示“JVM 常用操作”引发的错误。例如,若试图使用空值对象引用、除数为零或数组越界,则分别引发运行时异常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException。
注意:异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。

通常,Java的异常(包括Exception和Error)分为可查的异常(checked exceptions)和不可查的异常(unchecked exceptions)。
可查异常(编译器要求必须处置的异常):正确的程序在运行中,很容易出现的、情理可容的异常状况。可查异常虽然是异常状况,但在一定程度上它的发生是可以预计的,而且一旦发生这种异常状况,就必须采取某种方式进行处理。

除了RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。

不可查异常(编译器不要求强制处置的异常):包括运行时异常(RuntimeException与其子类)和错误(Error)。

Exception 这种异常分两大类运行时异常和非运行时异常(编译异常)。程序中应当尽可能去处理这些异常。

运行时异常:都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException。这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,可以从逻辑角度出发去处理,尽可能避免这类异常的发生。

运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。
编译异常 (非运行时异常):是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。

四、 在 Java 应用程序中,异常处理机制为:抛出异常,或者捕捉异常
Java语法规定:对于可查异常必须捕捉、或者声明抛出。允许忽略不可查的RuntimeExceptionError

五、一些常见的异常类
1). runtimeException子类:

    1、 java.lang.ArrayIndexOutOfBoundsException
    数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。
    2、java.lang.ArithmeticException
    算术条件异常。譬如:整数除零等。
    3、java.lang.NullPointerException
    空指针异常。当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例
    方法、 访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等
    4、java.lang.ClassNotFoundException
    找不到类异常。当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class
    文件时,  抛出该异常。
   5、java.lang.NegativeArraySizeException  数组长度为负异常

   6、java.lang.ArrayStoreException 数组中包含不兼容的值抛出的异常

   7、java.lang.SecurityException 安全性异常

   8、java.lang.IllegalArgumentException 非法参数异常

2).IOException

IOException:操作输入流和输出流时可能出现的异常。

EOFException   文件已结束异常

FileNotFoundException   文件未找到异常
  1. 其他
ClassCastException    类型转换异常类

ArrayStoreException  数组中包含不兼容的值抛出的异常

SQLException   操作数据库异常类

NoSuchFieldException   字段未找到异常

NoSuchMethodException   方法未找到抛出的异常

NumberFormatException    字符串转换为数字抛出的异常

StringIndexOutOfBoundsException 字符串索引超出范围抛出的异常

IllegalAccessException  不允许访问某类异常
IllegalStateException 客户端响应异常

除了Java中定义的几种异常,我们也可以自定义异常,自定义的异常字需要继承Exception类即可。
如下:

package com.wlgdo.webiot.exceptions;

/**
 * @author : Ligang.Wang[wangligang@karaku.cn]
 * @date : 2019/3/19
 */

public class RpcException extends Exception {

    String exceptionMsg; // 定义String类型变量

    public RpcException(String exceptionMsg) {
        exceptionMsg = exceptionMsg;
    }

    public String getMexceptionMsg() {
        return exceptionMsg;
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/187721.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 王思聪新浪微博微博_kimi乔任梁王思聪

    王思聪新浪微博微博_kimi乔任梁王思聪作者|天使不投资人本文经授权转载自虎嗅APP(ID:huxiu_com)iG夺冠了!iG夺冠了!——11月3日,社交媒体成为了年轻人欢乐的海洋,微博尤甚。根本不知道LOL、也不知道iG是什么的叔叔阿姨们,对这次刷屏一点都不反感,毕竟IG老板,人称“校长”的王思聪,为了庆祝自家战队创造历史,在11月6日发起了一场豪气抽奖:从参与人数就可以隔着屏幕感受到一万元奖金的巨大…

  • file_put_contents 和php://input 实现存储数据进图片中

    file_put_contents 和php://input 实现存储数据进图片中

  • python打开h5文件可视化_python环境变量的配置

    python打开h5文件可视化_python环境变量的配置我正在尝试用Python读取h5文件。该文件可以在thislink中找到,名为“vstoxx_data_31032014.h5”。我试图运行的代码来自YvesHilpisch的《PythonforFinance》一书,内容如下:importpandasaspdh5=pd.HDFStore(‘path…/vstoxx_data_31032014.h5′,’r’)futures…

  • java锁cas(java锁的实现原理)

    一、Java锁1.常见的锁有synchronized和Lock()①synchronized是jvm层面实现的,可以直接用,不过要锁住某个对象;lock是属于j.u.c包下的接口,用的时候要实现lock接口。②synchronized一般和wait()、notify()、notifyAll()一起使用,使用完不用释放锁;lock必须在finally里面手动释放。@lock锁与s…

  • 浅谈FastJson的 new TypeReference 用法

    浅谈FastJson的 new TypeReference 用法简单描述:看同事提交的代码,发现有一行代码似曾相识,但却朦朦胧胧,ε=(´ο`*)))唉很明显自己没掌握呗,于是乎,就百度了一下干货:对进行泛型的反序列化,使用TypeReference可以明确的指定反序列化的类型,代码: 1 2 //js代码将form表单里的各种元素里的值组装成js对象,然后转成json串,ajax传递给后台 var…

  • leetcode难度级别_直线上最多的点数

    leetcode难度级别_直线上最多的点数给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。示例 1:输入: [[1,1],[2,2],[3,3]]输出: 3解释:^|| o| o| o +————->0 1 2 3 4示例 2:输入: [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]]输出: 4解释:^|| o| o o| o| o o+—–

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号