首页 > 编程语言 >JAVA学习之异常

JAVA学习之异常

时间:2024-08-21 19:56:50浏览次数:10  
标签:try JAVA 抛出 学习 catch 异常 throws

一、异常的概念

        在Java编程中,异常是指在程序执行过程中可能发生的错误或问题,这些问题可能会导致程序无法继续正常运行,异常可以分为两种类型:编译时异常和运行时异常。

1.编译时异常是在编译阶段被检测到的异常,程序员在代码中必须显示地处理这些异常,否则无法通过编译。比如,文件不存在,输入输出错误等都属于编译时异常。处理这类异常通常需要使用try-catch块,将可能出现异常的代码放在try块中,然后在catch块中处理异常情况,以确保程序的稳定性。

2.而运行时异常是在程序运行过程中出现的异常,它们通常是由程序逻辑错误引起的,如除以零,数组越界等。与编译时异常不同,运行时异常在代码中并不要求必须进行显示的异常处理,但合理的异常处理仍然能够提升程序的健壮性。运行时异常的出现会导致程序的中断,因此编程者需要通过合适的逻辑和条件来预防这些异常的发生。

        要合理处理异常,常用的方式是使用try-catch语句块来捕获异常。try块内放置可能引发异常的代码,而catch块内则编写处理异常的逻辑。此外,还可以使用finally块,不论异常是否发生,其中的代码都会被执行,常用于释放资源等操作。

        

二、运行时错误与异常

        在程序运行中,任何中断正常流程的因素都被认为是异常。JAVA语言用JAVA类来描述异常,所有异常类的祖先类为Java.lang.Throwable类。

        Throwable类有两个直接子类:

        (1)Error类:表示单靠程序本身无法恢复的严重错误,比如内存空间不足,或者JAVA虚拟机的方法调用栈溢出。在大多数情况下,遇到这样的错误时,建议让程序终止。

        (2)Exception类:表示程序本身可以处理的异常,当程序运行时出现这类异常,应该尽可能地处理异常,并且使程序恢复运行,而不应该随意终止程序。

常见异常类的类框图:

三、异常分类

Exception类还可以分为两种:非检查异常和检查异常。

        (1)非检查异常:RuntimeException类及其子类都称为非检查异常,也叫运行时异常,这种异常的特点是JAVA编译器不会检查它,也就是说,当程序中可能出现这类异常时,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。

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

四、异常处理机制

        JAVA编程语言使用异常处理机制为程序提供了错误处理的能力。

        JAVA的异常处理是通过5个关键字来实现的:try、catch(捕获)、finally、throw(抛出)、和throws。

        try:当某段代码在运行时可能产生异常的话,应该把这段代码放到try语句块中去。

        catch:在catch语句块中捕获异常,catch语句块的参数类似于方法的声明,包含一个异常类型和一个异常对象。异常类型一般是Java.lang.Exception类或者它的子类。

        fianlly:无论是否产生异常,finally所指定的代码都要被执行。通常在finally语句中可以进行资源的清除工作,如关闭打开的文件等。

        throws:总是出现在方法的声明中,用来标明该方法可能抛出的各种异常。

        throw:总是出现在方法体中,用来抛出一个异常。

1.try-catch语句:捕获异常

        在JAVA语言中,用try-catch语句来捕获异常,格式如下:

try{

        可能会出现异常情况的代码

}    catch  (SQLException  e){

        处理操作数据库出现的异常

}    catch  (Exception  e){

        处理操作输入流和输出流出现的异常

}

注:try在使用的时候要注意try代码块不能独立出现,必须和catch代码块、finally代码块搭配使用,其使用规则是try代码块后可以跟0个或多个catch代码块,0个或1个finally代码块,try代码块后可以只跟一个finally代码块。

2.throws声明异常

        如果在一个方法体中抛出了异常,就希望调用者能够去及时地捕获异常,JAVA语言中通过关键字throws声明某个方法可能抛出的各种异常。

    //throws声明异常,在方法的小括号和大括号中间写,如果需要声明多个异常,
    //中间用逗号分隔开
    //声明异常并不是处理异常

    public void method1() throws ClassNotFoundException {

        Class.forName("com/haina365/lesson15/ExceptionTest03.java");

    }

    public void method2() throws ClassNotFoundException {

        method1();

    }

3.throw抛出异常

        在JAVA语言中,使用throw关键字来抛出异常。

 public static void main(String[] args) {

        int[] a = new int[5];

        int i = 5;

        if (i>a.length){

            //throw抛出异常,创建异常对象将其抛出

            throw new ArrayIndexOutOfBoundsException("数组越界");

        }else {

            System.out.println(a[i]);

        }

    }

五、自定义异常

        使用JAVA内置的异常类可以描述在编程时出现的大部分异常情况。

        除此之外,用户只需继承Exception类即可自定义异常类。

        在程序中使用自定义异常,可分为以下步骤:

(1)创建自定义异常类

(2)在方法中通过throw关键字抛出异常对象

(3)如果在当前抛出异常的方法中处理异常,可以使用try-catch语句块捕获并处理,否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。

(4)在出现异常方法的调用者中捕获并处理异常

//自定义异常需要先继承Exception,然后在需要抛出异常的时候通过throw抛出new出来的异常

//对象,同时还需要在方法上声明一下该异常

public class ExceptionTest06 extends Exception {

    public ExceptionTest06(){

        super("数组下标越界异常,请检查代码");

    }

    public static void main(String[] args)throws ExceptionTest06 {

        try{

            int[] a = new int[5];

            System.out.println(a[5]);

        }catch (ArrayIndexOutOfBoundsException e){

            throw new ExceptionTest06();

        }
    }
}

标签:try,JAVA,抛出,学习,catch,异常,throws
From: https://blog.csdn.net/m0_74122592/article/details/141310171

相关文章

  • Java中static的用法
    目录1.静态变量(StaticVariables)2.静态方法(StaticMethods)3.静态代码块(StaticBlocks)4.静态内部类(StaticNestedClasses)5.执行顺序6.注意事项在Java中,static关键字有几个重要的用途,主要用于定义类的静态成员,如静态变量、静态方法和静态代码块。以下是对这些用......
  • 2025秋招书籍推荐:《深度学习的数学理论》——揭示深度学习背后的数学逻辑
    近年来,随着深度学习在图像识别、自然语言处理等领域的突破性进展,越来越多的研究者和开发者投入到这个领域。然而,尽管深度学习在实践中取得了显著的成功,其背后的理论机制仍然让很多人感到迷惑。这就是为什么我今天想向大家推荐一本书——《深度学习的数学理论》(Mathematical......
  • Java中关键字static的学习
    static关键字目录static关键字静态变量(静态成员变量)静态方法静态初始化块静态内部类静态导入在Java中,static关键字是一个非常重要的修饰符,它主要用于创建静态变量、静态方法、静态初始化块、静态内部类以及静态导入。使用static关键字的主要目的是为了实现共享,即被static修饰的......
  • 《给所有人的生成式 AI 课》学习笔记(一)
    前言本文是吴恩达(AndrewNg)的视频课程《GenerativeAIforEveryone》(给所有人的生成式AI课)的学习笔记。由于原课程为全英文视频课程(时长约3个小时),且国内访问较慢,阅读本文可快速学习课程内容。课程介绍本课程帮助大家了解生成式人工智能的工作原理,以及如何在生活和工......
  • 高级java每日一道面试题-2024年8月21日-框架篇[Spring篇]-使用IOC容器应该注意哪些?
    如果有遗漏,评论区告诉我进行补充面试官:使用IOC容器应该注意哪些?我回答:1.理解IOC的基本概念控制反转:在传统的编程模式中,程序会主动控制依赖关系的创建和管理。而在IoC容器中,这种控制权被反转给了容器本身。程序员只需要声明依赖关系,而由容器负责实例化和注入这些依......
  • java如何判断一个列表中是否存在大于1000的数字
    个人名片......
  • Java异常捕获与处理:深入理解与实践
    个人名片......
  • Java笔试面试题AI答之集合(1)
    文章目录1.Java集合类框架的基本接口有哪些?2.为什么Java集合类没有实现Cloneable和Serializable接口?关于Cloneable接口关于Serializable接口为什么不默认实现这些接口?3.Java中的HashMap的工作原理是什么?1.数据结构2.哈希函数3.处理哈希冲突4.动态扩容5.Java8......
  • 基于Java的志愿者管理系统设计与实现(适用于2025年毕业项目-源码+论文+部署讲解等)
    文章目录1.前言2.详细视频演示3.论文参考4.项目运行截图5.技术框架5.1后端采用SpringBoot框架5.2前端框架Vue6.可行性分析7.系统测试7.1系统测试的目的7.2系统功能测试8.数据库表设计9.代码参考10.数据库脚本11.作者推荐项目12.为什么选择我?13.获取源......
  • IO进程(学习)2024.8.21
    目录进程间通信进程间通信方式无名管道特点读写特性函数接口有名管道特点函数接口读写特性无名管道和有名管道的区别 信号信号的概念信号的分类信号的处理方式信号产生的方式信号信号函数发送信号闹钟信号进程间通信进程间通信方式1..早期的进程间通信......