Java中的异常

2023-10-27


  

1 什么是异常

  前遇到过的异常:
  1、空指针异常, NullPointerException
  2、类型转换异常, ClassCastException
  3、遇到这些异常使程序中断了

  异常就是在程序运行过程中出现不正常现象导致了程序中断

2 异常的类结构

  在Java中, 把经常出现的一些异常现象进行了抽象就形成了异常类
在这里插入图片描述

3 运行时异常的特点

  1、运行时异常就是RuntimeException类及它的子类
  2、运行时不需要预处理, 通过规范代码可以避免

/**
 * 演示运行时异常
 *
 */
public class Test01 {
	public static void main(String[] args) {
//		divide1(10, 2);
		divide1(10, 0); 	//执行语句时, 除数为0,会产生算术异常, 导致了程序中断
		
		divide2(10, 0);
		
		System.out.println("main方法后面的代码");
	}
	
	//定义方法, 计算两个整数相除的结果
	public static void divide1( int x , int y) {
		System.out.println(x + " / " + y + " = " + (x/y) );
	}
	
	//运行时异常,可以通过规范的代码避免
	public static void divide2( int x , int y) {
		//整数相除, 如果除数为0,会产生算术异常
		if ( y == 0 ) { 		//通过判断, 如果除数为0, 给用户一个提示信息, 不再进行计算
			System.out.println("除数不能为0");
			return;
		}
		System.out.println(x + " / " + y + " = " + (x/y) );
	}
}
Exception in thread "main" java.lang.ArithmeticException: / by zero
	at chapter02.demo01.Test01.divide1(Test01.java:18)
	at chapter02.demo01.Test01.main(Test01.java:9)

Process finished with exit code 1

4 编译时异常特点

  1、编译时异常,也叫受检异常, 即在方法定义时,通过throws声明抛出的异常
  2、在编译前必须对受检异常进行预处理, 即在开发程序时,要指定如果产生了异常应该怎么办

	注意:
		1、编译时异常并不是说在编译阶段发生异常, 所有的异常都是在运行时才会发生.
		2、编译就是把.java编译为.class字节码文件, 编译时要进行语法检查,
	    3、Java语法有很多条, 其中一条语法是说必须对受检异常进行预处理
	  
/**
 * 演示编译时异常
 *
 */
public class Test02 {

	public static void main(String[] args) throws IOException {
		//假设读取d:/abc.txt文件的内容, 需要使用FileInputStream类
		
		FileInputStream fis = new FileInputStream("d:/abc.txt");
		/*
		 * 上行代码出现了语法错误
		 * 		FileInputStream构造方法在定义时, 通过throws语句声明抛出了FileNotFoundException异常, 该异常就是受检异常
		 * 	受检异常就是方法定义时,通过throws声明抛出的异常
		 * 	在调用方法时, 必须对受检异常进行预处理 ,否则编译报错
		 */
		
		m1();
	}

	//定义方法时, 通过throws声明抛出了一个异常, 这个异常就是受检异常
	public static void m1() throws  IOException {
		
	}
}

5 对受检异常进行处理

5.1 try…catch 捕获处理

/**
 * 演示捕获异常
 */
public class Test03 {

	public static void main(String[] args) {
		
		try {
			System.out.println("try代码块中,可能有语句的受检异常需要预处理");
			FileInputStream  fis  = new FileInputStream("d:/abc.txt");
			System.out.println("如果上行代码产生了异常,就直接跳转到catch子句,try代码块后面的代码不再执行");
			
			System.out.println("try代码块中中,可能会有多个受检异常需要预处理, 可以通过多个catch分别捕获");
			fis.read(); 
			
		} catch (FileNotFoundException e) {
			//如果产生 了 文件找不到 异常, 进行处理
			//开发阶段,捕获了异常,一般是打印异常栈跟踪信息, 方便调试
			e.printStackTrace();
		} catch (IOException e) {
			//如果产生了 IO 异常, 进行处理
			//FileNotFoundException继承了IOException,捕获的异常有继承关系, 应该先捕获子异常, 再捕获父异常
			e.printStackTrace();
		}
		
		System.out.println("main方法后面的代码.......");
		
	}

}

5.2 finally子句处理

/**
 * finally子句
 * 	在异常捕获处理中, finally子句不是必须的, 可以这样使用:
 * 		try...catch....,   
 *  	try... catch...finallly,    
 * 		try...finally...
 * 
 * 	一般在finally子句中释放系统资源
 *
 */
public class Test04 {

	public static void main(String[] args) {
		
		try {
			FileInputStream fis = new FileInputStream("d:/def.txt");
			
		} catch ( FileNotFoundException e) {
			e.printStackTrace();
		}finally {
			System.out.println("finally子句");
		}
		
		System.out.println("main...end....");
	}

}

5.3 finally子句

/**
 * finally子句
 *
 */
public class Test05 {

	public static void main(String[] args) {
		
		int x = m1(10);
		
		System.out.println( x );		//10
	}

	private static int m1(int i) { 		//i=10
		try {
			return i;
		} finally {
			i += 10;
			System.out.println(i);
		}
		/*
		 * 程序执行到return  i;时, 并没有执行return语句, 而是把i的值保存到临时变量中
		 * 执行finally子句, 把i的值变为20
		 * 再执行return语句, 返回的不是i现在的值, 而是返回临时变量的值
		 */
	}

}
20
10

Process finished with exit code 0

5.4 throws抛出处理

/**
 * throws抛出处理
 *
 */
public class Test06 {

	//main方法把异常抛出JVM, JVM默认的处理方式是中断程序,打印异常跟踪信息
	public static void main(String[] args)  {
		System.out.println("在main方法中调用m1方法");
		try {
			m1();
		} catch (FileNotFoundException e) {
			//对m1()方法产生的异常捕获后, 不再继续上抛
			e.printStackTrace();
		}
		System.out.println("main方法运行结束");
	}
	

	private static void m1() throws FileNotFoundException {
		System.out.println("在m1方法中调用m2方法");
		m2();
		System.out.println("m1方法运行结束");
	}
 
	//在定义m2方法时, 把方法体中的受检异常声明抛出, 抛出给调用者
	private static void m2() throws FileNotFoundException {
		System.out.println("m2方法开始执行, 调用 FileINputStream");
		FileInputStream fis = new FileInputStream("d:/def.txt");
		System.out.println("m2运行结束 ");
	}

}
/**
 * throws抛出处理
 *
 */
public class Test06 {

	//main方法把异常抛出JVM, JVM默认的处理方式是中断程序,打印异常跟踪信息
	public static void main(String[] args) throws FileNotFoundException {
		System.out.println("在main方法中调用m1方法");
		m1();
		System.out.println("main方法运行结束");
	}
	

	private static void m1() throws FileNotFoundException {
		System.out.println("在m1方法中调用m2方法");
		m2();
		System.out.println("m1方法运行结束");
	}
 
	//在定义m2方法时, 把方法体中的受检异常声明抛出, 抛出给调用者
	private static void m2() throws FileNotFoundException {
		System.out.println("m2方法开始执行, 调用 FileINputStream");
		FileInputStream fis = new FileInputStream("d:/def.txt");
		System.out.println("m2运行结束 ");
	}

}
在main方法中调用m1方法
在m1方法中调用m2方法
m2方法开始执行, 调用 FileINputStream
Exception in thread "main" java.io.FileNotFoundException: d:\def.txt (系统找不到指定的文件。)
	at java.io.FileInputStream.open0(Native Method)
	at java.io.FileInputStream.open(FileInputStream.java:195)
	at java.io.FileInputStream.<init>(FileInputStream.java:138)
	at java.io.FileInputStream.<init>(FileInputStream.java:93)
	at chapter02.demo01.Test06.m2(Test06.java:28)
	at chapter02.demo01.Test06.m1(Test06.java:21)
	at chapter02.demo01.Test06.main(Test06.java:14)

Process finished with exit code 1

6 异常处理的作用

  通过异常处理可以增加程序的键壮性, 鲁棒性(Robust)
  如果没有对异常进行处理,出现了异常会程序中断(崩溃); 进行了异常处理,程序不会中断,还会继续向下执行

7 如何选择捕获处理还是抛出处理

  在编程时,如何选择捕获处理还是抛出处理
  1、一般情况下, 在调用方法时, 如果被调用的方法有受检异常, 选择捕获处理;
  2、在定义方法时, 如果方法体中有受检异常的语句, 可以选择捕获处理, 也可以选择抛出处理,
  3、如果方法体中通过throw抛出一个异常对象,所在方法通过throws声明抛出该异常

8 方法覆盖中的异常处理

  1、方法签名必须相同
  2、返回值类型可以相同,也可以是子类型
  3、访问权限可以相同,也可以更大
  4、异常不能更大,可以更小

/**
 * 作为父类子类重写父类 的方法
 *
 */
public class Father {
	
	public void m1(int x ) {
		
	}
	
	public void m2()  throws IOException{
		
	}

public class Son extends Father{
	//可以重写父类的方法
	@Override
	public void m1(int x) {
		//该方法在父类中没有抛出异常, 重写后也不能抛出异常
	}
	
	@Override
//	public void m2() throws IOException {
//	public void m2() throws FileNotFoundException {
	public void m2()  {
		//父类方法抛出了异常,重写后,可以抛出相同的异常
		//也可以抛出子异常
		//子类方法,也可以不抛出异常
	}
}

9 异常在开发中的作用

//1)定义一个类继承Exception
public class AgeOutOfBoundsException extends Exception {
	//2)一般情况下,只提供两个构造方法
	public AgeOutOfBoundsException() {
		super();
	}
	//有参数的构造方法, 这个String字符串参数就是异常的信息
	public AgeOutOfBoundsException(String message) {
		super(message);
	}

}
public class Person {
	private String name;
	private int age;
	private String gender; 		//性别
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", gender=" + gender + "]";
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	//4)throw所在的方法通过throws声明抛出该异常
	public void setAge(int age) throws AgeOutOfBoundsException {
		//对参数数据进行合理性验证
		if ( age >= 0 && age < 130) {
			this.age = age;			
		}else {
			//年龄不合适, 抛出一个异常
			//3)通过throw抛出一个异常对象
			throw  new AgeOutOfBoundsException("年龄越界");
		}
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	
}

public class Test {

	public static void main(String[] args) {
		//创建对象,直接给对象的字段赋值
/*		Person p1 = new  Person();
		p1.name = "lisi";
		p1.age = 188888; 		//age表示人的年龄,可能会赋一些无效的值
		p1.gender = "男";
		System.out.println( p1 );*/
		
		//创建对象,调用setter方法实现赋值
		Person p2 = new  Person();
		p2.setName("lisi");
		try {
			p2.setAge(188888);
		} catch (AgeOutOfBoundsException e) {
			e.printStackTrace();
		}
		p2.setGender("妖");
		System.out.println( p2 );
		
	}

}
chapter02.demo03.AgeOutOfBoundsException: 年龄越界
	at chapter02.demo03.Person.setAge(Person.java:28)
	at chapter02.demo03.Test.main(Test.java:20)
Person [name=lisi, age=0, gender=妖]

Process finished with exit code 0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中的异常 的相关文章

  • java热部署

    Class forName和ClassLoader loadClass 简书 Eclipse安装热部署热加载插件JRebel 免费版 idea也可用 that summer CSDN博客 Eclipse中使用JRebel实现项目热部署 Ma
  • JAVA-面向对象

    面向对象编程与面向过程编程只是一种在思维方式上的划分 面向过程是以分步骤的方式解决问题 而面向对象是以分步骤的方式解决问题 面向对象的三大特性是 封装 继承 多态 封装 就是将客观事物封装成抽象的类 抽象类可以将自己的数据和方法只让自己信任
  • JavaSE——StringBuffer与StringBuilder拼接字符串详细解释

    目录 一 基本了解 1 1使用字符串频繁拼接会出现什么问题 1 2 了解StringBuffer 1 3 了解StringBuilder 1 4 StringBuffer与StringBuilder的区别 二 StringBuffer的使用
  • win下查看 MySQL 数据文件存储位置

    一 在 MySQL 客户端输入以下命令 show global variables like datadir mysql数据文件存储位置定位如下图所示 二 直接到C盘路径下查找 如果查找不到 将隐藏的文件夹显示即可 另外附带 查看mysql
  • Java中的抽象类和接口

    目录 一 什么是抽象类 抽象类在实现多态中的意义 二 接口是什么 通过接口实现多态 三 抽象类和接口的区别 各位铁汁们大家好呀 今天让我们继续学习java 看看java中的抽象类和接口到底是什么 一 什么是抽象类 我们之前学过什么是类 那么
  • 【JAVA】接口与多态

    接口 定义 接口用关键字interface定义 public interface 接口名 特点 接口不能实例化 创建对象 接口和类之间是实现关系 通过implements关键字表示 public class 类名 implements 接口
  • eclipse上配置JavaFX完整教程

    1 选择菜单栏Help中的Install New Software 2 点击Add添加安装JavaFx环境 name e fx clipse Location http download eclipse org efxclipse upda
  • jquery循环语句if-else if-else

    jquery循环语句if else if else callbackFun 函数 开始是写的if if else 结果是不管第一个if有没有匹配到 会再次判断 如果匹配到第二个if 则第二个if中的语句执行 没有匹配到第二个if 则else
  • Java--Map和HashMap基础

    一 Map常用方法 1 Map集合在 java util Map 包下 Map集合以键值对 key和value 的方式存储数据 key和value都是引用数据类型 都是存储对象的内存地址 2 Map接口中常用方法 V put K key V
  • Java的Properties属性集、获取项目路径的3种方式(干货满满)

    属性集介绍 集合家族中有个成员java util Properties 它继承于Hashtable Properties是使用键值结构存储数据的 但它最大的特点是具有持久化功能 持久化 内存 gt 硬盘 持久化的过程必须依赖于IO流 对IO
  • Java五子棋详细步骤及完整代码

    五子棋 1 定义声明一个二维数组做棋盘 import java util Scanner public class Main public static void main String args 定义声明一个二维数组作为棋盘 int ga
  • 自定义ClassLoader,用于加载用户JAR包

    原文地址 http obullxl iteye com blog 651128 Copyright c YMCN Team All rights reserved package com aboy toolkit util import j
  • 多态(polymorphic)

    目录 1 多态的基本介绍 2 多态实现条件 3 重写 重写的介绍 重写和重载的区别 动 静态绑定机制 5 向上转型和向下转型 向上转型 向上转型的特点 总结 向下转型 多态的优缺点 多态是Java三大基本特征中最抽象也是最重要的特征 多态是
  • JDBC那些事(二)——查询结果集_ResultSet

    接上一篇 JDBC的查询返回值相对复杂一点 所以单独写 上一篇写到stmt excuteUpdate sql 执行结果返回的是int类型的值 此处的sql语句为非查询语句 而如果要执行查询语句则需要使用Statement对象的excuteQ
  • Java的异常(分类、处理原则、应用实例、注意事项)

    学习笔记 异常 异常 是在运行时期发生的不正常情况 在java中用类的形式对不正常情况进行了描述和封装对象 描述不正常的情况的类 就称为异常类 以前 通常将正常流程代码和问题处理代码相结合 现在将正常流程代码和问题处理代码分离 提高阅读性
  • JavaSE基础知识(个人总结)

    声明 1 本文为我的个人复习总结 并非那种从零基础开始普及知识 内容详细全面 言辞官方的文章 2 由于是个人总结 所以用最精简的话语来写文章 3 若有错误不当之处 请指出 基础 杂记 JRE JVM 常用类库 JDK JRE 诸多工具 如j
  • Tank大战游戏模拟(java版)

    Java小项目 坦克大战 1 任务分析 玩家进入游戏 通过操纵坦克来守卫基地 摧毁全部敌方坦克来取得胜利 如果基地被摧毁 或者玩家坦克被摧毁 则判定游戏失败 2 具体分析 图形用户界面使用GUI技术实现 游戏中坦克的方向转动可以通过四种不同
  • 树型结构——二叉数

    之前就说过我们的数据结构分为两种 分别是线性结构和非线性结构 我们今天要学的第一种线性结构就是树型结构 1 树型结构 树型结构并非我们熟悉的重点 所以在这里只做了解 概念 树是一种非线性的数据结构 它是由n n gt 0 个有限结点组成一个
  • java虚拟机+分隔符

    java 入门 java 虚拟机 1 java虚拟机的平台可移植性 只要将java虚拟机安装于不同平台 我们编译的 class 文件就可以运行 2 jdk java开发 3 jre java运行时环境 jdk jre 下载安装后必须在环境变
  • java Socket 简单实现客户端与服务器间通信(仿聊天室)

    java Socket TCP协议简单实现客户端与服务器间的通信 打赏 执行效果 启动服务器和3个客户端 进行群聊和私聊 执行过程 服务端 首先创建服务器套接字ServerSocket对象并绑定端口 启动服务器 然后ServerSocket

随机推荐

  • 修改mysql的字符集和默认存储引擎

    author skate time 2012 05 18 修改mysql的字符集和默认存储引擎 1 修改mysql的字符集 mysql库现有字符集 mysql gt show variables like character Variabl
  • 多表的 inner join与left join;

    当前情况 目前有三个表 关系如下 1 sc表 有 student id class id 2 student表 有student id student name 3 class表 有class id class name class add
  • vue3+vite+ts项目配置开发环境和生产环境 打包命令配置

    开发环境和生产环境的配置和打包方式有所不同 下面是基于vue3 vite ts项目的开发环境和生产环境配置及打包方式的详细说明 开发环境配置 开发环境的配置主要是为了方便开发者进行调试和测试 以下是开发环境的配置步骤 1 1 安装依赖 首先
  • 51单片机“独立按键”控制静态数码管———显示数字0-9

    51单片机 独立按键 控制静态数码管学习总结 一 按键功能实现总结 独立按键 电路图解析及接线 二 程序编译与控制静态数码管显示1 2 0 9 的效果展示 三 按键程序逻辑设计与程序编译 四 程序烧录与保存 一 按键功能实现总结 独立按键
  • python 绘制两组数据的分布图

    可以使用 Python 中的 Matplotlib 库来绘制两组数据的分布图 下面是一个简单的示例代码 import matplotlib pyplot as plt 假设有两组数据 分别是 x 和 y x 1 2 3 4 5 y 2 4
  • JAVA用线程池模拟查询大批量数据

    JAVA用线程池模拟查询大批量数据 文章目录 JAVA用线程池模拟查询大批量数据 1 前言背景 1 1 线程 1 2 进程与线程的区别总结 1 3 使用多线程的好处 2 多线程的实现 2 1 操作流程 3 测试 1 前言背景 1 1 线程
  • QListWidget右键菜单

    关于QListWidget右菜单的的实现 网上多数资料都没有提到如何使用Qt Creator快速实现 如参考资料 1 2 本文重点介绍此方法 1 槽函数生成 通过Qt Creator的UI设计器将QListWidget控件拖放到主界面中 然
  • 刷题之77. 组合

    题目 给定两个整数 n 和 k 返回范围 1 n 中所有可能的 k 个数的组合 你可以按 任何顺序 返回答案 示例 1 输入 n 4 k 2 输出 2 4 3 4 2 3 1 2 1 3 1 4 来源 力扣 LeetCode 链接 http
  • Pytorch实现Seq2Seq

    前言 Seq2Seq模型用来处理nlp中序列到序列的问题 是一种常见的Encoder Decoder模型架构 基于RNN同时解决了RNN的一些弊端 输入和输入必须是等长的 Seq2Seq的模型架构可以参考Seq2Seq详解 也可以读论文原文
  • MyBatis中的$和#,你知道他们的区别吗?

    转自 MyBatis中的 和 你知道他们的区别吗 下文笔者将讲述MyBatis中的 和 的区别简介说明 如下所示 在MyBatis的xml配置文件中 我们经常看见 和 后面紧跟变量 那么他们有什么区别呢 下文笔者将一一道来 如下所示 1 是
  • C# 爬虫遇到EventStream数据时该怎么获取值

    声明 本文只作学习研究 禁止用于非法用途 否则后果自负 如有侵权 请告知删除 谢谢 今天调用某个网站的接口时发现数据格式是这种的 第一次遇到 正常的应该是这样的才对 有个 响应 然后响应里面是一些返回过来的数据 而这个就很奇怪 没有 响应
  • 07模板学习之模板类的static数据成员的归属问题

    07模板学习之模板类的static数据成员的归属问题 1 模板类的static数据成员的归属问题分析 从上面的图分析 先看类模板中的static int a 若类模板中声明了static数据 那么该a是属于类模板还是属于具体类呢 假设属于类
  • 菜鸟入门Docker

    菜鸟入门Docker 说明 一 什么是Docker 1 虚拟机和Linux容器 二 Docker用途 三 Docker安装 1 设置仓库 2 安装 Docker Engine Community 3 验证安装成功 四 Docker启动与停止
  • Linux必杀(十八):VI、VIM编辑器

    题记 基本上VI共分为3种模式 分别是一般模式 命令行模式和编辑模式 一 一般模式 以Vi打开一个文件就直接进入一般模式了 在这个模式下 可以使用上下左右按键来移动光标 可以删除字符或删除整行 也可以复制 粘贴文件数据 二 编辑模式 在一般
  • Dubbo中的一些常见问题?

    关于dubbo是用的什么协议 在使用dubbo的时候会配置
  • ubuntu 防火墙基本设置

    查看防火墙状态 ufw status 打开防火墙 sudo ufw enable 重启防火墙 sudo ufw reload 开放指定端口 ufw allow 8080
  • 使用C语言打印不同星号图案(矩形 平行四边形 三角形)

    献给大一或大二的学弟学妹们和在自学 C语言的同志们 打印自定义行数的矩形 打印效果 参考代码 include
  • echarts 图表无数据为空时显示“暂无数据”

    如标题所述 我们希望 echarts 图表在没有数据时显示 暂无相关数据 字样 操作 需要对返回的数据做判断 如果有数据则正常显示图表 如果没有数据 我们将此 div 的内容改为文本 暂无相关数据 并设置样式即可 HTML div div
  • 从感知机到Transformer,一文概述深度学习简史

    关注公众号 发现CV技术之美 本文转自机器之心 作者 Jean de Dieu Nyandwi 机器之心编译 这篇文章从感知机开始 按照时间顺序回顾了深度学习的历史 1958 年 感知机的兴起 1958 年 弗兰克 罗森布拉特发明了感知机
  • Java中的异常

    Java中的异常 1 什么是异常 2 异常的类结构 3 运行时异常的特点 4 编译时异常特点 5 对受检异常进行处理 5 1 try catch 捕获处理 5 2 finally子句处理 5 3 finally子句 5 4 throws抛出