JavaSE - 08 异常

发布于:2023-01-10 ⋅ 阅读:(337) ⋅ 点赞:(0)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


1.异常的概述和异常的体系结构

异常概述: 在Java语言中,将程序执行中发生的不正常情况称为“异常” 。 (开发过程中的语法错误和逻辑错误不是异常)

Java程序在执行过程中所发生的异常事件可分为两类:

①Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源 耗尽等严重情况。比如:StackOverflowError和OOM。一般不编写针对性 的代码进行处理。

②Exception: 其它因编程错误或偶然的外在因素导致的一般性问题,可以使 用针对性的代码进行处理。

异常体系结构:

在这里插入图片描述

编译时异常、运行时异常:

在这里插入图片描述

JVM异常处理方式:

1. 立刻终止程序
2. 在控制台打印了异常的信息
	a. 异常的类型 -> java.lang.ArithmeticException
	b. 异常的产生原因 -> / by zero
	c. 异常产生的代码位置 -> at f_exception_jvm.Demo.main(Demo.java:7)
	d. 异常产生的线程 -> Exception in thread "main"
	e. 以红色字体打印 -> System.err
	f. 开启了新的线程进行错误信息的打印
3. JVM会在堆内存中创建一个此异常类型的对象

常见的异常:

java.lang.RuntimeException
 		ClassCastException
 		ArrayIndexOutOfBoundsException
 		NullPointerException
 		ArithmeticException
 		NumberFormatException
 		InputMismatchException
		。。。  
	java.io.IOExeption
  		FileNotFoundExceptionEOFExceptionjava.lang.ClassNotFoundExceptionjava.lang.InterruptedExceptionjava.io.FileNotFoundExceptionjava.sql.SQLExceptio

2.异常处理的方式

方式一:通过throws关键字来向上抛出异常

定义格式:[权限修饰符] 返回值类型 方法名 throws 异常类名(参数列表){}
		注意:
			这个throws格式是跟在方法的括号后面的 
			编译时异常必须要进行处理,两种处理方案:try...catch …或者 throws,如果采用 throws 这种方案, 在方法上进行显示声明,将来谁调用这个方法谁处理 
			运行时异常因为在运行时才会发生,所以在方法后面可以不写,运行时出现异常默认交给jvm处理 

方式二:通过try catch方式来捕获异常

定义格式:
		try{
			// 可能出现异常的代码块
		}catch(异常类名 变量名){
			// 异常处理
		}finally{
			// 无论异常是否处理该代码块都执行
		}
执行流程 :
	1. try中有异常,catch捕获到
		a .try中遇到异常代码,立刻终止try中代码执行
		b . 进入到catch中执行异常的解决方案
		c . 执行try..catch后方的其他代码
	2. try中无异常
		a. 正常执行try中所有代码
		b. 执行try..catch后方的其他代码 //不执行catch中的解决方案
	3. try中有异常,catch没有捕获到
		a. 立刻把异常交付给JVM处理
		b. 按照JVM处理异常的方式处理异常 //看不到try..catch后方的其他代码
	4. try中有异常,catch捕获到,catch中有异常
		a .try中遇到异常代码,立刻终止try中代码执行
		b . 进入到catch中执行异常的解决方案
		c. 遇到catch中异常,因为没有人处理,JVM介入了
		d. 按照JVM处理异常的方式处理异常 //看不到catch异常后方的代码,也看不到
			try..catch后方的其他代码
注意事项 :
	1. 一个try中可以写多个catch,但是只能捕获一个异常 // 哪个异常先出来
	2. 可以先捕获子类型异常,再捕获父类型异常 // 不可以先捕获父类型异常再捕获子类型异常
	3. 捕获父类型异常,子类型异常也一并被捕获了 //多态
	4. 不可以在一个catch中捕获多个异常

throw关键字:抛出一个异常

格式 :
    throw new 异常(); 
这个格式是在方法内的,表示当前代码手动抛出一个异常,下面的代码不用再执行了

Throwable成员方法

getMessage() : 返回此throwable详细字符串信息
toString() : 返回简短的描述
printStrackTrace() : 将错误信息打印到控制台

throw与throws区别

throws : 抛出异常
	位置 : 方法的声明上,形参的后面
	作用 : 把异常抛给调用者处理
	格式 :
		权限修饰符 状态修饰符 返回值类型 方法名(形式参数列表) throws 异常的类型{
			//方法体
		}
throw : 暴露异常
	位置 : 方法内(某个条件下)
	作用 : 把创建的异常对象暴露给jvm
	格式 :
		if(某个条件){
			throw new 异常类型("异常的错误信息");
        }

3.自定义异常

概述: 当Java中没有满足我们需求的异常,我们就可以自己定义一个异常。
自定义异常类的过程:
a、创建一个类,并继承一个异常类
b、提供有参、无参构造
使用方式:
通过throw关键字进行抛出

/**
 * 自定义异常类
 * 步骤 :
 * 1.自定义一个异常类,继承一个异常。
 * 2.提供一个空参和一个有参构造
 * 3.通过throw关键字调用
 */
public class Demo01 {
    public static void main(String[] args) throws MyException {
        // 判断假如一个人的年龄是否为负数,若是触发年龄异常
        int age = -10;
        isAge(age);

    }
    public static void isAge(int age) throws MyException {
        if (age<0){
            throw new MyException("年龄异常");
        }
    }
}

// 1.定义一个异常类,继承一个异常
class MyException extends Exception{
    public MyException() {
    }

    public MyException(String message) {
        super(message);
    }
}
本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到