JavaSE——基础知识回顾15之异常部分

本文详细讲解了Java中的异常概念,包括Error和Exception的区别,异常的自动和手动抛出,传递机制,以及处理方法。通过实例演示自定义异常和异常重写规则。重点在于理解异常的处理策略和自定义异常的实战应用。

文章目录



前言

本次任务难度比较简单,属于副知识,主要了解Java中的异常机制如何分类,如何产生,乃至如何自定义与解决


提示:以下是本篇文章正文内容,下面案例可供参考

一、知识思维导图

在这里插入图片描述

一、Java中的“异常”是什么?

(1)、异常的概念:

程序在运行的过程中产生的特殊情况,导致程序因意外而结束掉进程。如果不及时处理的话将会出现不必要的损失。

(2)、异常的分类:

Throwable(位于java.lang包) 是异常(Exception)与错误(Error)的超类,即根类,在Throwable下继承有子类“Error” 与 “Exception”,然而“Exception”之下分为两种异常,其一为“RuntimeException”(运行时异常)与“CheckedException”(受检式异常),对于“RuntimeException”它的特点是可以处理也可以不处理,可以由JVM来进行处理,然而“CheckedException”是必须处理的。

(3)、“Error”与“Exception”的区别

区别:
“Error”是运行后的错误,一般发生于JVM、硬件、执行逻辑错误,或者是一些重大的问题导致的程序崩溃无法手动处理
“Exception”是程序在运行或者是配置中产生的问题,可以处理


三、异常的产生

(1)、自动抛出的异常

当程序在运行时遇到不符合规范的代码或者结果的时候会产生异常,抛出异常信息与路径。

(2)、手动抛出的异常或是自定义异常

通过语法 throw new 异常类型(“实际参数”)的方式来抛出异常,常用于自定义异常的时候

(3)、产生异常的结果

产生异常的结果实质上类似于遇到“return”语句,只不过“return”语句是在程序正常的情况下进行结束并返回的,然而异常的结果是在程序无法正常结束并返回的结果。最后导致程序因异常而终止。

四、异常的传递:

异常的传递:按照方法的调用链反向传递,如始终没有处理异常,最终会有JVM进行默认异常处理(打印对翟跟踪信息 e.getMessage , printStackTrace())
受查异常:throws 声明异常,修饰在方法参数列表后端。
运行时异常:因可处理可不处理,无序声明异常。

五、异常的处理:

(1)、处理异常的基本语法(熟悉,若有不懂可以去B站上多看看)

//语法如下:
try{
//可能出现异常的代码
}catch(Exception e){
//异常处理的相关代码,如:getMessage() 、printStackTrace()
}finally{
//无论是否出现异常,都需执行的代码结构,常用于释放资源
}

注意: 在以上结构中不管以后是否需要用到finally 都请加上它,这个东西非常重要,请将它作为一个习惯吧。

(2)、常见的异常处理结构

try{} catch{}
try{} catch{}catch{}
try{} catch{} finally{}
try{} catch{} catch{} finally{}
try{} finally{}
注意:多重catch,遵循从子(小)到父(大)的顺序,父类异常在最后

六、自定义异常(通过案例来理解)

(1)、通过自定义异常(SexException与AgeException)来测试创建对象的错误

//创建Person类
package com.qf.chapter13_1;

public class Person {
	private String name;
	private String sex;
	private int age;
	public Person() {
		// TODO Auto-generated constructor stub
	}
	public Person(String name, String sex, int age) {
		super();
		this.name = name;
		this.sex = sex;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) throws Exception {
		if(sex.equals("男")||sex.equals("女")) {
			this.sex = sex;
		}else {
			throw new Exception("性别不符合要求");
		}
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) throws Exception {
		if(age>0&&age<=120) {
			this.age = age;
		}else {
			//抛出异常
			throw new Exception("年龄不符合要求");
		}
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", sex=" + sex + ", age=" + age + "]";
	}
	
}

//创建年龄异常类
/**
 * 自定义异常
 * (1)继承Exception 或子类
 * (2)添加构造方法
 * @author 雍仲杨
 *
 */
public class AgeException extends RuntimeException{

	public AgeException() {
		super();
		// TODO Auto-generated constructor stub
	}

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

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

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

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

//创建性别异常

public class SexException extends RuntimeException {

	public SexException() {
		super();
		// TODO Auto-generated constructor stub
	}

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

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

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

	public SexException(Throwable cause) {
		super(cause);
		// TODO Auto-generated constructor stub
	}	
}
//创建测试类
public class TestPerson {
	public static void main(String[] args) throws Exception{
		Person yaoguai=new Person();
		yaoguai.setAge(20);
		yaoguai.setSex("妖");//这里绝对会报错  SexException
		System.out.println(yaoguai.toString());
	}
}

(2)、异常方法重写时需要注意的问题

带有异常声明的方法的重写
方法名、参数列表、返回值类型必须和父类相同
子类访问修饰符合父类相同或是比父类更宽
子类中的方法,不能排除比父类更多、更宽的异常

总结

本次任务如上所示,重点的话更偏向理论部分,个人建议重点账务异常的传递和处理那一块,前面的异常出现内容熟记便可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sugar-free->小粽子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值