Java入门-异常机制

java异常机制

异常概念

在Java中,异常处理(exception handling) : java语言或者程序员开发提供的一种机制,当有不正常的情况发生时,可以发出信号。这种发出信号的过程被称为抛出异常(throwing an exception)。

java异常体系

img

Error

Error类对象由 Java虚拟机(JVM)生成并抛出,大多数错误与代码编写者所执行的操作无关。这些错误是不可查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。这类异常不是我们开发的重点。

Exception

Exception是指程序本身可以处理的异常。一般是我们在开发过程中没有考虑全面或者一些意外的情况,比如除法中除数不能为零,输入一个非数字的字符串无法转换为数字的异常等。Exception异常又分为运行时异常和可检查异常。

运行时异常(RuntimeException)

RuntimeException是Exception的子类,RuntimeException类及其子类表示“JVM 常用操作”引发的错误。例如,若试图使用空值对象引用、除数为零或数组越界,则分别引发运行时异常(NullPointerException、ArithmeticException)和ArrayIndexOutOfBoundException。

可检查异常(Exception)

可检查异常是指继承Exception类的子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。也就是大家在IDE工具写某些代码提示你需要处理的异常。比如 Thread.sleep(100)等。

异常处理流程

try …catch … finally

try

检查语句块是否有异常

img

catch

根据监测出的异常类型进行捕获。

img

finally

不管是否抛出异常都要执行某一程序的机制。

异常处理的两种形式:

try… catch 形式: 检查异常,捕获异常

try…finally 形式: 检查异常,有无异常一定执行

程序案例:

int x = 3;
int y = 0;

try{
	int p = x / y;
}catch (ArithmeticException e) {
	e.printStackTrace();
}finally {
	System.out.println("finally代码块...");
}

程序运行结果:

finally代码块...
java.lang.ArithmeticException: / by zero
at example.E1.main(E1.java:10)

throws

在方法上声明抛出的可检查异常的类型。当我们由于某种原因不想/不能进行异常处理时,我们可以声明本方法有异常,告诉调用者需要处理。

public void run() throws IOException{

    //方法体

}

throw

使用throw抛出异常对象,注意throw是一个动作,一般在方法体里使用,抛出正真的异常对象。

public void deleteById(int id) {

	if (id < 0) throw new RuntimeException("id不能为负数");

}

提示:如果抛出的是可检出异常类型则需要在方法上声明异常的类型。

自定义异常

项目开发中仅仅使用java给定的异常(类型),对于不同的项目来讲远远不够。为了提高项目的异常处理能力,一般需要自定义异常对象。

自定义异常

自定义异常非常简单,只需要继承某个异常类(一般选择继承RuntimeException)。

public class MyException extends RuntimeException{

 public MyException(String msg){
   super(msg);
 }
}

异常相关问题

在使用异常时有几个问题需要注意:

(1) 在继承关系时,子类不得比父类抛出更多,类型更大的异常。

(2) 自定义异常的命名一定要清晰,见名知意。

(3) 异常捕获一般配合日志。

异常使用案例:

使用自定义的异常完成用户权限验证。

需求

用户登录系统时会输入用户名和密码,本实例通过模拟用户在登录时和运行程序中的验证功能:

  • 预设不同用户的用户名、密码和权限。

  • 检查用户的用户名是否正确,正确用户允许进行其它操作。失败登录能够捕获错误原因(根据不同的异常抛出对象决定)。

  • 成功登录用户进行操作时还需要检查用户的权限,如果权限正确,模拟显示用户的操作,否则抛出异常显示用户权限不足。

分析

系统设计中的主要几个问题分析:

  • 使用数组预设多个用户对象,用户对象中记录用户的用户名&密码和权限。

  • 定义多种异常类,可以定义一个异常父类 (UserException), 再分别定义不同的异常类继承UserException, 比如UsernameEmptyExeption(用户名为空异常),UsernameIsNotExistException(用户不存在异常), InvalidUserException(无效的用户),PermissionDenied(权限不足异常)。

  • 通过不同的异常处理流程捕获不同的异常。

实现思路

定义用户(User)类

public class User {
	private String username;
	private String password;
	private String name;
	private String privilege;
}

定义异常超类

/*
 * User异常类超类
 * @author Administrator
 *
 */

public class UserException extends RuntimeException {

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

}

定义异常子类例如InvalidUserException

public class InvalidUserException extends UserException {
	public InvalidUserException(String message) {
		super(message);
	}
}

登录异常捕获类(片段)

try {
	//检查登录代码
	} catch (UsernameEmptyExeption e1) {
			System.out.println(e1.getMessage());
	} catch (InvalidUserException e2) {
			System.out.println(e2.getMessage());
	}
	:
	:

登录异常捕获类(片段)

try {
	//检查登录代码
	} catch (UsernameEmptyExeption e1) {
			System.out.println(e1.getMessage());
	} catch (InvalidUserException e2) {
			System.out.println(e2.getMessage());
	}
	:
	:

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

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

相关文章

数据库SQL Server常用字符串函数

文章目录 字符串函数 字符串函数 CONCAT:拼接字符串 CONCAT(COLUMN1,_,COLUMN2) AS COLCONVERT&#xff1a;转换数据类型 CONVERT(data_type(length),data_to_be_converted,style)例如&#xff1a;CONVERT(VARCHAR(10),GETDATE(),110) SUBSTRING()&#xff1a;从字符串中返回…

24.6.30

星期一&#xff1a; 补cf global round26 D cf传送门 思路&#xff1a;把s中非a字符存下来&#xff0c;共m个&#xff0c;然后暴力检测&#xff0c;复杂度有点迷 代码如下&#xff1a; ll n;void solve(){string s; cin &…

硬件开发笔记(二十四):贴片电容的类别、封装介绍,AD21导入贴片电容、原理图和封装库3D模型

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140241817 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

(南京观海微电子)——电阻应用及选取

什么是电阻&#xff1f; 电阻是描述导体导电性能的物理量&#xff0c;用R表示。 电阻由导体两端的电压U与通过导体的电流I的比值来定义&#xff0c;即&#xff1a; 所以&#xff0c;当导体两端的电压一定时&#xff0c;电阻愈大&#xff0c;通过的电流就愈小&#xff1b;反之&…

Java+MySQL8.0.36+ElementUI数字化产科信息管理系统之”五色管理”

JavaMySQL8.0.36ElementUI数字化产科信息管理系统之”五色管理” 一、数字化产科信息管理系统概述 数字化产科信息管理五色管理是一种基于孕产妇妊娠风险的分类管理方法&#xff0c;通过数字化手段实现孕产妇全周期的健康风险评估与管理。该方法将孕产妇按照风险等级分为绿色、…

【HTML入门】第三课 - 标题、段落、空格

这一小节&#xff0c;我们说一些比较零散的知识&#xff0c;HTML课程中呢&#xff0c;其实就是一些标签&#xff0c;正是这些标签组成了前端网页的各种元素&#xff0c;所以你也可以叫他们标签元素。 像前两节我们说的&#xff0c;html head body title meta style 。这些都是…

3.js - 裁剪场景(多个scence)

不给newScence添加background、environment时 给newScence添加background、environment时 源码 // ts-nocheck// 引入three.js import * as THREE from three// 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls// 导入lil.gui impor…

阶段三:项目开发---大数据开发运行环境搭建:任务5:安装配置Kafka

任务描述 知识点&#xff1a;安装配置Kafka 重 点&#xff1a; 安装配置Kafka 难 点&#xff1a;无 内 容&#xff1a; Kafka是由Apache软件基金会开发的一个开源流处理平台&#xff0c;由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;…

前端JS特效第21集:HTML5响应式多种切换效果轮播大图切换js特效代码

HTML5响应式多种切换效果轮播大图切换js特效代码&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下(全部代码在文章末尾)&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-t…

Redis数据结构解析-RedisObject

文章目录 ☃️概述☃️源码 ☃️概述 RedisObject 是 Redis 中表示数据对象的结构体&#xff0c;它是 Redis 数据库中的基本数据类型的抽象。在 Redis 中&#xff0c;所有的数据都被存储为 RedisObject 类型的对象。 RedisObject 结构体定义如下&#xff08;简化版本&#xf…

VMware虚拟机配置桥接网络

转载&#xff1a;虚拟机桥接网络配置 一、VMware三种网络连接方式 VMware提供了三种网络连接方式&#xff0c;VMnet0, VMnet1, Vmnet8&#xff0c;分别代表桥接&#xff0c;Host-only及NAT模式。在VMware的编辑-虚拟网络编辑器可看到对应三种连接方式的设置&#xff08;如下图…

昇思11天

基于 MindSpore 实现 BERT 对话情绪识别 BERT模型概述 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是由Google于2018年开发并发布的一种新型语言模型。BERT在许多自然语言处理&#xff08;NLP&#xff09;任务中发挥着重要作用&am…

Angular基础保姆级教程 - 1

Angular 基础总结&#xff08;完结版&#xff09; 1. 概述 Angular 是一个使用 HTML、CSS、TypeScript 构建客户端应用的框架&#xff0c;用来构建单页应用程序。 Angular 是一个重量级的框架&#xff0c;内部集成了大量开箱即用的功能模块。 Angular 为大型应用开发而设计…

Hadoop3:NameNode和DataNode多目录配置(扩充磁盘的技术支持)

一、NameNode多目录 1、说明 NameNode多目录&#xff0c;需要在刚搭建Hadoop集群的时候&#xff0c;就配置好 因为&#xff0c;配置这个&#xff0c;需要格式化NameNode 所以&#xff0c;如果一开始没配置NameNode多目录&#xff0c;后面&#xff0c;就不要配置了。 2、配置…

移动校园(3):处理全校课程数据excel文档,实现空闲教室查询与课程表查询

首先打开教学平台 然后导出为excel文档 import mathimport pandas as pd import pymssql serverName 127.0.0.1 userName sa passWord 123456 databaseuniSchool conn pymssql.connect(serverserverName,useruserName,passwordpassWord,databasedatabase) cursor conn.cur…

阶段三:项目开发---大数据开发运行环境搭建:任务6:安装配置HBase

任务描述 知识点&#xff1a;安装配置HBase 重 点&#xff1a; 安装配置HBase 难 点&#xff1a;无 内 容&#xff1a; 本阶段任务是安装配置HBase&#xff0c;实时飞行数据是保存在HBase中的&#xff0c;因为HBase具有高效的读写能力&#xff0c;在当前项目中我们是…

hive表小练习

-- 将对应的命令写在每个步骤中 -- 1.在hive中创建数据库school create database if not exists school; -- 2.在数据库school中创建如下的表 每张表的列分隔符都是, 存储格式是textfile 创建表名为student_info, 字段为stu_id 类型为string,注释为学生id 字段为stu_name 类…

Python酷库之旅-第三方库Pandas(008)

目录 一、用法精讲 16、pandas.DataFrame.to_json函数 16-1、语法 16-2、参数 16-3、功能 16-4、返回值 16-5、说明 16-6、用法 16-6-1、数据准备 16-6-2、代码示例 16-6-3、结果输出 17、pandas.read_html函数 17-1、语法 17-2、参数 17-3、功能 17-4、返回值…

element-ui输入框如何实现回显的多选样式?

废话不多说直接上效果&#x1f9d0; 效果图 <template><div><el-form:model"params"ref"queryForm"size"small":inline"true"label-width"68px"><el-form-item label"标签" prop"tag&q…

SSM高校教师教学质量评估系统-计算机毕业设计源码03344

摘要 在高等教育中&#xff0c;教学质量是培养优秀人才的关键。为了提高教学质量&#xff0c;高校需要建立一套科学、有效的教师教学质量评估系统。本研究采用 SSM技术框架&#xff0c;旨在开发一款高校教师教学质量评估系统。 SSM框架作为一种成熟的Java开发框架&#xff0c;具…