初识java——javaSE(8)异常

文章目录

  • 一 异常的概念与体系结构
    • 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 的异常默认是非受查异常.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

利用映射算子打印菱形

文章目录 一、利用RDD完成&#xff08;一&#xff09;右半菱形&#xff08;二&#xff09;左半菱形&#xff08;三&#xff09;完整菱形&#xff08;四&#xff09;输出任意大菱形 二、利用Java完成&#xff08;一&#xff09;右半菱形&#xff08;二&#xff09;左半菱形&…

恒压频比开环控制系统Matlab/Simulink仿真分析(SPWM控制方式)

介绍恒压频比的开环控制方法驱动永磁同步电机的转动&#xff0c;首先分析恒压频比的控制原理&#xff0c;然后在Matlab/Simulink中进行永磁同步电机恒压频比开环控制系统的仿真分析&#xff0c;最后将Simulink中的恒压频比控制算法生成代码加载到实际工程中进行工程实现。 一、…

react 表格实现拖拽功能

项目背景 : react ant 单纯实现拖拽确实不难 , 我的需求是根据后台接口返回 , 生成对应的父子表格 , 并只可以拖拽子的位置 , 如图 后台返回的数据结构 (pid为0说明是父 , 子的pid等于父的id , 说明是父的子) 1 , 我先转成了树形结构且自己加上了key (注意 : key一定得是唯一的…

异常(Exception)

捕获异常 public class test {public static void main(String [] args) {int[] arr {1,2,3,4,5};try {System.out.println(arr[10]);}catch (ArrayIndexOutOfBoundsException e) {//索引越界异常System.out.println("索引越界");}System.out.println("看看我是…

测试FaceRecognitionDotNet报错“Error deserializing object of type int”

FaceRecognitionDotNet宣称是最简单的.net人脸识别模块&#xff0c;其内部使用Dlib、DlibDotNet、OpenCVSharp等模块实现人脸识别&#xff0c;网上有不少介绍文章。实际测试过程中&#xff0c;在调用FaceRecognition.Create函数创建FaceRecognition实例对象时&#xff0c;会报如…

AI入门:普通人可以利用AI做什么?休闲时间赚点小钱?(含多种实践案例)

大家好&#xff0c;我是影子&#xff0c;一名AI编程深耕者。 最近&#xff0c;有很多 AI 小白问我&#xff0c;AI到底可以做些什么&#xff1f;对我们普通人能有哪些帮助&#xff1f; 在我看来&#xff0c;对于我们刚接触 AI 的小伙伴而言。我们可以利用 AI 为我们工作提效&…

构建 VPC 并启动 Web 服务器

实验 2&#xff1a;构建 VPC 并启动 Web 服务器 目标 完成本实验后&#xff0c;您可以&#xff1a; 创建 VPC。创建子网。配置安全组。在 VPC 中启动 EC2 实例。任务 1&#xff1a;创建 VPC 在本任务中&#xff0c;您将使用 VPC 向导在单个可用区中创建一个 VPC、一个互联网网关…

神经网络---卷积神经网络CNN

一、从前馈神经网络到CNN 前馈神经网络&#xff08;Feedforward Neural Networks&#xff09;是最基础的神经网络模型&#xff0c;也被称为多层感知机&#xff08;MLP&#xff09;。 它由多个神经元组成&#xff0c;每个神经元与前一层的所有神经元相连&#xff0c;形成一个“…

电子电气SCI期刊,中科院1区TOP,收稿范围广泛

一、期刊名称 IEEE Transactions on Smart Grid 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;工程技术 影响因子&#xff1a;9.6 中科院分区&#xff1a;1区 三、期刊征稿范围 IEEE Transactions on Smart Grid是一本跨学科期刊&#xff0c;旨在传播智…

Gbase 国产数据库

参考&#xff1a;参考&#xff1a; 5分钟学会Linux环境GBase 8t安装和部署 - 光洋山 - twt企业IT交流平台 (talkwithtrend.com)https://www.talkwithtrend.com/Article/197237 视频 GBase 8s快速入门-功能简介与演示-大数据教程-腾讯课堂 (qq.com)https://ke.qq.com/course/…

Qt 插件机制使用及原理

目录 1.引言 2.插件原理 3.插件实现 3.1.定义一个接口集(只有纯虚函数的类) 3.2.实现接口 4.插件的加载 4.1.静态插件 4.1.1.静态插件实现方式 4.1.2.静态插件加载的过程 4.1.3.示例 4.2.动态插件 4.2.1.动态插件的加载过程 5.定位插件 6.插件开发的优势 7.总结…

蓝桥杯高频考点-与日期相关的题目

文章目录 前言1. 如何枚举合法日期1.1 预存每个月的天数1.2 封装一个判断日期是否合法的函数1.3 枚举日期并判断日期是否合法 2. 判断日期是否为回文日期2.1 将日期当作字符串进行处理2.2 将日期当作一个8位数进行处理 3. 给定初始日期&#xff0c;计算经过n天后对应的日期3.1 …

Java集合【超详细】2 -- Map、可变参数、Collections类

文章目录 一、Map集合1.1 Map集合概述和特点【理解】1.2 Map集合的基本功能【应用】1.3 Map集合的获取功能【应用】1.4 Map集合的两种遍历方式 二、HashMap集合2.1 HashMap集合概述和特点【理解】2.2 HashMap的组成、构造函数2.3 put、查找方法2.4 HashMap集合应用案例【应用】…

另一棵树的子树(oj题)

一、题目链接 https://leetcode.cn/problems/subtree-of-another-tree/submissions/536304222 二、题目思路 1.首先遍历大树&#xff0c;判断大树的根结点的值是否等于小树的根结点的值&#xff0c;如果不相等&#xff0c;就找大树的左孩子或者右孩子&#xff0c;以左孩子为根…

博士毕业论文/CTEX/LATEX

LATEX环境安装 CTEX 安装 &#xff08;垃圾&#xff0c;不要装&#xff09; 运行 clean.batcomp.bat 缺少字体 Couldn’t find Adobe Heiti S.cfg’ miktex-maketfm: No creation rule for font “Adobe Heiti Std”.解决方法&#xff1a;其实就是下载这四个字体之后&…

jsp实验19 File

三、源代码以及执行结果截图&#xff1a; readJSPFile.jsp <% page contentType"text/html" %> <% page pageEncoding "utf-8" %> <% page import"java.io.*"%> <style> #tom{ font-family:宋体;font-size:2…

Crosslink-NX器件应用连载(10): 图像输入并通过HDMI输出

作者&#xff1a;Hello,Panda 大家下午好&#xff0c;晚上好。这里分享一个Lattice Crosslink-NX器件通过MIPI或LVDS输入图像&#xff0c;并通过HDMI输出图像的案例&#xff08;其实这是个比较冷门的需求&#xff0c;Crosslink-NX器件还是主要做MIPI桥接用&#xff09;。 咱们…

《Kubernetes部署篇:基于麒麟V10+ARM64架构部署harbor v2.4.0镜像仓库》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;企业级K8s集群运维实战 一、环境信息 K8S版本 操作系统 CPU架构 服务版本 1.26.15 Kylin Linux Advanced Server V10 ARM64 harbor v2.4.0 二、部…

文刻创作AI工具怎么注册卡密

在科技日新月异的今天&#xff0c;生成式人工智能&#xff08;AI&#xff09;的迅猛发展正在重塑各行各业的面貌。其中&#xff0c;文刻创作AI工具以其独特的魅力和强大的功能&#xff0c;成为了内容创作领域的一股清流&#xff0c;引领着内容生产的新潮流。 【文刻二创工具教…

人脸识别模型与人类视觉识别的对比——评估人脸识别模型存在偏见是否比人类的偏见大?

1. 概述 人脸识别系统是一个几十年来一直备受关注的研究领域。而且在过去的几年中。公司和政府一直在积极引入人脸识别系统&#xff0c;并且我们看到越来越多的机会可以看到人脸识别系统。例如&#xff0c;有的系统可以随便介绍&#xff0c;如搜索特定人的图像&#xff08;图像…