Java异常类详解

这篇具有很好参考价值的文章主要介绍了Java异常类详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

异常简介:

异常体系:

异常的处理:

自定义异常类:


一.异常简介:

    1.1  异常定义:

  • 异常是运行程序的过程中产生的异常情况。
  • 异常的情况是指程序在运行过程中,可能由于外界条件的变更(不设想的不一致)导致出现错误的情况(如数据库连接)
  • 异常不同于常态,在程序运行过程中,有错误产生,把这种错误的状态称为异常。但是开发过程中,语法错误和逻辑错误不属于异常
  • 出现异常时,Java会阻止当前的方法,中断执行程序的指令流。为了更好的错误,我们必须使用异常类。

    1.2.  出现异常的三种原因:

  • Java内部出现的错误,由jvm虚拟机产生的异常。这种一般属于error类,我们处理不了(关机重启),交给jvm自行处理。
  • 编写代码时产生的错误,就像算法异常,空指针异常等。这种属于Exception类,我们可以根据报错原因,修改错误。
  • 手动throw异常,提示使用者一些信息。

二.异常体系:

所有的异常类型都是内置类java.lang.Throwable的子类。

Java异常类详解

上图可知:超类Throwable下面由两个子类error和Exception。

error错误是Java内部产生的错误,程序无法处理,如:Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误),堆栈溢出。

Exception异常是程序运行时出现的错误。可以通过报错类型进行修改错误。Exception异常可以分为checkedexception(受检异常)和uncheckedexception(不受检异常)。受检异常发生在编译期间,必须对异常情况进行处理,要么用try.....catch要么使用throw。否则编译不通过。

不受检异常发生在运行期间,这个时候需要根据报错提示解决。

错误和异常两个是不同的子类,两者有很大的不同,错误是无法控制的,只能听之任之,而异常则可以捕捉并且处理的。

由于error是内部出现问题,程序很难控制,我们重点讨论Exception异常:Exception异常可以分为checkedexception(受检异常)和uncheckedexception(不受检异常),分别发生在编译期间和运行期间,也可以称为非运行时异常和运行时异常,这两种异常可以捕捉并且处理。

运行时异常都是 RuntimeException 类及其子类异常,如 NullPointerException、IndexOutOfBoundsException 等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般由程序逻辑错误引起。

非运行时异常是指 RuntimeException 以外的异常,类型上都属于 Exception 类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如 IOException、ClassNotFoundException 等以及用户自定义的 Exception 异常(一般情况下不自定义检查异常)。

下面这幅图可以清楚的知道异常之间的关系:

Java异常类详解

  常见的运行时异常总结:

异常 描述
ArithmeticException 当出现异常的运算条件时,抛出此异常。例如,一个整数"除以零"时,抛出此类的一个实例。
ArrayIndexOutOfBoundsException 用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。
ArrayStoreException 试图将错误类型的对象存储到一个对象数组时抛出的异常。
ClassCastException 当试图将对象强制转换为不是实例的子类时,抛出该异常。
IllegalArgumentException 抛出的异常表明向方法传递了一个不合法或不正确的参数。
IllegalMonitorStateException 抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。
IllegalStateException 在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。
IllegalThreadStateException 线程没有处于请求操作所要求的适当状态时抛出的异常。
IndexOutOfBoundsException 指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。
NegativeArraySizeException 如果应用程序试图创建大小为负的数组,则抛出该异常。
NullPointerException 当应用程序试图在需要对象的地方使用 null 时,抛出该异常
NumberFormatException 当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
SecurityException 由安全管理器抛出的异常,指示存在安全侵犯。
StringIndexOutOfBoundsException 此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。
UnsupportedOperationException 当不支持请求的操作时,抛出该异常。

     常见的非运行异常总结:

异常 描述
ClassNotFoundException 应用程序试图加载类时,找不到相应的类,抛出该异常。
CloneNotSupportedException 当调用 Object 类中的 clone 方法克隆对象,但该对象的类无法实现 Cloneable 接口时,抛出该异常。
IllegalAccessException 拒绝访问一个类的时候,抛出该异常。
InstantiationException 当试图使用 Class 类中的 newInstance 方法创建一个类的实例,而指定的类对象因为是一个接口或是一个抽象类而无法实例化时,抛出该异常。
InterruptedException 一个线程被另一个线程中断,抛出该异常。
NoSuchFieldException 请求的变量不存在
NoSuchMethodException 请求的方法不存在

 

三.异常的处理的两种方式:

在Java中对于程序可能出现的检查时异常,要么用try…catch语句捕获并处理它,要么使用throw语句抛出它,由上一级调用者来处理。

    3.1.   try....catch捕获处理异常: 

try指尝试执行可能出现异常的代码,如果没出现异常,那么不执行catch语句,否则通过catch捕捉异常,并且处理异常。

try{
 可能出现异常的代码
   }catch{
 如果出现异常,那么捕捉并且处理的代码。
   }

注意:try和catch必须同时出现,一个try可以有多个catch.

   案例:1.编写一个计算N个整数平均值的程序。程序应该提示用户输入N的值,如何必须输入所有N个数。
如果用户输入的值是一个负数,则应该抛出一个异常并捕获,提示“N必须是正数或者0”。并提示用户再次输入该数


1.scanner获取n个值,for循环n作为结束条件
2.
*/
import java.util.Scanner;
public class AverageException {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入n个数");
        int n=scanner.nextInt();//输入一个n数
        int sum=0;
        for(int i=0;i<n;i++){
            try{
                System.out.println("输入");
                int n1=scanner.nextInt();
                if(n1>0){
                    sum=sum+n1;
                }else{
                    throw new ArithmeticException();
                }
            }catch (Exception e){
                System.out.println("N必须是正数或者0,再次输入该数");
                e.printStackTrace();
            }
        }
        double average=sum/n;
        System.out.println("平均数为"+average);
        
    }
}

    3.2  throw抛出异常:

  • 有时候对于出现异常的情况我们无法处理,或者给调用者一些提示,会选择抛出异常,把这个异常交给调用者处理,但是在抛出的同时我们必须在方法声明这个异常,告诉可能出现的异常。
  • throw会抛出一个异常对象,将这个异常对象传递到调用者处,并结 束当前方法的执行

抛出异常的语法:

throw new 异常类型(提示信息);

 抛出异常的声明语法:

throws 异常类型1,异常类型2,.....

这里要注意throws和throw的区别:throw是用于抛出异常,throws用于声明异常。 

案例:文章来源地址https://www.toymoban.com/news/detail-445296.html

    1. 编写程序接收用户输入分数信息,如果分数在0—100之间,输出成绩。如果成绩不在该范围内,抛出异常信息,提示分数必须在0—100之间。

要求:使用自定义异常实现

import java.util.Scanner;
public class Excel2 {
    public static void main(String[] args) throws Exceptionscore {
        Scanner sca = new Scanner(System.in);
        System.out.println("输入分数");
        int scannner=sca.nextInt();
        score(scannner);

    }
    public static void score(int scanner) throws Exceptionscore {
        if(scanner<0||scanner>100){
            throw new Exceptionscore();
        }else{
            System.out.println("成绩:"+scanner);
        }
    }
}
//自定义异常类
class Exceptionscore extends Exception{
    public Exceptionscore(){
        System.out.println("分数必须在0—100之间。");
    }
}

   3.3  异常处理的拓展方式:

  •  当出现多个异常类型时,一个catch语句显然无法满足要求。这个时候出现多个catch处理不同的异常类型:
try--catch--finally

此处的finally语句是放在最后面,无论 程序有没有异常出现都必须执行。它是通常用于处理善后清理工作。

   3.4   异常处理需要注意的地方:

注意:

1.try 代码段包含的是可能产生异常的代码,也有可能不会出现异常。我们只是尝试用try装起来。

2.try 代码段后跟一个或多个catch代码段,或不跟catch代码段只跟一个finally代码段程序也不会报错。

 try{
            int a=scanner/2;
        }finally {
            System.out.println("不会报错");
        }

3.在jdk1.7之前每个catch代码段只声明一种其能处理的特定类型的异常,并提供处理的方法。 Jdk1.7之后,一个catch代码可以可以声明多个能处理的特定异常的类型,多个类型之间用”|”隔开

catch(ExceptionName1 e | ExceptionName1 e){
...... //异常的处理代码 
}

4.当异常发生时,程序会中止当前的流程去执行相应的catch代码段。

5.写catch代码时,先捕获的异常的范围不能大于后捕获的异常的范围。

6.finally段的代码无论是否发生异常都执行。因为finally用于处理善后工作

7.catch 不能独立于 try 存在,但一个try可以有多个catch语句,同时finally语句也不是必须要有。

四.自定义异常类:

除了JDK中已经被定义好的异常类,我们有时候根据开发需求自己定义异常类。

需要注意的是:

  • 所有异常都必须是 Throwable 的子类。
  • 检查性异常类,则需要继承 Exception 类。
  • 运行时异常类,那么需要继承 RuntimeException 类。
  • 异常类也更其他类差不多,可以拥有自己的属性和方法

举例:

//自定义异常类
class Exceptionscore extends Exception{
    int age;
    public Exceptionscore(){
        System.out.println("这是自定义的异常类。");
    }
    public void input(){
        System.out.println("这是异常类的成员方法");
    }
}

如何调用我们自定义的异常类:

在类中的方法中抛出定义的异常类就可以了; 

案例:

1.编写程序接收用户输入分数信息,如果分数在0—100之间,输出成绩。如果成绩不在该范围内,抛出异常信息,提示分数必须在0—100之间。
要求:使用自定义异常实现
import java.util.Scanner;
public class Excel2 {
    public static void main(String[] args) throws Exceptionscore {
        Scanner sca = new Scanner(System.in);
        System.out.println("输入分数");
        int scannner=sca.nextInt();
        score(scannner);

    }
    public static void score(int scanner) throws Exceptionscore {
        if(scanner<0||scanner>100){
            throw new Exceptionscore();
        }else{
            System.out.println("成绩:"+scanner);
        }
        try{
            int a=scanner/2;
        }finally {
            System.out.println("不会报错");
        }
    }
}
//自定义异常类
class Exceptionscore extends Exception{
    int age;
    public Exceptionscore(){
        System.out.println("这是自定义的异常类。");
    }
    public void input(){
        System.out.println("这是异常类的成员方法");
    }
}

到了这里,关于Java异常类详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Java 集合框架体系简介

    Java 集合框架体系简介

    存储多个数据可以使用数组,但由于数组在内存中是连续存储的,所以会有一些限制。比如数组在创建时就要指定长度,即可以容纳的元素个数,且指定后无法更改;数组在创建时需要指定元素的类型,并且所有元素都必须是该类型或其子类;添加或删除数组中的元素需要创

    2024年02月08日
    浏览(14)
  • springboot全局异常处理和自定义异常处理

    在spring项目中,优雅处理异常,好处是可以将系统产生的全部异常统一捕获处理,自定义的异常也由全局异常来捕获,如果涉及到validator参数校验器使用全局异常捕获也是较为方便。 GlobalExceptionHandler类: 自定义异常CustomException类: 通用返回类:AjaxResult 枚举类ResultCodeEnum:

    2024年02月04日
    浏览(8)
  • Spring MVC异常处理【单个控制异常处理器、全局异常处理器、自定义异常处理器】

    Spring MVC异常处理【单个控制异常处理器、全局异常处理器、自定义异常处理器】

    目录 一、单个控制器异常处理 1.1 控制器方法 1.2 编写出错页面 1.3 测试结果 二、全局异常处理 2.1 一个有异常的控制器类 2.2 全局异常处理器类 2.3 测试结果  三、自定义异常处理器 3.1 自定义异常处理器 3.2 测试结果 往期专栏文章相关导读  1. Maven系列专栏文章 2. Mybatis系列

    2024年02月16日
    浏览(14)
  • 【从零开始学习JAVA | 第三十一篇】异常体系介绍

    【从零开始学习JAVA | 第三十一篇】异常体系介绍

            本文我们将为大家介绍一下异常的整个体系,而我们学习异常,不是为了敲代码的时候不出异常,而是为了能够熟练的处理异常,如何解决代码中的异常。  我们就以这张图作为线索来详细介绍一下Java中的异常: 在Java中, Exception(异常)是一种表示非致命错误或异

    2024年02月15日
    浏览(46)
  • [ARM汇编]ARM体系结构简介—1.2.1 ARM处理器的历史与发展

    [ARM汇编]ARM体系结构简介—1.2.1 ARM处理器的历史与发展

    ARM(Advanced RISC Machine,先进的精简指令集计算机)处理器是一种广泛应用于嵌入式系统的处理器架构,具有低功耗、高性能、低成本等特点。接下来,我们将介绍 ARM 处理器的历史与发展。 ARM 处理器的历史 ARM 处理器的历史可以追溯到 1983 年,当时英国的 Acorn 电脑公司为了

    2024年02月09日
    浏览(113)
  • SpringBoot异常处理(Whitelabel Error Page和自定义全局异常处理页面)和整合ajax异常处理

    SpringBoot异常处理(Whitelabel Error Page和自定义全局异常处理页面)和整合ajax异常处理

    SpringBoot默认的处理异常的机制:SpringBoot 默认的已经提供了一套处理异常的机制。一旦程序中出现了异常 SpringBoot 会向/error 的 url 发送请求。在 springBoot 中提供了一个叫 BasicErrorController 来处理/error 请求,然后跳转到默认显示异常的页面来展示异常信息 自定义该页面显示内容

    2024年01月16日
    浏览(17)
  • dubbo处理自定义异常

    dubbo处理自定义异常

    背景 在实际项目中,我们不可避免地需要使用自定义的异常,一般这个异常会继承RuntimeException,然后我们通过@RestControllerAdvice注解,拦截业务异常类,做一些处理,但是在使用dubbo构建项目时,会发现provider抛出自定义异常,然后在消费者端,不会捕捉到我们的自定义异常,

    2024年02月05日
    浏览(12)
  • UNIX基础知识:UNIX体系结构、登录、文件和目录、输入和输出、程序和进程、出错处理、用户标识、信号、时间值、系统调用和库函数

    UNIX基础知识:UNIX体系结构、登录、文件和目录、输入和输出、程序和进程、出错处理、用户标识、信号、时间值、系统调用和库函数

            所有的操作系统都为运行在其上的程序提供服务,比如:执行新程序、打开文件、读写文件、分配存储区、获得系统当前时间等等         从严格意义上来说,操作系统可被定义为一种软件,它控制计算机硬件资源,提供程序运行的环境。我们通常将这种软件称为

    2024年02月13日
    浏览(15)
  • Spring Boot 如何自定义异常处理器

    Spring Boot 如何自定义异常处理器

    在Spring Boot应用程序中,异常处理是一个非常重要的方面。如果您不处理异常,应用程序可能会崩溃或出现不可预料的行为。默认情况下,Spring Boot将未捕获的异常返回给客户端。这通常不是期望的行为,因为客户端可能无法理解异常信息。在本文中,我们将介绍如何在Sprin

    2024年02月06日
    浏览(11)
  • ARMv8-AArch64 的异常处理模型详解之异常处理详解(同步异常和异步异常的分析和处理)

    ARMv8-AArch64 的异常处理模型详解之异常处理详解(同步异常和异步异常的分析和处理)

    在文章ARMv8-AArch64 的异常处理模型详解之异常类型 Exception types中提到过,同步异常是处理器在执行指令时产生的异常,是一种精确的,可以具体定位到是哪条指令导致异常的产生。下面笔者将介绍三个用于定位并分析同步异常产生的寄存器。 在文章ARMv8-AArch64 的异常处理模型

    2024年03月27日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包