文章目录
前言
本次任务难度比较简单,属于副知识,主要了解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){
}finally{
}
注意: 在以上结构中不管以后是否需要用到finally 都请加上它,这个东西非常重要,请将它作为一个习惯吧。
(2)、常见的异常处理结构
try{} catch{} try{} catch{}catch{} try{} catch{} finally{} try{} catch{} catch{} finally{} try{} finally{} 注意:多重catch,遵循从子(小)到父(大)的顺序,父类异常在最后
六、自定义异常(通过案例来理解)
(1)、通过自定义异常(SexException与AgeException)来测试创建对象的错误
package com.qf.chapter13_1;
public class Person {
private String name;
private String sex;
private int age;
public Person() {
}
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 + "]";
}
}
public class AgeException extends RuntimeException{
public AgeException() {
super();
}
public AgeException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
public AgeException(String message, Throwable cause) {
super(message, cause);
}
public AgeException(String message) {
super(message);
}
public AgeException(Throwable cause) {
super(cause);
}
}
public class SexException extends RuntimeException {
public SexException() {
super();
}
public SexException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
public SexException(String message, Throwable cause) {
super(message, cause);
}
public SexException(String message) {
super(message);
}
public SexException(Throwable cause) {
super(cause);
}
}
public class TestPerson {
public static void main(String[] args) throws Exception{
Person yaoguai=new Person();
yaoguai.setAge(20);
yaoguai.setSex("妖");
System.out.println(yaoguai.toString());
}
}
(2)、异常方法重写时需要注意的问题
带有异常声明的方法的重写 方法名、参数列表、返回值类型必须和父类相同 子类访问修饰符合父类相同或是比父类更宽 子类中的方法,不能排除比父类更多、更宽的异常
总结
本次任务如上所示,重点的话更偏向理论部分,个人建议重点账务异常的传递和处理那一块,前面的异常出现内容熟记便可
|