由浅到深认识Java语言(27):异常

该文章Github地址:https://github.com/AntonyCheng/java-notes

在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址:https://blog.csdn.net/AntonyCheng/article/details/136555245),该模板集成了最常见的开发组件,同时基于修改配置文件实现组件的装载,除了这些,模板中还有非常丰富的整合示例,同时单体架构也非常适合SpringBoot框架入门,如果觉得有意义或者有帮助,欢迎Star & Issues & PR!

上一章:由浅到深认识Java语言(26):阶段性练习

39.异常

异常的概念

定义: Java 程序在运行过程中出现的特殊情况,当出现特殊情况时,就需要为不同的情况提供不同的解决方案,以保证程序能够正常运行,即预防异常的状况;

特殊情况指的是用户输入的问题,网络连接的问题,文件未找到的问题等;

这种特殊情况可以在运行时报错时在 Console 控制台内看到;

预防异常示例如下:

package top.sharehome.Bag;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Demo {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入一个数字:");
		try {
			int num = sc.nextInt();
			int i = 10;
			int result = i/num;
			System.out.println(result);
		}catch (InputMismatchException e) {
			// TODO: handle exception
			System.out.println("输入的内容不相符");
		}catch (ArithmeticException e) {
			// TODO: handle exception
			System.out.println("不能是零!");
		}
		System.out.println("!!!!!!!");
	}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

异常的分类

广义分类: 父类:Throwable

  • Error 错误,这是我们不需要解决的,因为没有办法解决;
  • Exception 异常,这是我们应该(必须)解决的;

异常分类:

  • 编译时异常:在编译时出现的异常,即编译无法通过,编译时必须处理异常才能开始运行,所以编译时异常能够绝对杜绝异常情况的出现;

  • 运行时异常:编译可以通过,即在编译时可以不用处理,在运行时出现了异常,需要事后解决,所以运行时异常并不能够得到绝对的避免,所以我们需要掌握一些常用的运行时异常;

    运行时异常属于 RuntimeException 子类;除了运行时异常以外的所有异常都是编译时异常;

常用的运行时异常

  • 空指针异常(java.lang.NullPointerException):

    示例如下:

    package top.sharehome.Bag;
    
    public class Demo {
    	public static void main(String[] args) {
    		String str = null;
    		char[] cs = str.toCharArray();
    	}
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 数组下标越界异常(java.lang.ArrayIndexOutOfBoundsException):

    示例如下:

    package top.sharehome.Bag;
    
    public class Demo {
    	public static void main(String[] args) {
    		char[] c = new char[5];
    		System.out.println(c[5]);
    	}
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 输入不匹配异常(java.util.InputMismatchException):

    示例如下:

    package top.sharehome.Bag;
    
    import java.util.Scanner;
    
    public class Demo {
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
    		System.out.println("我们应该输入一个数字,但我却要输入一个字母:");
    		int nextInt = sc.nextInt();
    	}
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 算数异常(java.lang.ArithmeticException):

    示例如下:

    package top.sharehome.Bag;
    
    public class Demo {
    	public static void main(String[] args) {
    		int num = 1/0;
    	}
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 类型转换异常(java.lang.ClassCastException):

    示例如下:

    package top.sharehome.Bag;
    
    public class Demo {
    	public static void main(String[] args) {
    		A a = new B();  //向上转型
    		C c = (C)a;		//向下转型的
    	}
    }
    
    class A{
    	
    }
    
    class B extends A{
    	
    }
    class C extends A{
    	
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

查询其他运行时异常的方法

  1. 在 Eclipse 中使用 Ctrl+Shift+T 调出 Open Type 窗口;

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  2. 在搜索框中输入 Exception ,找到该类;

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  3. 进入类之后,然后使用 Ctrl+T,调出其子类;

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  4. 再在搜索框中搜索 RuntimeException 后进入,若要查询编译时异常,则查询除 RuntimeException 以外的异常即可;

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  5. 进入该子类之后,再次使用 Ctrl+T 即可看到该类中所包含的运行时异常;

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

异常生成机制

抛抓模式

当异常对象被创建并抛出时,程序就会遇到这个异常,遇到异常之后,如果没有任何的处理方法,那么 main 方法碰到异常程序终止,如果遇到异常后有处理方案(try-catch),那么就会去匹配 catch 分支,查看 catch 里的异常类型是否与抛出的异常类型相同,如果相同,就运行该 catch 分支中的语句,就表示该异常被处理,如果所有的 catch 分支都没有与该异常类型匹配,那么该异常还是会来到 main 方法中,然后程序终止;

当异常被处理时,catch 里的异常对象能够获取一些该异常的信息, catch 中的异常对象的常用方法:

  • e.getMessage();
  • e.printStackTrace();

异常的处理方案

示例如下:

以 io 流(后续学习)访问系统内存为例,D: 盘中没有 abc.java 这个文件,我们来访问它;

package top.sharehome.Bag;

import java.io.FileInputStream;

public class Demo {
	public static void main(String[] args) {
		FileInputStream fis = new FileInputStream("d:/abc.java");
	}
}

报错效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里给了我们两个选择,一种是将异常向上抛,一种是 try-catch-finally 处理方式

热处理异常

即使用 try-catch-finally 结构;

  • try-catch-catch-…… 语法:

    我们将可能出现异常的代码语句放入 try 语句中,如果没有出现异常,就按照原计划执行;

    若出现异常就会选择进入后续的 catch 语句,若出现相匹配的异常类型,则执行对应 catch 内容,同时舍弃该 catch 之后的 catch 代码;若没有出现相匹配的异常,该程序就会被系统自动处理,在控制台进行报错;

    示例如下:以输入不匹配异常为例;

    package top.sharehome.Bag;
    
    import java.util.InputMismatchException;
    import java.util.Scanner;
    
    public class Demo {
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
    		System.out.println("输入数字正常执行,非数字异常执行:");
    		try {
    			int num = sc.nextInt();
    			System.out.printf("num = %d",num);
    		} catch (InputMismatchException e) {
                //这里已经找到所匹配的异常,即使下面的 Exception 也满足条件,也不会执行了
    			// TODO: handle exception
    			System.out.println("输入错误!!");
    		}catch (ArrayIndexOutOfBoundsException e) {
    			// TODO: handle exception
    			System.out.println("指针内存溢出!");
    		}catch (NullPointerException e) {
    			// TODO: handle exception
    			System.out.println("空指针异常!");
    		}catch (ArithmeticException e) {
    			// TODO: handle exception
    			System.out.println("计算异常!");
    		}catch (Exception e) {
    			// TODO: handle exception
    			System.out.println("出现异常!");
    		}
    	}
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • try-finally 语法:

    finally 后的代码指的是无论出现异常,都必须要执行的代码,在该语法结构中,finally 的优先级甚至大于 return;

    一串正常代码中,一旦遇到 return ,就会终止程序,返回该返回的值,但是在该结构中即使返回了应该返回的值,依然还会执行 finally 中的代码;

    示例如下:

    package top.sharehome.Bag;
    
    public class Demo {
    	public static void main(String[] args) {
    		int num = method();
    		System.out.println("num+num=" + num);
    	}
    
    	public static int method() {
    		try {
    			int num = 10 / 5;
    			return num + num;
    		} finally {
    			// TODO: handle finally clause
    			System.out.println("我必须得执行!");
    		}
    	}
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • try-catch-catch-……-finally 语法:

    该结构是以上两种情况的结合;

    示例如下:

    package top.sharehome.Bag;
    
    import java.util.InputMismatchException;
    import java.util.Scanner;
    
    public class Demo {
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
    		System.out.println("输入数字正常执行,非数字异常执行:");
    		try {
    			int num = sc.nextInt();
    			System.out.printf("num = %d",num);
    		} catch (InputMismatchException e) {
                //这里已经找到所匹配的异常,即使下面的 Exception 也满足条件,也不会执行了
    			// TODO: handle exception
    			System.out.println("输入错误!!");
    		}catch (ArrayIndexOutOfBoundsException e) {
    			// TODO: handle exception
    			System.out.println("指针内存溢出!");
    		}catch (NullPointerException e) {
    			// TODO: handle exception
    			System.out.println("空指针异常!");
    		}catch (ArithmeticException e) {
    			// TODO: handle exception
    			System.out.println("计算异常!");
    		}catch (Exception e) {
    			// TODO: handle exception
    			System.out.println("出现异常!");
    		}finally {
    			System.out.println("运行时异常排除完毕!");
    		}
    	}
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

冷处理编译时异常

向上抛

先用未能找到文件异常(编译时异常)来引出问题,以 io 流(后续学习)访问系统内存为例,D: 盘中没有 abc.java 这个文件,我们来访问它;

示例如下:

package top.sharehome.Bag;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class Demo {
	public static void main(String[] args) throws FileNotFoundException {
		m1();
	}
	static void m1() throws FileNotFoundException {
		m2();
	}
	static void m2() throws FileNotFoundException {
		m3();
	}
	static void m3() throws FileNotFoundException {
		m4();
	}
	static void m4() throws FileNotFoundException {
		FileInputStream fis = new FileInputStream("d:/abc.java");
	}
}

此时编译时异常就不会出现报错,运行程序若没有出现异常就不会报错,若出现异常就终止程序;

由于该异常申请是从各个方法抛出,直到抛给 main 方法才得以解决,所以称之为向上抛

我们也可以在中途使用热处理将其解决:

package top.sharehome.Bag;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class Demo {
	public static void main(String[] args) {
		m1();
	}

	static void m1() {
		try {
			m2();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	static void m2() throws FileNotFoundException {
		m3();
	}

	static void m3() throws FileNotFoundException {
		m4();
	}

	static void m4() throws FileNotFoundException {
		FileInputStream fis = new FileInputStream("d:/abc.java");
	}
}

此时就结束向上抛异常这样的操作;

自定义异常

**示例如下:**设计一个遇到负数就报错的异常;

NegativeNumberException 类:

package top.sharehome.Bag;

public class NegativeNumberException extends Exception{
	//因为继承的是Exception,所以这里是一个编译时异常
	//如果继承RuntimeException,这里就是一个运行时异常
	//以下代码均是继承后的方法重写代码
	public NegativeNumberException() {
		super();
		// TODO Auto-generated constructor stub
	}

	public NegativeNumberException(String message, Throwable cause, boolean enableSuppression,
			boolean writableStackTrace) {
		super(message, cause, enableSuppression, writableStackTrace);
		// TODO Auto-generated constructor stub
	}

	public NegativeNumberException(String message, Throwable cause) {
		super(message, cause);
		// TODO Auto-generated constructor stub
	}

	public NegativeNumberException(String message) {
		super(message);
		// TODO Auto-generated constructor stub
	}

	public NegativeNumberException(Throwable cause) {
		super(cause);
		// TODO Auto-generated constructor stub
	}	
}

Demo 类:

package top.sharehome.Bag;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Demo {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		try {
			int num = sc.nextInt();
            //这里需要判断一下抛出自定义异常的条件和内容
			if (num < 0) {
				throw new NegativeNumberException("该数不能是负数!");
			}
		} catch (InputMismatchException e) {
			System.out.println("输入不匹配;");
		} catch (NegativeNumberException e) {
            // 以下是自定义异常的效果;
			// TODO: handle exception
			String message = e.getMessage();
			System.out.println(message);
		}
	}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下一章:由浅到深认识Java语言(28):集合

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

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

相关文章

mysql如何存Emoji表情

如何存Emoji表情 背景解决方案一&#xff1a; 如果是自己搭建的数据库&#xff0c;参考如下。 1&#xff1a;先创建数据库&#xff0c;utf8编码2&#xff1a; 修改mysql 的配置文件 /etc/my.cnf 文件3&#xff1a;然后把你的表和字段也要支持utf8md4编码4&#xff1a;修改你连…

分页功能制作

使用HTML&#xff0c;css&#xff0c;js和json假数据制作分页功能。 以下为分页功能结构&#xff0c;下面可以点击上一页&#xff0c;下一页及数字&#xff0c;还可以自己输入想要跳转的页面点击跳转。下面每页显示的内容也会跟着改变。还可以选择不同的每页显示数据的条数。默…

备考ICA----Istio实验11---为多个主机配置TLS Istio Ingress Gateway实验

备考ICA----Istio实验11—为多个主机配置TLS Istio Ingress Gateway实验 1. 部署应用 kubectl apply -f istio/samples/helloworld/helloworld.yaml -l servicehelloworld kubectl apply -f istio/samples/helloworld/helloworld.yaml -l versionv12. 证书准备 接上一个实验…

【孙子级介绍语言模型的原理,实战和评估】

&#x1f525;博主&#xff1a;程序员不想YY啊&#x1f525; &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家&#x1f4ab; &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 &#x1f308;希望本文对您有所裨益&#xff0c;如有…

超级爆火项目 壁纸取图小程序源码系统 带完整的安装代码包以及安装部署教程

在当今数字化时代&#xff0c;手机壁纸已经成为人们展示个性和品味的重要载体。为了满足广大用户对精美壁纸的需求&#xff0c;小编给大家分享一款超级爆火的“壁纸取图小程序源码系统”。该系统不仅提供了完整的安装代码包&#xff0c;还附带了详尽的安装部署教程&#xff0c;…

2024大广赛设计趋势揭秘:助你称霸比赛!

2024大广赛火热进行中&#xff0c;今天就与大家分享几个当下最流行的设计趋势&#xff0c;希望这些流行的设计趋势助你一举夺魁&#xff0c;他们是适老化设计、电商类设计、车机主题设计与游戏类主题设计&#xff0c;大赛当前&#xff0c;不看说不过去哦~ 适老化设计 适老化设…

【LINUX笔记】汇编-裸机开发

裸机开发 chmod 777 imxdownload //给予 imxdownload 可执行权限&#xff0c;一次即可 ./imxdownload backlight.bin /dev/sdd //烧写到 SD 卡中&#xff0c; 不能烧写到/dev/sda 或 sda1 里面&#xff01;汇编笔记 启动方式

如何利用生成式人工智能挑选合适的候选人?

在当今激烈的商业竞争中&#xff0c;招聘合适的人才是构建企业成功的基石。筛选和面试候选人是一个复杂且精细的过程&#xff0c;它不仅关系到职位的有效填补&#xff0c;更影响到企业的长期发展和团队建设。 选择合适候选人的重要性 选择合适的候选人就像寻找一片沙滩上的珍…

俄罗斯市场免费开发方法及工具分享

俄罗斯市场大家最近很多人都在开发&#xff0c;尤其是去年的时候&#xff0c;非常的火爆&#xff0c;今年因为俄罗斯被追加了新一轮的制裁&#xff0c;可能收款方面有点问题&#xff0c;但是市场还是非常火热的&#xff0c;今天给大家分享一些俄罗斯市场免费开发方法以及工具。…

ELF 1技术贴|应用层更改引脚复用的方法

在嵌入式系统设计中&#xff0c;引脚复用功能通常是通过设备树(Device Tree)预先配置设定的。出厂的设备树中UART2_TX_DATA和UART2_RX_DATA两个引脚被复用成了UART2功能&#xff0c;如果想要在不更换系统镜像的情况下&#xff0c;将这两个引脚的功能转换为GPIO&#xff0c;并作…

Java项目:76 Springboot学生读书笔记共享

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本文从管理员、用户的功能要求出发&#xff0c; 读书笔记共享平台系统中的功能模块主要是实现管理员&#xff1b;首页、个人中心、用户管理、笔记分享…

C语言调用云端 Python接口

利用C语言调用阿里云Python接口&#xff0c;来实现垃圾的智能识别 文章目录 利用C语言调用阿里云Python接口&#xff0c;来实现垃圾的智能识别1、如何开启阿里云服务2、实验程序介绍2.1 py程序改造2.2 c语言调用py2.3 测试代码 3、实验结果 1、如何开启阿里云服务 大家可以自行…

【C++】从C到C++、从面向过程到面向对象(类与对象)

文章目录 C入门知识C与C的关系1. 类的引入&#xff1a;从结构体到类2. 类的声明和定义3. 类的作用域4. 类的访问限定符5. 面向对象特性之一&#xff1a;封装6. 类的实例化&#xff1a;对象7. 计算类对象的内存大小8. 成员函数中暗藏的this指针9. 类的六个默认生成的成员函数9.1…

NVIDIA 发布 Project GR00T 人形机器人基础模型和 Isaac 机器人平台重大更新

系列文章目录 前言 Isaac 机器人平台现可为开发者提供全新的机器人训练仿真器、Jetson Thor 机器人计算机、生成式 AI 基础模型和由 CUDA 加速的感知和操作库。 Project GR00T 是一种多模态人形机器人通用基础模型&#xff0c;作为机器人的大脑&#xff0c;使它们能够学习技能…

【Redis安装】Ubuntu下Redis编译安装

Redis编译安装 文档说明 本文作者:SwBack 创作时间:2024/3/26 17:19:19 知乎:https://www.zhihu.com/people/back-88-87 CSDN:https://blog.csdn.net/qq_30817059 百度搜索: SwBack系统: Ubuntu redis: 2.8.17 下载redis源代码,并进行解压 wget http://download.redis.io/re…

百人一岗,Android开发者的困境。。。。。

前言 在当前的Android开发领域&#xff0c;竞争的激烈程度已经达到了前所未有的水平&#xff0c;几乎到了100个开发者竞争1个岗位的地步。 这种“内卷”现象的背后&#xff0c;是技术的快速发展和市场对Android开发者技能要求的不断提升。随着移动应用的普及和多样化&#xf…

SV-7041VP SIP塑料壳sip音箱支持POE供电(白色弧形)

SV-7041VP SIP塑料壳sip音箱支持POE供电 &#xff08;白色弧形&#xff09; 一、描述18123651365微信 SV-7041VP是深圳锐科达电子有限公司的一款壁挂式SIP网络有源音箱&#xff0c;具有10/100M以太网接口&#xff0c;可将网络音源通过自带的功放和喇叭输出播放&#xff0c;可…

day11-数据统计(图形报表)

1. Apache ECharts 1.1 介绍 Apache ECharts 是一款基于 Javascript 的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表。 官网地址&#xff1a;https://echarts.apache.org/zh/index.html 常见效果展示&a…

如何本地部署开源AI知识库 FastGPT(新手教程)

环境: Win10 WSL2 ubuntu22.04 问题描述: 如何本地部署开源AI知识库 FastGPT 解决方案: 一、安装docker和docker-compose 安装docker 1.apt install docker.io2.apt install docker-compose3.docker --version4.docker compose version

基于nodejs+vue学生信息管理系统python-flask-django-php

本论文对学生信息管理系统的需求分析、功能设计、系统设计进行了详细的阐述&#xff0c;并对系统的总体设计进行了阐述&#xff0c;并对各功能的实现和主要功能进行了说明&#xff0c;并附上了相应的操作界面图。 前端技术&#xff1a;nodejsvueelementui, Express 框架于Node运…