【Java笔记】异常处理(try-catch-finally、throws、throw)

2023-05-16

在 Java 语言中,将程序执行中发生的不正常情况称为 “异常”。

注:开发过程中的语法错误和逻辑错误不是异常。

在编写程序时,经常要在可能出现错误的地方加上检测的代码,如进行 x/y 运算时,要检测分母为 0 ,数据为空,输入的不是数据而是字符等。过多的 if-else 分支会导致程序的代码加长、臃肿,可读性差。因此采用异常处理机制。

目录

异常事件的分类

常见异常的举例

异常处理:抓抛模型

try-catch-finally的使用

throws方式

如何选择使用哪种方式处理异常

throw 手动抛出异常对象 


异常事件的分类

1. Error:Java 虚拟机无法解决的严重问题,一般我们不编写针对性代码进行处理

2. Exception:其他因编程错误或偶然外在因素导致的一般性问题,我们编写针对性代码进行处理

常见异常的举例

java . lang . Throwable

        java . lang . Error

        java . lang . Exception

        编译时异常(checked)

                IOException

                        FileNotFoundException

                ClassNotFoundException

        运行时异常(unchecked)

                NullPointerException

                ArrayIndexOutOfBoundException

                ClassCastException

                NumberFormatException

                InputMismatchException

                ArithmeticException

异常处理:抓抛模型

抛:程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象,并将此对象抛出,一旦抛出对象后,其后的代码就不再执行

抓:可以理解为异常处理方式:try-catch-finally 和 throws

try-catch-finally的使用

使用 try-catch-finally 处理编译时异常,使得程序在编译时就不再报错,但是运行时仍可能报错。相当于我们使用 try-catch-finally 将一个编译时可能出现出现的异常,延迟到运行时出现

1. finally 是可选的,可以不出现,一旦出现,则一定会被执行

2. 使用 try 将可能出现异常的代码包装起来,在执行过程中,一旦出现异常,就会生成一个对应异常类的对象,根据此对象的类型,去 catch 中进行匹配

3. 一旦 try 中的异常对象匹配到某一个 catch 时,就进入 catch 中进行异常的处理。一旦处理完成,就跳出当前的 try-catch 结构(在没有写 finally 的情况下),继续执行其后的代码

4. catch 中的异常类型如果没有子父类关系,则谁声明在上,谁声明在下无所谓

    catch 中的异常类型如果满足子父类关系,则要求子类一定声明在父类的上面,否则报错

5. 常用的异常对象处理的方式:String getMessage()       printStackTrace()

6. 在 try 结构中声明的变量,在出了 try 结构以后,就不能再被调用

7. 像数据库连接、输入输出流、网络编程 Socket 等资源。JVM 是不能自动的回收的,我们需要自己动手进行资源的释放。此时的资源释放,就需要声明在 finally 中

import org.junit.Test;
public class ExceptionTest {
	@Test
	public void test() {
		String str = "123";
		str = "abc";
		try {
			int num = Integer.parseInt(str);
			System.out.println("hello");
		}catch(NumberFormatException e) {
			System.out.println("出现了数据格式错误");
			System.out.println(e.getMessage());
//			e.printStackTrace();
		}catch(NullPointerException e) {
			System.out.println("出现了空指针错误");
			e.printStackTrace();
		}catch(Exception e) {
			System.out.println("出现了异常");
		}finally {
			System.out.println("出现异常不要着急");
		}
	}
}

>>> 出现了数据格式错误
    For input string: "abc"
    出现异常不要着急

throws方式

throws + 异常类型

1. throws + 异常类型,写在方法的声明处。指明此方法执行时,可能会抛出的异常类型。一旦当方法执行时,出现异常,仍会在异常代码处生成一个异常类的对象,此对象满足 throws 后异常类型时,就会被抛出。异常代码后续的代码,就不再执行

2. throws 方式只是将异常抛给了方法的调用者,并没有真正将异常处理掉

import org.junit.Test;
public class ExceptionTest {
	@Test
	public void test() throws NumberFormatException,NullPointerException{
		String str = "123";
		str = "abc";
			int num = Integer.parseInt(str);
			System.out.println("hello");
	}
}

如何选择使用哪种方式处理异常

开发中如何选择使用 try-catch-finally 还是 throws ?

1. 如果父类中被重写的方法没有 throws 方式处理异常,则子类重写的方法也不能使用 throws ,意味着如果子类重写的方法中有异常,必须使用 try-catch-finally 方式处理

2. 执行的方法 a 中,先后又调用了另外的几个方法,这几个方法是递进关系执行。我们建议这几个方法使用 throws 的方法进行处理。而执行的方法 a 可以考虑使用 try-catch-finally 方式进行处理

throw 手动抛出异常对象 

1. 继承于现有的异常结构:RuntimeException 、Exception

2. 提供全局常量:serialVersionUID

3. 提供重载的构造器

public class ExceptionTest1 extends RuntimeException {
	public static void main(String[] args) {
		Student s = new Student();
		s.regist(-1001);
		System.out.println(s);
	}
}
class ExceptionTest extends RuntimeException { // 手动抛出异常对象
	static final long serialVersionUID = -579445735779656467L;
	public ExceptionTest() {
	}
	public ExceptionTest(String msg) {
		super(msg);
	}
}
class Student{
	private int id;
	public void regist(int id) throws ExceptionTest{ // 手动抛出异常
		if(id > 0) {
			this.id = id;
		}else {
			throw new ExceptionTest("您输入的数据非法!");
		}
	}
}

>>> Exception in thread "main" tryCatchThrows.ExceptionTest: 您输入的数据非法!
	at tryCatchThrows.Student.regist(ExceptionTest1.java:24)
	at tryCatchThrows.ExceptionTest1.main(ExceptionTest1.java:6)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Java笔记】异常处理(try-catch-finally、throws、throw) 的相关文章

随机推荐

  • checkbox的jsTree的一个调用

    lt DOCTYPE HTML PUBLIC 34 W3C DTD HTML 4 01 Transitional EN 34 gt lt html gt lt head gt lt meta http equiv 61 34 Content
  • 灵活使用递归算法,生成Excel文件中的复合表头

    最近 xff0c 在开发中 xff0c 需要导出数据到excel文件 xff0c 文件的表头的格式是不一致的 有复合表头 xff0c 也有单表头 xff0c 那么如何灵活地生成excel文件中的复合表头 首先有一个JSON字符串格式的字段描
  • 在 ibm http server 和 websphere 之间配置 ssl

    在WebSphere的环境中 xff0c 配置SSL xff0c 有一些细节需要注意 xff1a 1 最好是先安装 ibm http server7 32bit xff0c websphere7 再安装插件 2 http server 需要
  • Ext4使用总结(二)简单的hbox布局

    布局的合理利用 xff1a 如图 xff1a xtype 39 container 39 margins 39 5 0 0 0 39 layout align 39 stretch 39 type 39 hbox 39
  • 软件开发者的精力管理(一)

    精力管理对于软件开发者来讲是非常重要的 不希望自己被长周期的项目拖垮 xff0c 不希望被连续的加班所累 我个人认为泛义的时间管理是涉及到多个方面的 而心理学 精力管理则是非常重要的 作为一名从事了多年软件开发的从业者 xff0c 我的一个
  • 如何高效能地学习和使用"工具"?

    在软件开发中 xff0c 应该注意工具的合理使用 xff0c 使得自己变得高效起来 1 工具也是产品 xff0c 有许多的工具是产品化的 既然是产品 xff0c 就很多的服务 xff0c 例如帮助文档 xff0c 论坛 xff0c 咨询人员
  • Ext4使用总结(十二) 采用 CellEditing 方式的Grid,如何取得修改的单元格数据值

    使用cellediting方式编辑数据的grid在保存数据时 xff0c 需要进行数据的处理 xff0c 所以数据处理的方式需要特别注意 cellEditing 插件的事件 listeners edit function editor e
  • 「Ubuntu」Ubuntu中的python终端配置(修改终端默认python配置,软连接,不同版本python环境配置)

    前言 通过这篇博客 xff08 Ubuntu安装Python xff09 安装完Python后 xff0c 想要在终端直接启动想启动的python版本 此时直接在终端输入python2或者python3 xff0c 发现系统已经配置好了py
  • [解题报告] CSDN竞赛第15期

    CSDN编程竞赛报名地址 xff1a https edu csdn net contest detail 29 1 求并集 题目 由小到大输出两个单向有序链表的并集 如链表 A 1 gt 2 gt 5 gt 7 链表 B 3 gt 5 gt
  • JSP开发技术四——————EL表达式

    EL xff08 Expression Language xff09 表达式 xff0c 即正则表达式 用来操作字符串 用一些特定的字符来表示一些代码操作 xff0c 这样简化代码书写 学习正则表达式 xff0c 就是学习一些特殊符号的实用
  • [解题报告] CSDN竞赛第17期

    CSDN编程竞赛报名地址 xff1a https edu csdn net contest detail 31 1 判断胜负 题目 已知两个字符串A B 连续进行读入n次 每次读入的字符串都为A B 输出读入次数最多的字符串 解题报告 模拟
  • [解题报告] CSDN竞赛第18期

    CSDN编程竞赛报名地址 xff1a https edu csdn net contest detail 32 1 单链表排序 题目 单链表的节点定义如下 xff08 C 43 43 xff09 xff1a class Node publi
  • [解题报告] CSDN竞赛第22期

    CSDN编程竞赛报名地址 xff1a https edu csdn net contest detail 36 1 c 43 43 难题 大数加法 题目 大数一直是一个c语言的一个难题 现在我们需要你手动模拟出大数加法过程 请你给出两个大整
  • [解题报告] CSDN竞赛第23期

    CSDN编程竞赛报名地址 xff1a https edu csdn net contest detail 37 1 排查网络故障 题目 A地跟B地的网络中间有n个节点 xff08 不包括A地和B地 xff09 xff0c 相邻的两个节点是通
  • CSDN竞赛第24期

    CSDN编程竞赛报名地址 xff1a https edu csdn net contest detail 38 这次写完第一道题时遇到一个奇怪的情况 xff1a 一直在 运行中 xff0c 然后发现每道题输入做任意代码都出现一直运行中 跟小
  • [Python开发] 使用python读取图片的EXIF

    使用python读取图片的EXIF 方法 使用PIL Image读取图片的EXIF 使用https pypi python org pypi ExifRead 读取图片的EXIF xff0c 得到EXIF标签 xff08 dict类型 xf
  • Partial Least Squares Regression 偏最小二乘法回归

    介绍 定义 偏最小二乘回归 多元线性回归分析 43 典型相关分析 43 主成分分析 输入 xff1a n m 的预测矩阵 X n p 的响应矩阵 Y 输出 X 和 Y 的投影 分数 矩阵 T U R n l 目标 xff1a 最大化 cor
  • 使用TensorFlow-Slim进行图像分类

    参考 https github com tensorflow models tree master slim 使用TensorFlow Slim进行图像分类 准备 安装TensorFlow 参考 https www tensorflow o
  • 使用TensorFlow Object Detection API进行图像物体检测

    参考 https github com tensorflow models tree master object detection 使用TensorFlow Object Detection API进行图像物体检测 准备 安装Tensor
  • 【Java笔记】异常处理(try-catch-finally、throws、throw)

    在 Java 语言中 xff0c 将程序执行中发生的不正常情况称为 异常 注 xff1a 开发过程中的语法错误和逻辑错误不是异常 在编写程序时 xff0c 经常要在可能出现错误的地方加上检测的代码 xff0c 如进行 x y 运算时 xff