欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

异常体系以及try..catch,finally,throw,throws的使用

程序员文章站 2022-03-07 22:32:43
...


前言

首先,我们今天一起聊一下java中的异常体系

一、什么是异常机制

首先,在Java中,当所写代码不符合某些逻辑思想上规定,进而在JVM运行期间系统会自动将不符合逻辑的代码进行一系列的处理,从而使用户可以及时去确定出现问题的位置,这就是异常机制。

(换句话来说,当我们发现代码出现逻辑思想上的不规范时,我们是不是可以通过添加一些条件使逻辑不出错,但会性能会降低,消耗也会增大,从而我们可以借助异常类对其进行逻辑上的判断和检测)。

Throwable类中包含了异常(Exception类),和错误(Error类)

二、异常的分类

1.RuntimeException类 和 继承Exception的其他子类

首先,所有的异常子类都继承Exception父类

Java机制中,可分为RuntimeException类继承Exception的其他子类

常见的RuntimeException类的异常子类

1.NullPointerException(空指针异常)

2.IndexOutOfBoundsException(下标超出异常)

3.IllegalArgumentException(参数不合法异常)

4.NumberFormatException(数字格式化异常)

5.ClassCastException(类型转换异常)

6.ArithemticException(算术逻辑异常)

常见的继承Exception类的其他子类
1.SQLException

2.IOException

2.No Checked异常 和 Checked异常

No Checked异常:JVM可以进行简单的处理,使得该类异常可以使用try…catch捕获,throw抛出异常也可以不用

No Checked异常:RuntimeException异常


Checked异常:该类异常必须要进行 throw抛出异常和try…catch捕获。

Checked异常:SQLException类 IOException类

三、try…catch , finally;throw;throws

1.try…catch 和 finally

try:用于保存可能出现异常的代码
运行时,如果jvm检测到代码异常,则创建一个和该异常相关的对象,并且代码的执行流程会跳过后面的try中的代码,进入catch块中执行。

catch:进行捕获异常,根据jvm创建的异常对象和catch块中的异常类型进行匹配,成功则执行代码块的内容。(利用 instanceof 运算符进行类型匹配)

finally:无论是否出现异常或return,都执行,除非在之前有System.exit(0)=>虚拟机退出

在try…catch之外的代码,若没有reuturn语句,则执行其代码;

public class Demo05 {
	public static void main(String[] args) {
		try {
			int num1=12,num2=6;
			int result=num1/num2;
			System.out.printf("%d÷%d=%f\n",num1,num2,result);
			
			String str=null;
			System.out.println(str.length());
		}catch(ArithmeticException ex){ 
			System.out.println("除数不能为零");
			ex.printStackTrace();  //打印当前异常的堆栈信息
		}catch(NullPointerException ex) {
			System.out.println("不能访问一个Null对象的方法哦");
			//return;
			//System.exit( 0);
		}catch(IllegalFormatConversionException ex) {
			System.out.println("注意格式化占位符的对应关系鸭!");
		}catch(Exception ex) {
			System.out.println("哎哟,出错了鸭!!!");
		}finally {
			System.out.println("finally.............");
		}
		System.out.println("程序结束");
	}
}

2.throw 和 throws

快捷键:Alt+Shift+z

throws:将声明异常类型抛出到该方法名之后

throw:用于创建抛出的异常对象,放于方法体内。

若抛出的异常对象为No Checked异常,可以使用try…catch捕获,throw抛出异常也可以不用

若抛出的异常对象为Checked异常,必须使用try…catch捕获,throw抛出异常

public class Demo07 {
	public static void main(String[] args) {
		try {
			dosth();
		} catch (FileNotFoundException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}
	public static void dosth() throws FileNotFoundException{
		int a=23,b=3;
		if(a>b) {
			throw new FileNotFoundException(); //No Checked异常
		}
	}

四 自定义抛出

当系统的异常类不足以按照自己的想法去实现,则自定义抛出可以解决这个问题
步骤:
1.创建一个自定义的异常类,并继承某个父类,这里继承RuntimeException类,利用 super关键字,将参数传入到父类进行一系列操作
2.利用throw创建一个自定义的异常类型对象,可以传入参数,
3.使用throws将异常类型抛出到该方法外
4.在主函数进行对异常的捕获

注意:
1.若是自定义异常类继承Exception,(No Check异常),可以处理该异常

2.若是自定义异常类继承RuntimeException(Check异常),必须处理也可以不处理该异常

package com.apesource.exception;

public class Demo08 {
	public static void main(String[] args) {
		try {
			donothing();
		} catch (CountTooLargeException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} 
	}
	//自定义异常
	public static void donothing() throws CountTooLargeException {
		int count=9999;
		if(count>999) {
			//创建并抛出自定义异常对象
			//throw new CountTooLargeException();  //使用无参构造方法创建,采用默认提示信息
			throw new CountTooLargeException("商品数量过大");  //使用有参构造方法创建,采用自定义提示信息
		}
	}
}

class CountTooLargeException extends RuntimeException{
	public CountTooLargeException(String message) {
		super(message);
	}

上述就是今天的内容,让我们一起学习,要是有不对的地方,还请大家帮忙指正呀。加油,兄弟们。

相关标签: 学习笔记 java