初识java——javaSE(8)异常

news2025/1/19 11:28:51

文章目录

  • 一 异常的概念与体系结构
    • 1.1 什么是异常?
    • 1.2 异常的体系结构!
    • 1.3 编译时异常与运行时异常与Error
      • 编译时异常:
        • 异常声明:throws关键字
      • 运行时异常:
      • 什么是Error?
  • 二 处理异常
    • 2.1 异常的抛出:throw(注意与throws有区别!)
    • 2.2 异常的捕获(具体处理):
      • try—catch语句
    • 2.3 关于异常的处理方式:
    • 2.4 异常处理流程总结:
  • 三 自定义异常类


一 异常的概念与体系结构

1.1 什么是异常?

 //异常是指代码中除了语法错误之外,出现的问题导致代码出现不正常行为的状况称之为异常!
 //在java中用异常类来表示异常,因为java的思想是一切皆对象。

比如数组越界,除0,栈溢出:这三种异常:

//数组越界:
        int array[] = {1,2,3,4,5};
        System.out.println(array[10]);

结果:
显示为:ArrayIndexOutOfBoundsException异常(此异常为数组越界异常)
后面是原因: Index 10 out of bounds for length 5
在这里插入图片描述

//除0
 System.out.println(10/0);

结果:
在这里插入图片描述
显示为: ArithmeticException异常(此异常为算术异常)
后面显示原因: / by zero

1.2 异常的体系结构!

异常种类繁多,为了对不同异常或者错误进行很好的分类管理,Java内部维护了一个异常的体系结构:

大体的体系结构:
在这里插入图片描述

具体的:

    其中RunTimeException以及其子类对应的异常,都称为运行时异常。

在这里插入图片描述

1.3 编译时异常与运行时异常与Error

编译时异常:

所谓编译时异常是指在编译阶段发生的异常,为此我们必须对可能出现的编译异常进行操作,声明以便抛出或者直接处理。而不是像对运行时异常那样,可以既不声明,也不处理(异常的处理下面会阐述到!)。

异常声明:throws关键字
throws关键字处于方法声明时参数列表之后,当方法中抛出编译时异常,表示该方法并没有处理异常,而是交
给方法的调用者来处理。即此关键字的作用在于提醒方法的调用者处理异常。

举例: 克隆对象:

在这里插入图片描述
我们必须进行对可能出现的异常进行声明或者处理!

用throws关键字进行声明:
后面跟上可能出现的异常类:CloneNotSupportedException

在这里插入图片描述

运行时异常:

运行时异常是指程序在编译阶段结束后,生成了.class文件,在JVM执行时,出现的异常。
对于可能出现的运行时异常,我们可以不进行声明或者处理。

比如:数组越界

//数组越界:
        int array[] = {1,2,3,4,5};
        System.out.println(array[10]);

在这里插入图片描述

什么是Error?

//Error是指java虚拟机无法解决的严重问题,比如:JVM内部错误,资源耗尽 如:栈溢出

举例:

   public static  void func1 (){
        func1();
    }


    public static void main(String[] args) {
       func1();

    }

在这里插入图片描述
要注意,红圈的部分其他的是Exception,而此处是Error.

我们是不会用throws声明Error类及其子类的异常的,因为出现了就没救(JVM无法解决),无意义。

二 处理异常

当异常出现时,我们可以选择进行处理,或者什么都不做,交给JVM处理
JVM处理的结果即抛出异常,结束程序!
在Java中,异常处理主要的5个关键字:throw、try、catch、finally、throws。

2.1 异常的抛出:throw(注意与throws有区别!)

异常的抛出用于当程序出现问题时,报告给调用者情况。

举例:

public class Test {

    public static  void func1 (){
        func1();
    }

    public static void main(String[] args) {
        //throw关键字
        int a = 10;
        if(a<20){
            throw new ArithmeticException("胡乱调用了异常类");
        }
        System.out.println(a);
        
    }
    }

在这里插入图片描述
我们设定的条件是当a<20时,抛出异常,结果成功。

结果还表明:当抛出异常后,异常后面的代码不被执行。

2.2 异常的捕获(具体处理):

异常的捕获即异常的具体处理,主要有两种方式:一种是throws声明,这个在前面讲过,不再赘述,另一种则是try—catch捕获

try—catch语句

try—catch语句的语法格式是:

  try{
            //此处放置要执行的代码,可以会出现异常

        }catch (要捕获的异常类型 e){
            // 如果try中的代码抛出异常了,此处catch捕获时异常类型与try中抛出的异常类型一致时,或者是try中抛出异常的基类
          //   时,就会被捕获到 ,对异常就可以正常处理,处理完成后,跳出try-catch结构,继续执行后序代码

        }[catch(要捕获的异常类型 e){
            //此处放置处理异常的代码
        }
         finally{
            //此处放置的代码,必定会被执行

        }
        ]
        //后续代码:

            //此处的代码,如果没出现异常或者出现了异常并处理了,则此处代码会被执行
            //若出现了异常但没有被处理,则此处的代码不会被执行!
     注: (1) [] 中的内容可加可不加
              (2) try中的代码块不一定会报异常!
其中finally关键字的代码块用于回收系统资源,不管是程序退出,还是抛出异常都需要回收资源
比如在打开文件后,需要关闭文件,即回收系统资源。

举例1 :有多个异常时,try-catch语句能否同时捕获?

       //try—catch语句
    //    int [] array = {1,2,3,4,5};
        int [] array = null;
        try{
            System.out.println(10/0);
            System.out.println(array.length); //打印数组的长度
        

        }catch (NullPointerException e){//空指针异常
            System.out.println("空指针异常");

        }catch (ArithmeticException e){
           // 异常的处理方式
            System.out.println(e.getMessage());   // 只打印异常信息
            System.out.println(e);               // 打印异常类型:异常信息
            e.printStackTrace();                    // 打印信息最全面
         


        }finally {
            System.out.println("finally中执行的代码");
        }
        System.out.println("后续代码块");

在这里插入图片描述

 结果表明:我们通过try—catch语句只能捕获一个异常
 因为:  try块内抛出异常位置之后的代码将不会被执行

举例2
如果多个异常的处理方式是相同的,则简写成:
在这里插入图片描述

   int[] array = null;
        try {
            System.out.println(10 / 0);
            System.out.println(array.length); //打印数组的长度


        } catch (NullPointerException | ArithmeticException e) {//空指针异常
            System.out.println(e.getMessage()); //只打印异常信息——/by zero
            System.out.println(e);               // 打印异常类型:异常信息
            e.printStackTrace();                       //打印信息最全面 ——打印异常类型,打印异常信息,还打印异常所在的代码!



        } finally {
            System.out.println("finally中执行的代码");
        }
        System.out.println("后续代码块");
    }

在这里插入图片描述
举例三:

 如果异常之间具有父子关系,一定是子类异常在前catch,父类异常在后catch,否则语法错误:

在这里插入图片描述

2.3 关于异常的处理方式:

在这里插入图片描述

2.4 异常处理流程总结:

在这里插入图片描述

  1. 先执行try块中的代码
  2. 如果发现异常,则在catch中判断是否与catch的异常类型相同,如果相同则执行catch中的代码,如果不同则将异常向上传递给上一层调用者。
  3. 无论异常是否被处理,finally中的代码都会被执行(在该方法结束之前执行),但是如果异常并没有被处理,则后续代码不会被执行。
  4. 如果上层调用者依然无法处理异常,则继续传递给上层,直到传递到main方法,main方法也无法处理,则交给JVM,最终异常结束程序。
  public static void func() {
        int[] arr = {1, 2, 3};
        System.out.println(arr[100]);

    }
    public static void main(String[] args) {
            func();
            System.out.println("after try catch");
        }

在这里插入图片描述
结果表明:显示了异常的调用栈,且最终after try catch语句没有被执行!

三 自定义异常类

java中提供的异常类不能代表所有我们在日常开发中遇到的问题,所以我们需要自己定义异常类

举例:

package demo1;

public class PasswordException extends Exception{
    public PasswordException(String message){
        super(message);

    }

}
package demo1;

public class UserNameException extends Exception{
    public UserNameException(String message){
        super(message);
    }
}



public class Test {
    private String userName = "admin";
    private String password = "123456";

    public  void loginInfo(String userName, String password)
                                 throws UserNameException,PasswordException{
       if (! this.userName.equals(userName)) {
             throw new UserNameException("用户名错误!");
    }
        if (! this.password.equals(password)) {
             throw new PasswordException("用户名错误!");
    }
           System.out.println("登陆成功");
  }

    public static void main(String[] args) {
          try {
           new Test(). loginInfo("admin", "123456");
               } catch (UserNameException e) {
                e.printStackTrace();
               } catch (PasswordException e) {
               e.printStackTrace();
  }
  }

在这里插入图片描述

注意事项
自定义异常通常会继承自 Exception 或者 RuntimeException
继承自 Exception 的异常默认是受查异常
继承自 RuntimeException 的异常默认是非受查异常.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1719781.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端从零到一开发vscode插件并发布到插件市场

前端从零到一开发vscode插件并发布到插件市场 背景目标成果展示一条龙实现过程安装插件脚手架和工具创建项目运行调试打包第一次打包前的必要操作 发布第一次发布前账号准备注册Azure DevOps发布账号-获取token注册vscode开发者账号终端登录vsce 发布方式2-手动上传插件 进阶开…

社区来稿|眼手交互能定义下一代人机交互范式吗?

以下文章来源于XR交互技术观察 &#xff0c;作者Eis4TY 前面的话&#xff1a; 推荐一篇来自 Rokid 产品经理 Eis4TY 的文章。文章探讨了眼手交互技术的原理、应用现状以及未来的发展趋势。作者提出&#xff1a;「在 XR 设备上&#xff0c;眼手交互不是最终答案&#xff0c;而…

lipo制作通用版本静态库

文章目录 目的了解多架构的maclipo如何利用lipo编译通用版本静态库lipo 命令整理扩展目的 主要是使用lipo命令在macOS上创建通用版本的静态库(.a文件),来支持多种架构,如arm64,x86_64。 学习目的: 了解mac 不同架构arm64, x86_64了解lipo命令了解多架构的mac 随着appl…

01--nginx基础

前言&#xff1a; 本文用来整理一下nginx的用法&#xff0c;应该是本人中间件专栏的第一篇文章&#xff0c;这里开始概念和实操将会同样重要&#xff0c;面试时基本概念的理解非常重要&#xff0c;深有体会&#xff0c;不会再让概念成为压死骆驼的稻草。 1、nginx简介 Nginx…

【算法】宵暗的妖怪

✨题目链接&#xff1a; 宵暗的妖怪 ✨题目描述 露米娅作为宵暗的妖怪&#xff0c;非常喜欢吞噬黑暗。这天&#xff0c;她来到了一条路上&#xff0c;准备吞噬这条路上的黑暗。这条道路一共被分为n 部分&#xff0c;每个部分上的黑暗数量为ai 。露米娅每次可以任取 连续的 未被…

java中回调与Timer类的使用

回调&#xff1a;回调&#xff08;callback)是一种常见的程序设计模式。在这种模式中&#xff0c;可以指出某个特定事件发生时应该采取的动作。 Timer类&#xff1a;java.swing包中的Timer类&#xff0c;可以使用它在给定的时间间隔时发出通告。如程序中有一个时钟&#xff0c…

12.RedHat认证-Linux文件系统(下)

12.RedHat认证-Linux文件系统(下) swap虚拟内存 我加一个硬盘做实验sdc # 创建交换分区&#xff08;不用做成逻辑卷也能灵活分区&#xff09; [rootcentos8 ~]# fdisk /dev/sdc -l Disk /dev/sdc&#xff1a;10 GiB&#xff0c;10737418240 字节&#xff0c;20971520 个扇区 …

《逆水寒》手游周年庆,热度不减反增引发热议

易采游戏网5月31日最新消息&#xff1a;随着数字娱乐时代的飞速发展&#xff0c;手游市场的竞争愈发激烈。在这样的大背景下&#xff0c;《逆水寒》手游以其独特的古风武侠世界和深度的社交体验&#xff0c;自上线以来便吸引了无数玩家的目光。如今&#xff0c;这款游戏迎来了它…

C盘文件被格式化了,要怎么恢复?

C盘通常是操作系统(如Windows)的默认安装目录。它包含了操作系统的核心文件、驱动程序及系统所需的各种支持文件。这些文件对于计算机的正常运行至关重要。但在使用的过程中&#xff0c;有时可能会因为各种原因导致C盘被格式化&#xff0c;从而丢失了这些重要文件。这无疑是一个…

智慧车站管理:提升地铁站新质生产力的策略

应用图扑自研产品 HT for Web 结合 BIM 技术&#xff0c;搭建轻量化的 WebGIS 智慧车站系统。 该系统通过整合轨道交通信息&#xff0c;实现了车站数据的多维互联与融合。提升了车站信息管理效率和运营效能&#xff0c;并优化了乘客出行体验。对构建智能、高效、环保的轨道交通…

数字IC基础:主要的FPGA厂商

相关阅读 数字IC基础https://blog.csdn.net/weixin_45791458/category_12365795.html?spm1001.2014.3001.5482 Xilinx&#xff08;现已被AMD收购&#xff09; Xilinx, 成立于1984年&#xff0c;是FPGA&#xff08;现场可编程门阵列&#xff09;技术的创始者和市场领导者。该公…

中学生学人工智能系列:如何用AI学化学

经常有读者朋友给公众号《人工智能怎么学》留言咨询如何使用人工智能学习语文、数学、英语、化学等科目。这些都是中学教师、中学生朋友及其家长们普遍关注的问题。仅仅使用留言回复的方式&#xff0c;不可能对这些问题做出具体和透彻的解答&#xff0c;因此本公众号近期将推出…

什么是机器人离线编程? 衡祖仿真

一、什么是机器人离线编程&#xff1f; 机器人离线编程是自动化生产的重要一环。离线编程指&#xff0c;在建立了机器人的三维模拟场景后&#xff0c;经由软件仿真计算&#xff0c;生成控制机器人运动轨迹&#xff0c;进而生成机器人的控制指令。工程师可以由此来控制物理环境…

高级Java开发者的自我修养:深入剖析JVM垃圾回收机制及面试要点

在探索Java虚拟机&#xff08;JVM&#xff09;的奥秘过程中&#xff0c;垃圾回收机制&#xff08;GC&#xff09;是一个不可或缺的话题&#xff0c;尤其在面对大型应用和系统优化时显得尤为重要。JVM的自动内存管理是Java编程语言中一项革命性的特性&#xff0c;它大大简化了程…

优思学院|作为质量工程师,需要考哪些证书?别浪费你的气力,一张就够!

质量工程师做什么呢&#xff1f;他们的主要任务就是确保产品和服务的质量&#xff0c;以满足客户需求并超越竞争对手。尽管市场上有各种各样的质量管理认证&#xff0c;但优思学院认为&#xff0c;专注于六西格玛的学习和认证就足够了。 为什么选择六西格玛&#xff1f; 第一…

数字孪生技术可以给工厂带来哪些帮助?

随着人工智能、大数据、云计算等技术的不断成熟&#xff0c;各行各业开始意识到数字化转型的重要性&#xff0c;数字孪生作为其重要组成部分逐渐受到关注。特别是在制造业、建筑业等领域&#xff0c;通过数字孪生技术可以实现虚拟仿真、预测分析&#xff0c;提高生产效率和产品…

Ollama+OpenWebUI+Phi3本地大模型入门

文章目录 Ollama+OpenWebUI+Phi3本地大模型入门一、基础环境二、Ollama三、OpenWebUI + Phi3Ollama+OpenWebUI+Phi3本地大模型入门 完全不懂大模型的请绕道,相信我李一舟的课程比较适合 Ollama提供大模型运行环境,OpenWebUI提供UI,Phi3就是那个大模型。 当然,Ollama支持超级…

交换机堆叠技术

堆叠 一、园区网络以及数据中心技术发展演进 1、xSTP&#xff08;STP&#xff0c;RSTP&#xff0c;MSTP&#xff09; 问题&#xff1a; 收敛慢链路利用率不高次优路径------mstp不持支负载vlan数量限制&#xff08;4k&#xff09;&#xff0c;网络规模瓶颈 二、堆叠基本概念…

java.lang.NoClassDefFoundError: org/dom4j/io/SAXReader

问题描述&#xff1a;在maven项目中&#xff0c;给SAXReader创建实例&#xff0c;启动tomcat服务器后报异常java.lang.NoClassDefFoundError: org/dom4j/io/SAXReader。我在pom文件中是引入了dom4j依赖得&#xff0c;但是不知道为什么在上传到web时就找不到了 解决办法&#x…

登录校验及全局异常处理器

登录校验 会话技术 会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束.在一次会话中可以包含多次请求和响应会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话请求间共享数据会话跟踪方案 客户端…