Java异常

异常是指在程序的运行过程中所发生的不正常事件,它会中断正在运行的程序.
避免异常1:通过if-else来避免异常问题

public class Test2 {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		…
		System.out.print("请输入除数:");
		int num2 = 0;
		if (in.hasNextInt()) { // 如果输入的除数是整数
			num2 = in.nextInt();
			……
		} else { // 如果输入的除数不是整数
			System.err.println("输入的除数不是整数,程序退出。");
			System.exit(1);
		}}
}

避免异常2:使用异常机制

public class Test2 {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		…
		System.out.print("请输入除数:");
		int num2 = 0;
		if (in.hasNextInt()) { // 如果输入的除数是整数
			num2 = in.nextInt();
			if (0 == num2) { // 如果输入的除数是0
				System.err.println("输入的除数是0,程序退出。");
				System.exit(1);
			}
		} else { // 如果输入的除数不是整数
			System.err.println("输入的除数不是整数,程序退出。");
			System.exit(1);
		}}
}

弊端:

  1. 代码臃肿
  2. 程序员要花很大精力"堵漏洞"
  3. 程序员很难堵住所有"漏洞"
程序中的异常处理

Java编程语言使用异常处理机制为程序提供了错误处理的能力:程序中预先设置好对付异常的处理办法–>程序运行–>异常–>对异常进行处理–>处理完毕,程序继续运行

Java中如何进行异常处理

Java的异常处理是通过5个人关键字来实现的:try,catch,finally,throw,throws

捕获异常
try执行可能产生异常的代码
catch捕获异常
finally无论是否发生异常,代码总能执行
声明异常
throws声明方法可能要抛出的各种异常
抛出异常
throw手动抛出异常

try-catch块:使用try-catch块捕获异常,分为三种情况.
1.第一种情况:正常

public void method(){
try {
      // 代码段(此处不会产生异常)
} catch (异常类型 ex) {
      // 对异常进行处理的代码段
}
// 代码段
}

在这里插入图片描述
2. 第二种情况:出现异常

public void method(){
try {
      // 代码段 1
      // 产生异常的代码段 2
      // 代码段 3
} catch (异常类型 ex) {
      // 对异常进行处理的代码段4
}
// 代码段5
}

在这里插入图片描述
printStackTrace的堆栈跟踪功能显示出程序运行到当前类的执行流程.
在这里插入图片描述
3.第三种情况:异常类型不匹配

public void method(){
try {
     // 代码段 1
     // 产生异常的代码段 2
     // 代码段 3
} catch (异常类型 ex) {
     // 对异常进行处理的代码段4
}
// 代码段5
}

在这里插入图片描述
在catch块中处理异常

  • 加入用户自定义处理信息
System.err.println("出现错误:被除数和除数必须是整数, ” 			          +"除数不能为零。");
  • 调用方法输出异常信息
e.printStackTrace();
  • 异常对象常用的方法
方法名说明
void printStack Trace()输出异常的堆栈信息
String getMessage()返回异常信息描述字符串,是printStackTrace()输出信息的一部分
  • 常见的异常类型
异常类型说明
Exception异常层次结构的父类
ArithmeticException算术错误情形,如以零作除数
ArrayIndexOutBoundsException数组下标越界
NullPointerException尝试访问null对象成员
ClassNotFoundException不能加载所需的类
IllegalArgumentException方法接收到非法参数
ClassCastException对象强制类型转换出错
NumberFormatException数字格式转换异常,如把"abc"转换成数字
异常处理
  • 在try-catch块后加入finally块
    是否发生异常都执行
    不执行的唯一情况
    在这里插入图片描述
  • 存在return的try-catch-finally块
public void method(){
try {
     // 代码段 1
     // 产生异常的代码段 2
} catch (异常类型 ex) {
     // 对异常进行处理的代码段3
     return;
}finally{
      // 代码段 4
}
}

在这里插入图片描述

  • 多重catch块
    引发多种类型的异常
    排列catch 语句的顺序:先子类后父类
    发生异常时按顺序逐个匹配
    只执行第一个与异常类型匹配的catch语句
public void method(){
try {
     // 代码段
     // 产生异常(异常类型2)
} catch (异常类型1 ex) {
     // 对异常进行处理的代码段
} catch (异常类型2 ex) {
     // 对异常进行处理的代码段
} catch (异常类型3 ex) {
     // 对异常进行处理的代码段
}
// 代码段
}

在这里插入图片描述
声明异常
在这里插入图片描述
抛出异常
除了系统自动抛出异常外,有些问题需要程序员自行抛出异常.

public class Person {
	private String name = "";   // 姓名
	private int age = 0;   // 年龄
	private String sex = "男";  // 性别
	public void setSex(String sex) throws Exception {
		if ("男".equals(sex) || "女".equals(sex))
			this.sex = sex;
		else {
			throw new Exception(“性别必须是\"男\"或者\"女\"!");
		}
	}
}

Checked和Unchecked异常
观察以下两组代码:

Class.forName("");
Integer.parseInt("123");

为什么有的异常一定需要catch,有的却不用?

  • Java当中Checked异常是必须catch并处理的,而unchecked异常不强制要求程序员处理
  • 在处理checked异常的catch语句中,不要什么都不做
  • 不要直接catch Exception,这样会处理所有的异常包括checked和unchecked
    异常的分类原理
    在这里插入图片描述
    总结
    异常分为Checked异常和运行时异常
  • Checked异常必须捕获或者声明抛出
  • 运行时异常不要求必须捕获或者声明抛出
    try-catch-finally中存在return语句的执行顺序
    finally块中语句不执行的情况
    throw和throws关键字的区别
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值