异常的认识和使用方法

异常

1.为什么要使用异常
在数组中找出用户指定下标位置对应元素,数组为 int 类型
	public static int get(int[] arr,int index);
	if (index < 0 || index >arr.length - 1){
		//方法返回值为 int 类型,无论返回任何一个整数都有可能是正常数据
		//问题 没有合理合适的方法告知用户当前操作存在问题,返回值数据无法明确标识
		//如果使用 System.exit(0) 不合适
	
	}
Java 中提供异常机制,将错误信息封装到一个异常对象中,将异常对象抛出方法之外,方法外都可以获取到对应的异常信息,将当前异常进行处理或者分析
注意代码中不是为了写异常,而且通过异常的方法提供更多的错误信息,异常信息,代码运行的非找正常状态信息给到程序反馈,方便更好的修改代码,调试代码
2. 异常类型结果和继承关系
Throwable
	Java 中所有异常和错误的基类,规定了一些异常和错误的必要方法(信息获取,简要描述,控制器异常/错误原因展示)
---- | class EXception extends Throwable
	Java中的异常 可以处置
----- | class Error extends Throwable
	Java 中的错误	只能避免
	
Throwable 常用 API
	构造方法:
		Throwable();
			无参数构造方法,和new 关键字联用,可以实例化 Throwable 对象,异常/错误信息为 null
		Throwable(String message);
		有参数构造方法,和new 关键字联用,可以实例化 Throwable 对象,异常/错误信息为 message
	成员方法
		String toString();
			获取当前错误/异常的简要描述
		String getMessage();
			仅获取错误/异常信息
		void printStackTrace();
			展示错误/异常方法调用流程,栈区错误信息流程,可以看到异常的前因后果
			
package com.qf.edu;

public class Demo1 {
	public static void main(String[] args) {
		//无参数构造方法,和new 关键字联用,可以实例化 Throwable 对象,异常/错误信息为 null
		Throwable throwable = new Throwable();
		//有参数构造方法,和new 关键字联用,可以实例化 Throwable 对象,异常/错误信息为 message
		Throwable t2 = new Throwable("单身狗异常");
		System.out.println(throwable.toString());
		
		t2.printStackTrace();
		test();
		
	}
	public static void test() {
		Throwable t1 = new Throwable("调用方法异常情况!");
		t1.printStackTrace();
	}
}

3. 异常和错误的区别
名称区别:
	所有的异常结尾都是  Exception
	所有的错误结尾都是 Error

Exception 可以处置
   抛出  社区医院无法处理骨折问题,建议去大医院,大医院处置
   捕获  伤口包扎社区医院直接处置

Error 无法处理

【注意】
	Java代码出现了异常/错误,代码停止执行,需要后续处理。
4. 针对异常处理方式

目前异常处理针对当前的代码体验不佳,使用不明显

【重点】异常对象存储有异常相关信息,异常内容,异常出现的方法调用顺序,方法执行过程 ===>存储到日志

后期课程对于异常进行等级分类:

​ Info 信息 Warning 警告 Danger 危险

对于目前而言 Eclipse 当中处理异常都是 Ctrl + 1

4.1捕获处理
格式:
	try {
		有可能出现异常的代码,例如:数组下标操作,引用数据类型指向 null
	} catch (异常类型,异常对象名,常用小写 e1) {
		catch 小括号声明告知当前大括号处理的是哪一个异常类型
		针对于当前处理的处理方式,目前而言无法采用日志方式进行存储,只能展示...
		
	}	catch (异常类型,异常对象名,常用小写 e2) {
		catch 小括号声明告知当前大括号处理的是哪一个异常类型
	}	
package com.qf.edu;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

/*
 * try catch 异常捕获展示
 * 
 * */
public class Demo3 {
	public static void main(String[] args) {
		/*
		 * 根据当前系统中的 D:/aaa/1.txt 路径对应的文件,创建对应文件的字节输入流对象
		 * Java 从文件中获取数据
		 * 		改代码有隐患,例如文件不存在,路径不合法,没有D 盘,没有操作权限..
		 * 		以上隐患对于 Java 代码而言就是通过异常方式来处理
		 * 
		 * Unhandled exception type FileNotFoundException
		 * 	尚未 处理FileNotFoundException 异常,尚未处理文件未找到异常
		 * 
		 * Ctrl + 1 快速修复 选择 == > surround with try/catch 捕获处理
		 * 
		 *
		 * 代码提示尚未处理的异常是语法错误,提供报错,使用捕获处理之后,代码不在报错
		 * 
		 * 代码的异常出现之后,通过捕获操作,JVM 认为已经没有异常存在,代码可以继续运行
		 * 
		 * 在 try 大括号中,如果出现了异常,从异常位置开始,之后的代码不在执行
		 * */
		try {
			FileInputStream fileInputStream = new FileInputStream("D:/aaa/1.txt");
			System.out.println("------代码运行--------");
		} catch (FileNotFoundException e) {
			//针对于FilenotFoundException异常处理方式
			//目前有且只只能控制台展示异常方法调用顺序、代码执行流程、错误信息..
			
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("....代码继续执行.....");
		
	}
}

package com.qf.edu;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

/*
 * 
 * 多异常代码处理
 * 
 * 
 * try - catch 结构允许并行多个 catch 块,分门别类处理不同的异常。
 * */
public class Demo4 {
	public static void main(String[] args) {
		/*Unhandled exception type FileNotFoundException
		 * 文件未找到异常
		 * */
		try {
			FileInputStream fileInputStream = new FileInputStream("G:/aaa/测试.txt");
			/*
			 * 
			 * Unhandled exception type InterruptedException
			 * 		中断异常
			 * 
			 * */
			Thread.sleep(1000);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			System.out.println("文件未找到异常");
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			System.out.println("中断异常");
		}
		try {
			FileInputStream fileInputStream = new FileInputStream("G:/aaa/测试.txt");
			/*
			 * 
			 * Unhandled exception type InterruptedException
			 * 		中断异常
			 * 
			 * */
			Thread.sleep(1000);
		} catch (FileNotFoundException | InterruptedException  e) {
			//允许两个异常并行!!同时处理,适用于将同级别,同类型异常统一处理
			System.out.println("同级别异常:" + e.toString());
		}
	}
}
4.2抛出处理
关键字:
	throw
		方法中判断条件无法满足代码正常允许的情况,实例化异常对象,并且提供字符串信息作为异常信息,抛出异常对象,提示用户/代码当前代码存在问题。
		例如:
			数组下标越界,数据参数不符合,学生成绩不合法....
	throws
		【方法声明】位置告知方法调用这,当前方法有哪些异常存在。提示用户/代码,需要对异常进行处理,注意异常的出现情况
package com.qf.edu;
/*
 * 抛出异常演示
 * 
 * */
public class Demo5 {
	public static void main(String[] args) {
		int[] arr = {1, 3, 5, 6, 9, 8, 74, 21, 22};
		/*
		 * 调用一个带有异常抛出的方法
		 * 1.继续抛出
		 * 2.捕获处理
		 * */
		//捕获处理
		try {
			test(arr, 1);
		} catch (ArrayIndexOutOfBoundsException e) {
			// TODO: handle exception
			System.out.println("异常情况:" + e.toString());
		}
		
		test(arr, 20);
	}
	/*
	 * 
	 * 文档中多出了一个 @throws 需要对抛出异常进行结束,异常类型,异常情况,异常说明
	 * */
	
	/**
	 * 展示指定数组下标内容
	 * 
	 * @param arr int 类型数组
	 * @param index 指定下标参数
	 * @throws ArrayIndexOutOfBoundsException 给予方法数组下标越界异常
	 * */
	
	
	public static void test(int[] arr, int index) 
			throws ArrayIndexOutOfBoundsException	{
		//数组下标越界
		if (index < 0 || index > arr.length - 1) {
			/*
			 * 根据 if 条件判断情况 ,得出当前异常为数组下标越界异常
			 * 
			 * */
			throw new ArrayIndexOutOfBoundsException("用户提供数组下标越界");
		}
		System.out.println(arr[index]);
	}
}
package com.qf.edu;
/*
 * 抛出异常特征语法
 * */
public class Demo6 {
	public static void main(String[] args) {
		
	}
	/**
	 * 
	 * 多个异常输入,在throws 之后使用逗号隔开
	 * 
	 * @param arr
	 * @param index
	 * @throws NellPointerException
	 * @throws ArrayIndexOutfboundsException
	 * */
	public static void test(int[] arr, int index)
		throws NullPointerException, ArrayIndexOutOfBoundsException {
		//当前数组为 null 数组不存在,并且 null 不能操作
		/*
		 * if (null == arr || index < 0 || index > arr.length - 1) {
		 * 			System.out.println("用户参数不合法");
		 *          return;
		 * }
		 */
		
		if (null == arr) {
			/*
			 * NullPointerException 空指针异常
			 * 
			 * throw 抛出异常操作,之后的代码都是 Unreachable code 无法触及的代码,无法执行代码
			 * 方法从异常抛出位置开始终止运行
			 * 
			 * 
			 * 
			 * */
			//NullPointerException 空指针异常
			throw new NullPointerException("数组不能为 null");
		}
		if (index < 0 || index > arr.length - 1) {
			//ArrayIndexOutOfBoundsException 数组下标异常
			throw new ArrayIndexOutOfBoundsException("数组下标异常");
		}
			
		System.out.println(arr[index]);
	}
}
5. 什么时候抛出,什么时候捕获

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JCrKPVWE-1668214638494)(F:\qianfeng\笔记\img\抛出和捕获分析.png)]

6.运行时异常和编译时异常

目前而言最大的对比

运行时异常不会报错,编译时异常必须 Ctrl + 1处理

如果发现异常报错 Unhandled exception XXX证明当前异常为变异兽异常,必须处理

运行时异常:
	常见异常,不操心的异常,不执行的异常,不认真的异常。
	例如:
		数组下标越界异常 ArrayIndexOfboundsException
		空指针异常 NullPointException
		...
	运行时异常基类是 RuntimeException extends Exception

编译时异常
	代码操作存在语法级别隐患,需要在代码书写过程中,对当前异常有对应的处理方法和处理办法。
	例如:
		文件未找到位置/文件不存在异常 FileNotFoundException
		中断异常 InterruptedException
		SQL 数据库 SQL 语句异常 SQLException
		
	编译时异常父类都是 Exception


常见异常,不操心的异常,不执行的异常,不认真的异常。
例如:
数组下标越界异常 ArrayIndexOfboundsException
空指针异常 NullPointException

运行时异常基类是 RuntimeException extends Exception

编译时异常
代码操作存在语法级别隐患,需要在代码书写过程中,对当前异常有对应的处理方法和处理办法。
例如:
文件未找到位置/文件不存在异常 FileNotFoundException
中断异常 InterruptedException
SQL 数据库 SQL 语句异常 SQLException

编译时异常父类都是 Exception

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值