Java基础_异常

news2025/1/18 10:46:37

Java基础_异常

  • 异常体系介绍
  • 编译时异常和运行时异常
  • 异常的作用
  • 异常的处理方式
    • JVM默认的处理方式
    • 自己处理(捕获异常)
      • try...catch
      • 灵魂四问
      • Throwable的成员方法
    • 抛出处理
  • 综合练习
  • 自定义异常
  • 来源
  • Gitee地址

异常体系介绍

在这里插入图片描述

  • 异常是什么?
    • 程序中可能出现的问题
  • 异常体系的最上层父类?异常分为几类
    • 父类:Exception
    • 异常分为两类:编译时异常、运行时异常
  • 编译时异常和运行时异常的区别
    • 编译时异常:没有继承RuntimeException的异常,直接继承于Exception。编译阶段就会错误提示。
    • 运行时异常:RuntimeException本身和子类。编译阶段没有错误提示,运行时出现的。

编译时异常和运行时异常

  • 两者的区别
    • 编译时异常:除了RuntimeException和他的子类,其他都是编译时异常。编译阶段需要进行处理,作用在于提醒程序员。
    • 运行时异常:RuntimeException本身和所有子类,都是运行时异常。编译阶段不报错,是程序运行时出现的。一般是由于参数传递错误带来的问题。

异常的作用

  • 用来查询bug的关键参考信息
  • 作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况

异常的处理方式

JVM默认的处理方式

  • JVM默认的处理方式
    • 把异常的名称,异常原因及异常出现的位置等信息输出在了控制台
    • 程序停止执行,下面的代码不会再执行了

自己处理(捕获异常)

try…catch

public class ExceptionDemo6 {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};

        try{
            System.out.println(arr[10]); // 此处出现了异常,程序会在这里创建一个 ArrayIndexOutOfBoundsException 对象
                                        // new ArrayIndexOutOfBoundsException();
                                        // 拿着这个对象到catch的小括号中对比,看括号中的遍历是否可以接收这个对象
                                        // 如果能接收,表视该异常被捕获,执行catch中的代码
                                        // 当catch里面的所有代码执行完毕,继续执行try...catch体系下面的其他代码
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println("索引越界了");
        }

        System.out.println("看看我执行了吗");
    }
}

灵魂四问

  • 如果try中没有遇到问题,怎么执行
    • 会把try里面所有的代码全部执行完毕,不会执行catch里面的代码
  • 如果try中可能会遇到多个问题,怎么执行
    • 会写多个catch与之对应,父类异常需要写在下面
  • 如果try中遇到的问题没有被捕获,怎么执行
    • 相当于try…catch白写了,当前异常会交给虚拟机处理
  • 如果try中遇到问题,那么try下面的其他代码还会执行吗
    • 不会执行了。try中遇到问题,直接跳转到对应的catch,如果没有对应的catch与之匹配,则交给虚拟机处理

Throwable的成员方法

public class ExceptionDemo11 {
    public static void main(String[] args) {
        /**
         * public String getMessage()       返回此可抛出的建端描述
         * public String toString()         返回此throwable的详细消息字符串
         * public void printStackTrace()    在底层是利用System.err.println进行输出
         *                                  把异常的错误信息以红色字体输出在控制台,不会中断程序运行
         */

        int[] arr = {1,2,3,4};
        try{
            System.out.println(arr[10]);
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println(e.getMessage()); // Index 10 out of bounds for length 4
            System.out.println(e.toString()); // java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 4
            e.printStackTrace();
        }
        System.out.println("看看我执行了吗");
    }
}

抛出处理

public class ExceptionDemo12 {
    public static void main(String[] args) {


        int[] arr = null;
        int num = 0;
        try {
            num = getMax(arr);
        } catch (NullPointerException e) {
            System.out.println("空指针异常");
        } catch (ArrayIndexOutOfBoundsException e){
            System.out.println("索引越界异常");
        }
        System.out.println(num);
    }

    private static int getMax(int[] arr) /*throws NullPointerException,ArrayIndexOutOfBoundsException*/ {
        if(arr == null){
            throw new NullPointerException();
        }
        if(arr.length == 0){
            throw new ArrayIndexOutOfBoundsException();
        }
        int ret = arr[0];
        for(int i=1;i<arr.length;i++){
            if(arr[i] > ret){
                ret = arr[i];
            }
        }
        return ret;
    }
}

综合练习

public class ExceptionDemo13 {
    public static void main(String[] args) {
        /**
         * 学生的名字长度为[3, 10]
         * 学生的年龄大小为[18, 40];
         */
        Scanner sc = new Scanner(System.in);

        Student stu = new Student();

        while (true) {
            try {
                System.out.println("请输入学生的名字");
                String name = sc.nextLine();
                stu.setName(name);
                System.out.println("请输入学生的年龄");
                String ageStr = sc.nextLine();
                int age = Integer.parseInt(ageStr);
                stu.setAge(age);
                break;
            } catch (NumberFormatException e) {
                System.out.println("年龄的格式有异常");
            } catch (RuntimeException e) {
                System.out.println("名字的长度或者年龄的大小有异常");
            }
        }

        System.out.println(stu.toString());

    }
}

public class Student {
    private String name;
    private int age;

    ...

    public void setName(String name) {
        if(name.length() < 3 || name.length() > 10){
            throw new RuntimeException();
        }
        this.name = name;
    }

    public void setAge(int age) {
        if(age < 18 || age > 40){
            throw new RuntimeException();
        }
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" + "name='" + name + '\'' + ", age=" + age + '}';
    }
}

自定义异常

  1. 定义异常类
  2. 写继承关系
  3. 空参构造
  4. 带参构造
public void setAge(int age) {
    if(age < 18 || age > 40){
        throw new AgeOutOfBoundsException(age+"有误,大小应在[18, 40]");
    }
    this.age = age;
}

public class AgeOutOfBoundsException extends RuntimeException{

    public AgeOutOfBoundsException() {
    }

    public AgeOutOfBoundsException(String message) {
        super(message);
    }
}

来源

黑马程序员. 阿玮Java零基础

Gitee地址

https://gitee.com/yu-ba-ba-ba/awJava

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

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

相关文章

LabVIEW2017破解安装教程

LabVIEW2017破解安装教程&#xff1a; 1、新版LabVIEW2017分为32位和64位两个平台&#xff0c;多种语言版本(需要LabVIEW2017中文版的朋友请选择WinChn版本)&#xff0c;大家选择自行选择符合系统的版本下载并解压 2、本次安装以Win 7 64位系统为例&#xff0c;运行“2017LV-64…

【Vscode配置java环境并配置stringboot】

1.VSCODE配置JAVA环境 参考这篇文章配置JAVA环境&#xff1a;连接 java版本&#xff0c;我是win11系统,我下载的JAVA安装版本是下面&#xff0c;是最新版的&#xff1a; 配置环境&#xff1a;步骤很简单&#xff0c;就是向系统环境变量中添加路径&#xff0c;参考上面文章中的…

AddressSanitizer理论及实践:heap-use-after-free、free on not malloc()-ed address

AddressSanity&#xff1a;A Fast Address Sanity Checker 摘要 对于C和C 等编程语言&#xff0c;包括缓冲区溢出和堆内存的释放后重用等内存访问错误仍然是一个严重的问题。存在许多内存错误检测器&#xff0c;但大多数检测器要么运行缓慢&#xff0c;要么检测到的错误类型有…

【Java】解决Java报错:IllegalArgumentException

文章目录 引言1. 错误详解2. 常见的出错场景2.1 非法的参数值2.2 空值或 null 参数2.3 非法的数组索引 3. 解决方案3.1 参数验证3.2 使用自定义异常3.3 使用Java标准库中的 Objects 类 4. 预防措施4.1 编写防御性代码4.2 使用注解和检查工具4.3 单元测试 结语 引言 在Java编程…

C++笔记之一个函数多个返回值的方法、STL::pair、STL::tuple、STL::tie的用法

C++笔记之一个函数多个返回值的方法、STL::pair、STL::tuple、STL::tie的用法 —— 2024-06-08 杭州 code review! 文章目录 C++笔记之一个函数多个返回值的方法、STL::pair、STL::tuple、STL::tie的用法一.从一个函数中获取多个返回值的方法1. 使用结构体或类2. 使用`std::t…

递归【2】(组合回溯(生成括号)、子集回溯(背包问题))

括号对 &#xff08;组合型回溯&#xff09; 分解成子问题&#xff0c;每一次添加括号分两步&#xff1a; if左括号小于n&#xff0c;加左括号&#xff0c;然后k(index1), if左括号大于有括号&#xff0c;加右括号&#xff0c;k(index1),然后收尾括号单独考虑&#xff0c;到…

Spark的开发环境配置

1. 介绍 这里主要记录一下&#xff0c;我们常用的maven配置&#xff0c;方便后期开发配置环境&#xff0c;避免每次都从零开始配置工程。 2. 工程目录 3. pom的配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven…

Vue11-键盘事件

一、键盘事件&#xff1a;keydown和keyup事件 keydown 和 keyup 是两种常用于处理键盘输入事件的JavaScript事件。当你在网页的输入框或其他可输入元素上按下或释放键盘上的某个键时&#xff0c;这些事件就会被触发。 1-1、keydown 事件 当用户按下键盘上的某个键时&#xff…

计算机组成原理——浮点加减运算的一道非计算例题

浮点加减运算的一道非计算例题 一、题目 文字描述 例6.31设机器数字长16位&#xff0c;阶码5位&#xff08;含1位阶符&#xff09;&#xff0c;基值为2&#xff0c;尾数11位&#xff08;含1位数符&#xff09;。 对千两个阶码相等的数按补码浮点加法完成后&#xff0c;由于规格…

Linux通过安装包配置环境变量(详细教程)

本章教程使用jdk1.8.0_241版本在Linux CentOS系统中,配置Java环境变量。 一、下载安装包 微云下载:https://share.weiyun.com/JeWZMDoh 二、上传安装包 将安装包上传到linux中的opt目录中 三、解压安装包 tar -xzvf jdk-8u241-linux-x64.tar.gz四、配置环境变量 vim /etc/p…

第6章 字典

第6章 字典 6.1 一个简单的字典6.2 使用字典6.2.1 访问字典中的值6.2.2 添加键值对6.2.3 先创建一个空字典6.2.4 修改字典中的值6.2.5 删除键值对6.2.6 由类似对象组成的字典6.2.7 使用 get()来访问值 6.3 遍历字典6.3.1 遍历所有键值对6.3.2 遍历字典中的所有键 6.3.3 按特定顺…

pytorch之猫狗识别项目

1. 导入资源包 资源包&#xff1a; import torchvision&#xff1a;PyTorch 提供的视觉库&#xff0c;包含了常用的计算机视觉模型架构、数据集以及图像转换工具。 from torchvision import datasets, models&#xff1a;导入 torchvision 中的 datasets 和 models 模块&#…

Anaconda软件:安装、管理python相关包

Anaconda的作用 一个python环境中需要有一个解释器, 和一个包集合. 解释器&#xff1a; 根据python的版本大概分为2和3. python2和3之间无法互相兼容, 也就是说用python2语法写出来的脚本不一定能在python3的解释器中运行. 包集合&#xff1a;包含了自带的包和第三方包, 第三…

Flutter基础 -- Flutter容器布局

目录 1. MaterialApp 1.1 组件定义 1.2 主要功能和属性 1.3 示例 2. 脚手架 Scaffold 2.1 定义 2.2 Scaffold 的属性 2.3 示例 PS: 对于 Scaffold 和 MaterialApp 3. 线性布局 Column Row 3.1 Row 3.2 Column 4. 盒模型 Box Model 4.1 定义 4.2 示例 5. 容器 C…

ubuntu20.04中设置包含ros节点的文件自启动

若文件里包含了ros话题的发布和接收&#xff0c;那么设置自启动时&#xff0c;应该首先将roscore设置为自启动。 首先确保roscore有一个systemd服务文件。如果还没有&#xff0c;需要在/etc/systemd/system/下创建一个。例如&#xff0c;一个基本的roscore.service文件可能如下…

html文件使用postcss-pxtorem适配移动端 使用tailwindcss库

项目截图 插件下载 npm i -D postcss8.4.38 postcss-cli10.1.0 postcss-pxtorem6.1.0 tailwindcss3.4.3postcss.config.js & tailwind.config.js postcss.config.js const pxToRem require(postcss-pxtorem) module.exports {plugins: [pxToRem({rootValue: 75,propLi…

[office] 快速删除excel中的空行和列的方法 #其他#学习方法#经验分享

快速删除excel中的空行和列的方法 用户在网上下载好的Excel表格打开之后发现有很多空白行&#xff0c;怎么样将这些空白行或单元格一次性删除掉呢?下面教大家在Excel中用定位一次性可以把空白行删除 用户在网上下载好的Excel表格打开之后发现有很多空白行&#xff0c;怎么样将…

【Unity】官方文档学习-光照系统

目录 1 前言 2 光照介绍 2.1 直接光与间接光 2.2 实时光照与烘焙光照 2.3 全局光照 3 光源 3.1 Directional Light 3.1.1 Color 3.1.2 Mode 3.1.3 Intensity 3.1.4 Indirect Multiplier 3.1.5 Shadow Type 3.1.6 Baked Shadow Angle 3.1.7 Realtime Shadows 3.1…

TriForce: 突破长序列生成瓶颈的分层投机解码技术

在人工智能领域&#xff0c;大型语言模型&#xff08;LLMs&#xff09;的长序列生成能力一直是研究的热点。然而&#xff0c;随着模型规模的增长&#xff0c;推理过程中的内存和计算瓶颈成为了限制其应用的主要障碍。为了解决这一问题&#xff0c;Carnegie Mellon University和…

[数据集][目标检测]盲道检测数据集VOC+YOLO格式2173张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2173 标注数量(xml文件个数)&#xff1a;2173 标注数量(txt文件个数)&#xff1a;2173 标注…