第八章 异常处理总结

8.1异常概述

在程序中,错误可能产生于程序员没有预料到的各种情况,或者是超出了程序员可控范围的环境因素,如试图打开一个根本不存在的文件等,在 Java中,这种在程序运行时可能出现的一些错误称为异常。Java语言的异常处理机制优势之一就是可以将异常情况在方法调用中进行传递,通过传
递可以将异常情况传递到合适的位置再进行处理, 这种机制类似于现实中发现了火灾,一个人是无 法扑灭大火的,那么可以将这种异常情况传递给119,119 再将这个情况传递给附近的消防队,消防队及时赶到并进行灭火。使用这种处理机制,使得Java语言的异常处理更加灵活,Java语言编写的项目更加稳定。当然,异常处理机制也存在一些弊端,例如,使用异常处理可能会降低程序的执行效率,增加语法复杂度等。
例8.1

public class RefTest {//创建类
		public static void main(String[] args) { // 主方法
			int result = 3 / 0; // 定义int型变量并赋值
			System.out.println(result); // 将变量输出
		}
	}

8.2 异常的分类

Java类库的每个包中都定义了异常类,所有这些类都是 Throwable 类的子类。Throwable 类派生了两个子类,分别是 Error 类和Exception类,其中,Error类及其子类用来描述Java运行系统中的内部错误以及资源耗尽的错误,这类错误比较严重。Exception 类称为非致命性类,可以通过捕捉处理使程序继续执行。Exception 类又可以根据错误发生的原因分为运行时异常和非运行时异常。
由的异常类继承体系如图所示。

8.2.1系统错误-Error

Error 类及其子类通常用来描述 Java 运行系统中的内部错误 该类定义了常规环境下不希望由 
程序捕获的异常,比如 OutOfMemoryError、ThreadDeath等,这些错误发生时,Java虚拟机(JVM)一般会选择线程终止。

例8.2

public class RefTest {//创建类
	public static void main(String[] args) { // 主方法
		String str = "lili"; // 定义字符串
		System.out.println(str + "年龄是:"); // 输出的提示信息
		int age = Integer.parseInt("20L"); // 数据类型的转换
		System.out.println(age); // 输出信息
	}
}

 例8.3

public class RefTest {//创建类
	private int playerNum;						// 定义“球员数量”
	private String teamName;						// 定义“球队名称”
	public RefTest() throws ClassNotFoundException						// 构造方法FootballTeam()
	{
		Class.forName("com.mrsoft.Coach");// 寻找“教练”类
	}
	public static void main(String[] args) throws ClassNotFoundException {//主函数
		RefTest team = new RefTest();	// 创建对象team
		team.teamName = "com.mrsoft";			// 初始化teamName
		team.playerNum = 19;					// 初始化playerNum
		System.out.println("\n球队名称:" + team.teamName + "\n" + "球员数量:" + team.playerNum + "名");//输出"\n球队名称:" + team.teamName + "\n" + "球员数量:" + team.playerNum + "名"
	}
}

8.3 捕捉处理异常

前面讲解非运行时异常时,提到了系统会自动为非运行时异常提供两种解决方案,一种是使用 throws字,种使用trycatch代码,这两种方法都是用来对异常进行处理的,本节首先对try...catch代码块进行讲解。

 例8.4

public class RefTest {//创建类
	public static void main(String[] args) {//主函数
		try { // try语句中包含可能出现异常的程序代码
			String str = "lili"; // 定义字符串变量
			System.out.println(str + "年龄是:"); // 输出的信息
			int age = Integer.parseInt("20L"); // 数据类型转换
			System.out.println(age);
		} catch (Exception e) { // catch代码块用来获取异常信息
			e.printStackTrace(); // 输出异常性质
		}
		System.out.println("program  over"); // 输出信息
	}
}

 例8.5

public class RefTest {//创建类
	public static void main(String[] args) {//主函数
		try { // try语句中包含可能出现异常的程序代码
			String str = "lili"; // 定义字符串变量
			System.out.println(str + "年龄是:"); // 输出的信息
			int age = Integer.parseInt("20L"); // 数据类型转换
			System.out.println(age);//输出age
		} catch (Exception e) { // catch代码块用来获取异常信息
			e.printStackTrace(); // 输出异常性质
		}
		System.out.println("program  over"); // 输出信息
	}
}

 例8.6

public class RefTest {//主函数
	static void pop() throws NegativeArraySizeException {// 定义方法并抛出NegativeArraySizeException异常
		int[] arr = new int[-3]; // 创建数组
	}
 
	public static void main(String[] args) { // 主方法
		try { // try语句处理异常信息
			pop(); // 调用pop()方法
		} catch (NegativeArraySizeException e) {//处理异常
			System.out.println("pop()方法抛出的异常"); // 输出异常信息
		}
	}
}

 例8.7

public class RefTest {//主函数
	public static void main(String[] args) { // 主方法
		int num1 = 25;//定义int类型的num赋值为25
		int num2 = 0;//定义int类型的num赋值为0
		int result;//定义int类型的result
		if (num2 == 0) // 判断num2是否等于0,如果等于0,抛出异常
		{
			throw new ArithmeticException("这都不会,小学生都知道:除数不能是0!!!");	// 抛出ArithmeticException异常
		}
		result = num1 / num2; // 计算int1除以int2的值
		System.out.println("两个数的商为:" + result);//输出"两个数的商为:" + result
	}
}

8.5自定义异常
使用Java内置的异常类可以描述在编程时出现的大部分异常情况,但是有些情况是通过内置异常类无法识别的,例如,下面的一段代码:
int age = -50;
System.out.println("王师傅今年 "+age+"岁了!");
上面代码运行时没有任何问题,但是大家想一想:人的年龄可能是负数吗?这类问题编译器是无法识别的,但很明显不符合常理,那么,对于这类问题即可通过自定义异常对它们进行处理。Java中可以通过继承 Exception 类自定义异常类。
在程序中使用自定义异常类,大体可分为以下几个步骤。(1)创建自定义异常类。
(2)在方法中通过 throw 关键字抛出异常对象。
(3)如果在当前抛出异常的方法中处理异常,可以使用 try….catch代码块捕获并处理,否则,在方法的声明处通过 throws 关键字指明要抛给方法调用者的异常,继续进行下一步操作。
(4)在出现异常方法的调用者中捕获并处理异常。有了白定义异常,再来解决年龄为负数的异常问题。

例8.8

public class RefTest {//主函数
		static void avg(int age) throws MyException {	// 定义方法,抛出自定义的异常
			if (age < 0) { // 判断方法中参数是否满足指定条件
				throw new MyException("年龄不可以使用负数"); // 错误信息
			} else {
				System.out.println("王师傅今年  " + age + " 岁了!");
			}
		}
 
		public static void main(String[] args) { // 主方法
			try { // try代码块处理可能出现异常的代码
				avg(-50);
			} catch (MyException e) {
				e.printStackTrace();
			}
		}
}

 8.6 异常的使用原则
 常处理不应该用来控制程序的正常流其主要作用是捕获程序在运行时发生的异常并进行相应的处理。编写代码处理某个方法可能出现异常时,可遵循以下原则。
(1)不要过度使用异常,虽然通过异常可以增强程序的健壮性,但如果使用过多不必要的异常处理,可能会影响程序的执行效率。
(2)不要使用过于庞大的 try...catch块。在一个try块中放置大量的代码。这种写法看上去“很简单”但是由于try块中的代码过于庞大,业务过于复杂,会造成try块中出现异常的可能性大大增加,从而导致分析异常原因的难度也大大增加。
(3)避免使用catch(Exception)。因为如果所有异常都采用相同的处理方式,将导致无法对同异常分情况处理;另外,这种捕获方式可能将程序中的全部错误,异常捕获到,这时如果出现些“关键”异常,可能会被“悄悄地”忽略掉。
(4)不要忽略捕捉到的异常,遇到异常一定要及时处理。
(5)如果父类抛出多个异常,则覆盖方法必须抛出相同的异常或其异常的子类,不能抛出来异常。
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值