Java基础学习笔记(十)—— 异常

news2025/1/14 17:55:31

异常

  • 1 异常概述
  • 2 异常处理方式
    • 2.1 JVM默认处理异常的方式
    • 2.2 throws方式处理异常
    • 2.3 throw抛出异常
    • 2.4 try-catch方式处理异常
    • 2.5 Throwable成员方法
    • 2.6 异常的练习
  • 3 自定义异常

1 异常概述

异常:就是程序出现了不正常的情况。程序在执行的过程中,出现的非正常的情况,最终会导致JVM的正常终止。

在这里插入图片描述

注意:

  • 语言错误不属于异常体系

在这里插入图片描述

编译时异常和运行时异常的区别

  • 编译时异常
    • 都是Exception类及其子类
    • 必须显示处理,否则程序就会发生错误,无法通过编译
  • 运行时异常
    • 都是RuntimeException类及其子类
    • 无需显示处理,也可以和编译时异常一样处理

2 异常处理方式

2.1 JVM默认处理异常的方式

public static void main(String[] args){
	//思考:控制台为什么会有这样的红色字体呢? 是谁打印的?
	int [] arr = {1,2,3,4,5};
	System.out.println(arr[10]);
	//当代码出现了异常,那么就在这里创建了一个异常对象,new ArrayIndexOutOfBoundsException();
	//首先会看,程序中有没有自己处理异常的代码;
	//如果没有,交给本方法的调用者处理;
	//最终这个异常会交给虚拟机默认处理。
	System.out.println("嘿嘿嘿");

如果程序出现了问题,我们没有做任何处理,最终JVM 会做默认的处理,处理方式有如下两个步骤:

  • 把异常的名称,错误原因及异常出现的位置等信息输出在了控制台
  • 程序停止执行(哪里出现了异常,那么程序就在哪里停止, 下面的代码不执行了)

2.2 throws方式处理异常

定义格式:

public void 方法() throws 异常类名 {

}

示例代码:

public static void main(String[] args) throws ParseException {
	method1(); // 此时调用者也没有处理,还是会交给虚拟机处理.
	method2(); // 还是继续交给调用者处理,而main方法的调用者是虚拟机还是会采取虚拟机默认处理异常的方法。
}

// 运行时异常
private static void method1() /*throws NullPointerException*/ {
	int [] arr = null;
	for (int i = 0; i < arr.length; i++) {
		System.out.println(arr[i]);
	}
}

// 编译时异常
private static void method2() throws ParseException {
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
	sdf.parse("2048-10月10日");
}

注意:

  • 编译时异常因为在编译时就会检查,所以必须要写在方法后面进行显示声明,将来谁调用这个方法谁处理。两种处理方案:try…catch… 或者 throws
  • 运行时异常因为在运行时才会发生,所以在方法后面可以不写,运行时出现异常默认交给 jvm 处理

2.3 throw抛出异常

思考:以前出现了异常,虚拟机帮我们创建一个异常对象,抛给调用者。但是如果我们需要自己手动创建一个异常对象该如何写?

throw new 异常();

注意:

  • 这个格式是在方法内的,表示当前代码手动抛出一个异常,下面的代码不用再执行了

throws和throw的区别:

在这里插入图片描述

public static void main(String[] args) {
	// int [] arr = {1,2,3,4,5};
	int [] arr = null;
	printArr(arr);// 就会 接收到一个异常
					// 我们还需要自己处理一下异常
}

private static void printArr(int[] arr) {
	if(arr == null){
		// 调用者知道成功打印了吗?
		// System.out.println("参数不能为null");
		throw new NullPointerException(); // 当参数为null的时候
		// 手动创建了一个异常对象,抛给了调用者
	}else{
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	}
}

2.4 try-catch方式处理异常

定义格式:

try {
	可能出现异常的代码;
} catch(异常类名 变量名) {
	异常的处理代码;
}

执行流程:

  • 程序从 try 里面的代码开始执行
  • 出现异常,就会跳转到对应的 catch 里面去执行
  • 执行完毕之后,程序还可以继续往下执行

try-catch方式处理异常的好处:

  • 可以让程序继续往下执行

示例代码:

public static void main(String[] args) {
	int [] arr = null;
	try{
		// 有可能发现异常的代码
		printArr(arr);
	}catch (NullPointerException e){
		// 如果出现了这样的异常,那么我们进行的操作
		System.out.println("参数不能为null");
	}


	System.out.println("嘿嘿嘿"); // 可以执行到

}

private static void printArr(int[] arr) {
	if(arr == null){
		throw new NullPointerException();
	}else{
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	}
}

注意:

  • 如果 try 中没有遇到问题,怎么执行?
    • 会把 try 中所有的代码全部执行完毕,不会执行 catch 里面的代码
  • 如果 try 中遇到了问题,那么 try 下面的代码还会执行吗?
    • 那么直接跳转到对应的 catch 语句中,try 下面的代码就不会再执行了 。当catch里面的语句全部执行完毕,表示整个体系全部执行完全,继续执行下面的代码
  • 如果出现的问题没有被捕获,那么程序如何运行?
    • 那么 try…catch 就相当于没有写,那么也就是自己没有处理,默认交给虚拟机处理
  • 同时有可能出现多个异常怎么处理?
    • 出现多个异常,那么就写多个catch就可以了。还要特别注意如果多个异常之间存在子父类关系,那么父类一定要写在下面

2.5 Throwable成员方法

常用方法:

在这里插入图片描述

示例代码:

public static void main(String[] args) {

	try {
		int [] arr = {1,2,3,4,5};
		System.out.println(arr[10]);//虚拟机帮我们创建了一个异常对象 new ArrayIndexOutOfBoundsException();
	} catch (ArrayIndexOutOfBoundsException e) {
		/*String message = e.getMessage();
		System.out.println(message);*/
		
	   /* String s = e.toString();
		System.out.println(s);*/
		
	   e.printStackTrace();  // 输出红色的异常信息
	}
	System.out.println("嘿嘿嘿"); // 可以输出 
}

2.6 异常的练习

  • 需求

    键盘录入学生的姓名和年龄,其中年龄为18 - 25岁,超出这个范围是异常数据不能赋值.需要重新录入,一直录到正确为止

  • 实现步骤

    1. 创建学生对象
    2. 键盘录入姓名和年龄,并赋值给学生对象
    3. 如果是非法数据就再次录入

Student 类

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

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if(age >= 18 && age <= 25){
            this.age = age;
        }else{
            //当年龄不合法时,产生一个异常
            throw new RuntimeException("年龄超出了范围");
        }
    }

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

测试类

public class ExceptionDemo{
    public static void main(String[] args) {
        // 键盘录入学生的姓名和年龄,其中年龄为 18 - 25岁,
        // 超出这个范围是异常数据不能赋值.需要重新录入,一直录到正确为止。

        Student s = new Student();

        Scanner sc = new Scanner(System.in);
        System.out.println("请输入姓名");
        String name = sc.nextLine();
        s.setName(name);
       while(true){
           System.out.println("请输入年龄");
           String ageStr = sc.nextLine();
           try {
               int age = Integer.parseInt(ageStr);
               s.setAge(age);
               break;
           } catch (NumberFormatException e) {
               System.out.println("请输入一个整数");
               continue;
           } catch (AgeOutOfBoundsException e) {
               System.out.println(e.toString());
               System.out.println("请输入一个符合范围的年龄");
               continue;
           }
       }
        System.out.println(s);
    }
}

3 自定义异常

  • 自定义异常

    当Java中提供的异常不能满足我们的需求时,我们可以自定义异常

  • 实现步骤

    1. 定义异常类
    2. 写继承关系
    3. 提供空参构造
    4. 提供带参构造

异常类:

public class AgeOutOfBoundsException extends RuntimeException {
	// 可以通过快捷键alt+insert自动生成
    public AgeOutOfBoundsException() {
    }
    public AgeOutOfBoundsException(String message) {
        super(message);
    }
}

Student类中做如下修改:

public void setAge(int age) {
    if(age >= 18 && age <= 25){
        this.age = age;
    }else{
        //如果Java中提供的异常不能满足我们的需求,我们可以使用自定义的异常
        throw new AgeOutOfBoundsException("年龄超出了范围");
    }
}

测试类中做如下修改:

catch (AgeOutOfBoundsException e) {
       System.out.println(e.toString());
       System.out.println("请输入一个符合范围的年龄");
       continue;
}

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

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

相关文章

Vivado综合设置之-gated_clock_conversion

本文验证-gated_clock_conversion设置为on或off时&#xff0c;给Schematic带来的差异。 -gated_clock_conversion设置为on时&#xff0c;用于移除门控时钟&#xff0c;门控时钟是由门电路而非专用时钟模块&#xff08;例如MMCM或PLL&#xff09;生成的时钟。 门控时钟会对设计…

Java-集合(3)

Vector集合类 1.Vector底层保存数据的也是一个对象数组&#xff1a;protected Object[] elementDate; 2.Vector是线程同步的&#xff0c;也就是线程安全Vactor的操作方法都带有synchronized修饰。以此可以进行安全线程保障&#xff0c;所以在开发中如果确认只有一个线程操作集…

dubbo学习笔记3(小d课堂)

dubbo高级特性 启动依赖检查 我们现在直接来启动我们的消费者&#xff1a; 它会报错。 我们 再去直接运行我们的消费者就不会报错。 我们也可以不在代码中去配置&#xff1a; 实际工作中比较建议使用这种方式。 dubbo.reference.check是配置所有的reference里的service都是f…

C语言:大小端

大小端 对于整型来说&#xff0c;内存中存放的是补码&#xff0c;补码是按大小端模式进行存储&#xff1a; 大端存储数据低位存在内存高地址&#xff0c;高位存在内存低地址小端存储数据低位存在内存低地址&#xff0c;高位存在内存高地址 记忆方法 小小小&#xff1a;数据 小…

前端组件库自定义主题切换探索-01

探索原因背景 首先自然是项目有需求&#xff0c;这是必须去做的原因 其次&#xff0c;是我们项目没有直接使用市面上现成的基于element-ui或者ant-design的第三方UI框架&#xff0c;比如avue&#xff0c;而是有着自己的UI组件库 第三&#xff0c;我们的组件库基于ant-design-v…

Win10下干净卸载VMware15.5

一、说明 虚拟机属于服务软件&#xff0c;在Windows10下卸载实属不易。下面请看我所总结的卸载文档。 二、如何彻底卸载VMware虚拟机 需要删除的部分很多&#xff0c;包括&#xff1a; 三、删除步骤一&#xff1a;需要禁用VM虚拟机服务 首先&#xff0c;因为VM的软件属于底层…

【自学Python】Python转义字符

文章来源嗨客网&#xff08;www.haicoder.net&#xff09; Python转义字符 Python转义字符教程 在编程中有一些字符是打不出来的&#xff0c;比如换行&#xff0c;提示音&#xff0c;下一个制表位等等&#xff0c;于是程序语言的开发者就设计了转义序列&#xff08;escape se…

4 机器学习之决策树

学习笔记自&#xff0c;慕课网 《Python3 入门人工智能》 https://https://coding.imooc.com/lesson/418.html#mid32776 决策树、异常检测、主成分分析 常用的分类方法&#xff1a; 逻辑回归的思路&#xff1a; 决策树的思路&#xff1a; 1. 决策树 1.1 ID3决策树&#x…

Java 防御XSS攻击实战与示例代码

XSS, 跨站脚本攻击, 简单来说, 就是非本站点的脚本被执行了。 关于XSS 的详细介绍和防御参考: XSS(跨站脚本)攻击与预防 和 跨站脚本攻击(XSS)及防范措施。 本篇介绍在Java 项目中如何快速修复XSS 漏洞。本篇使用的是黑名单的方式, 对于非法字符进行转义。 黑名单的方式…

Win10的IE以及其他浏览器无法使用的解决方法

前言 最近&#xff0c;突然无法使用Win10的IE&#xff0c;网络连接正常&#xff0c;重置过IE&#xff0c;恢复过高级选项设置&#xff0c;检查过无代理设置&#xff0c;清理过缓存删除IE个人设置&#xff0c;以及清理过DNS解析缓存&#xff0c;IE都会显示无法访问此页面的网络…

Django3还可以这样学之Django的创建

Django (Flask说&#xff1a;“其实我是你的双胞胎哥哥啊”) 一、前言 传统的web框架为MVC设计模式&#xff0c;即M是指业务模型&#xff0c;V是指用户界面&#xff0c;C则是控制器。虽然这种设计模式耦合性低、可重用性高、部署快等特点&#xff0c; 但是完全理解该设计模式…

【机器学习】贝叶斯算法详解 + 公式推导 + 垃圾邮件过滤实战 + Python代码实现

文章目录一、贝叶斯简介二、贝叶斯公式推导三、拼写纠正案例四、垃圾邮件过滤案例4.1 问题描述4.2 朴素贝叶斯引入五、基于朴素贝叶斯的垃圾邮件过滤实战5.1 导入相关库5.2 邮件数据读取5.3 构建语料表&#xff08;字典&#xff09;5.4 构建训练集的特征向量5.5 朴素贝叶斯算法…

web服务器的相关配置

一&#xff1a;简单介绍web服务 1、什么是www www是world wide web的缩写&#xff0c;也就是全球信息广播的意思。通常说的上网就是使用www来查询用户所需要的信息。www可以结合文字、图形、影像以及声音等多媒体&#xff0c;并通过可以让鼠标单击超链接的方式将信息以Interne…

数字化时代,企业如何培养员工的数据思维意识

很多的企业&#xff0c;他们都有意识想通过大数据或者商业智能BI来推动一些数据信息化的项目建设&#xff0c;比如企业的财务分析、经营管理分析、供应链分析、运营、市场分析等等&#xff0c;这都是很好的表现。 但在实际跟进和深入沟通的时候就发现很多分析的想法是没有办法…

OpenCV(9)-图像轮廓

图像轮廓 图像轮廓概述 图像轮廓是具有相同颜色或强度的连续点的曲线 作用&#xff1a; 可以用于图形分析物体的识别与检测 注意&#xff1a; 为了检测的准确性&#xff0c;需要先对图像进行二值化或Canny操作画轮廓时会修改输入的图像 轮廓查找API&#xff1a; findConto…

FastDFS简介/架构/安装/代码

1简介/架构 1.1简单介绍 分布式文件系统&#xff0c;看名字就知道&#xff0c;它可以存储在不同的机器上。肯定也要有路由功能。 特点 备份容错&#xff0c;负载均衡&#xff0c;动态扩容 场景 0-500MB之间大小的文件存储&#xff08;图片&#xff0c;短视频&#xff0c;文…

LeetCode[703]数据流中的第K大元素

难度&#xff1a;简单题目&#xff1a;设计一个找到数据流中第 k大元素的类&#xff08;class&#xff09;。注意是排序后的第 k大元素&#xff0c;不是第 k个不同的元素。描述&#xff1a;请实现 KthLargest类&#xff1a;KthLargest(int k, int[] nums) 使用整数 k 和整数流 …

【北邮果园大三上】数据挖掘

数据挖掘 大数据 定义&#xff1a; 体积时效性种类值 数据挖掘模型 1.归纳已知 2.预测未来 1. 数据的质量处理和度量方法 1.1数据 1.1.1数据属性 属性类型: 标称(nominal)序数(ordinal)区间(interval)比率(ratio) 非对称的属性(asymmetric attribute): 对于非对称的…

airserver怎么下载使用?IOS设备无线传送到Mac电脑的屏幕上教程

AirSever是一种通用的镜像接收器&#xff0c;非常适合镜像iPhone或Android视频文件。 它可以将简单的大屏幕或投影仪变成通用的屏幕镜像接收器。 使用启用了AirSever的设备&#xff0c;您可以用户拥有iPhone&#xff0c;iPad&#xff0c;Mac&#xff0c;Android&#xff0c;Nex…

Proxy详解

Proxy Proxy(代理&#xff09;&#xff0c;首先理解代理是什么意思&#xff0c;才能更便于了解Proxy的作用。 Proxy是一个代理&#xff0c;可以这么理解&#xff0c;就相当于它是一个快递代理点&#xff0c;快递会运输到该代理点&#xff0c;我们取件只需要去对应的代理点取件…