黑马程序员——异常机制1:概述

本文介绍了Java中的异常处理机制,包括异常的基本概念、异常信息解读、异常的分类等内容,并通过实例展示了异常处理的重要性。

------- android培训java培训、期待与您交流! ----------

1. 异常机制概述

异常,就是程序在运行时出现了不正常情况。而异常机制就是发生错误,解决错误的一套方法。我们通过一个例子来初步认识一下异常,

代码1:

/*
	定义一个数学工具类
	为了演示方便仅定义一个静态方法——除法
*/
class MathTools
{
	static int division(int x,int y)
	{
		return x/y;
	}
}
class ExceptionDemo
{
	public static voidmain(String[] args)
	{
		//通过类名调用除法方法,并打印结果
		int result = MathTools.division(10, 2);
		System.out.println("10/2= "+result);
 
		//最后打印“over”
		System.out.println("over");
	}
}
运行结果为:


10/2 = 5

over

这段代码运行正常,并没与出现任何问题。但是,日后别人在使用我们开发的程序时可能会传入不符合数学运算规则的数,比如5除以0。当我们将代码1中的10和2改成5和0时,编译时期是不会出错的,因为并没有任何语法错误,只有运行时才会进行运算,这时Java虚拟机就会报出ArithmeticException异常,就像这样:

Exception in thread "main" java.lang.ArithmeticException: /by zero

at MathTools.division(ExceptionDemo.java:7)

at ExceptionDemo9.main(ExceptionDemo.java:14)

而且,报出这样的异常以后,并没与继续执行后面的打印“over”的语句,而是直接结束了程序。上述这种现象就说明,这段代码在运行时出现了异常。

2. 异常信息的解读

那么我们就来解读一下上述Java虚拟机报出的异常信息。

首先,ArithmeticException的意思是算术异常。

其次,冒号后面的内容是告诉我们发生异常的原因:/ by zero,意思是被0除了。

再次,后面两句异常信息,表示异常出现的位置。首先是在MathTools类中的静态方法division中出现了异常,在ExceptionDemo.java文件中的第7行。然后,由于division方法中产生了异常,又连带导致了在主函数中也发生了异常(这是因为在主函数调用了MathTools的division方法),在ExceptionDemo.java文件的第14行。

那么发生了这样的异常以后,就直接导致了程序的停止,甚至都没有将最后的输出语句执行。

3. 异常的由来

类是对日常生活中事物的描述。而程序的执行可以说就是在模拟事物运转的过程。而事物在运转的过程中多多少少总会发生错误,那么异常就是Java语言中对这些错误的描述,并封装成对象。

之所以要将异常封装成对象,就是因为异常中包括了问题的名称、问题的原因还有出现问题的位置等等信息,总而言之异常就是一类比较复杂的事物,因此按照面向对象的思想我们就需要将异常封装成对象,并对外提供操作上述这些信息的方法,以便于对异常进行恰当的处理。总结一句话就是:把问题封装成对象就是异常。

4. 异常的分类

Java的异常机制中,按照问题的严重程度不同,将异常分为两类:Error类和Exception类。Error表示错误,是一类比较严重的问题,Exception表示异常,是一类相对不太严重的问题。

1) 错误——Error类

打个比方,异常就像人得病一样,那么Error就像癌症等非常严重的疾病,这类疾病已经无法治疗,也就是无法处理了。因此对于Error一般不对其编写针对性的处理代码。Error类有很多具体的子类,比如NoClassDefFoundError,表示没有找到指定要运行的类。再比如,当我们定义了一个长度1024*1024*600(也就是600M)的字节数组并运行这段代码时,会报出OutOfMemoryError,表示内存溢出,因为,虚拟机有自己默认的启动空间,超出了这个空间大小就会报错。上述这样的错误已经超出了Java虚拟机可处理的范围之外了,不需要也没办法处理了。


小知识点1:

这些Error子类大多都有一个特点——类名后缀都是“Error”。这样的命名方式可以帮助程序员快速了解该类的所属的父类,方便使用。Exception亦然。这样的设计方式是值得我们借鉴的。

 

2) 异常——Exception

相对于癌症,Exception就像感冒发烧这样的小病,经过一些简单的治疗手段是可以痊愈的,或者说可以处理的,因此通常都会针对Exception编写处理代码。Exception类相比Error有更多的子类,包括在前面的内容中已经学过了的几种Exception类的子类,比如ArrayIndexOutOfBoundsException(数组角标越界异常)、NullPointerException(空指针异常)、ClassCastException(类型转换异常)和ArithmeticException(算术异常)等。

3) Error与Exception的共性——Throwable类

无论是严重还是轻微,Exception与Error都是程序在运行时出现的问题,既然都是问题,就有一些共性的特征,比如都有不正常的信息,或者引发这些问题的原因等等。有了共性内容我们就可以像其他类一样将他们向上抽象出两者共同的父类——Throwable类,意思是可抛出的。

Java的API文档中对Throwable类的定义如下:Throwable 类是 Java 语言中所有错误或异常的超类。我们在前面的内容中也说过,想要了解某个继承体系,只要去查阅这体系的根父类就可以了。

通过阅读Throwable类的API文档,我们可以了解到,该类除了有为子类提供初始化方式的构造方法以外,还有getCause(获取发生异常的原因)、getMessage(获取异常信息)、printStackTrace(打印错误信息)和toString(将异常转为字符串返回)等方法。这些方法可以方便我们了解异常产生的原因、位置等信息,方便去处理这些异常。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值