异常处理
本章要点
异常
异常(Exception)又称例外—是在程序运行过程中发生的、会打断程序正常执行的事件。
例如:除0(ArithmeticException)、没有给对象开辟内存空间时会出现空指针异常(NullPointException)、文件找不到(FileNotFoundException)、数组元素下标越界(ArrayIndexOutOfBoundsException)等。这些事件的发生将阻碍程序的正常运行。为了增加程序的容错性、健壮性,程序设计时,必须考虑到可能发生的异常情况并做出相应的处理。
设计程序时必须考虑可能发生的异常事件并作出相应的处理。传统程序设计时,要由编程者自己测试出错发生的原因,通过 i f 语句判断是否出现了异常事件,并进行相应的处理。
Ⅰ 写程序难
★ 大部分精力花在出错处理上了
Ⅱ 只把能够想到的错误考虑到
★ 对以外的情况无法处理
Ⅲ 程序可读性差
★ 大量的错误处理代码混杂在程序中
Ⅳ 出错返回的信息量太少
★ 无法更确切的了解错误状况或原因
异常层次结构及分类
[caption id=”attachment_379” align=”alignnone” width=”852”] 异常层次结构及分类[/caption]
Error**与**Exception
1.Throwable**以下的异常都可以被捕获**
2.所有**Error类及其子类代表java运行时系统中可能发生的异常情况,是致命的,即程序遇到了非常严重的不正常状态,不能简单恢复执行,这就是错误**。如:内存耗尽、系统内部错误等,通常我们(应用程序)不应捕获这些异常。
3.所有**Exception类及其子类代表java程序中可能发生的异常情况,是非致命的,通过某种修正后程序还能继续执行。这类错误叫作异常。如:文件不存在、无效的下标、空引用、网络断开、打印机脱机、磁盘满了等,通常我们(应用程序)可以捕获这些异常。**
Exception分类
Exception是要重点掌握的,它也分为两类: (1)受控异常(检查异常):java编译器对受控异常强制执行捕获或者声明
(2)不受控异常(非检查异常):java编译器不会检查代码以确定是捕获或者声明不受控异常。尽管编译器对不受控异常没有捕获或者声明的强制要求,但在知道可能发生这种异常时应提供合适的异常处理代码。
|—— IOException
|—— AWTException
Exception ——|
|—— ClassNotFoundException
|—— NoSuchMethodException
不受控异常
[caption id=”attachment_380” align=”alignnone” width=”851”] 异常层次结构及分类[/caption]
异常处理
try-catch**结构**
try{
//**可能产生异常的代码**
}
catch(**someException e){**
//**处理异常的代码**
}
catch(**someException e){**
//**处理异常的代码**
}
try-catch-finally**结构**
try{
//**可能产生异常的代码**
}catch(**someException e){**
//**处理异常的代码**
} finally{
//**必须执行的代码**
}
异常处理
- 注意:
- catch**和finally必须至少有一个跟在**try 后面
- 如果不发生异常**,则catch**块中的代码不会被执行
- 不论是否发生异常**finally**块中的代码一定会被执行
自定义异常
用户为什么要自定义异常?
Java**类库中定义的异常主要用来处理编程中一些常见的运行错误,这些错误是系统可以预见和自动识别的。**
若用户程序有其特殊的逻辑要求,需要通过**Java**的异常处理机制来处理用户自定义的异常。
如何自定义异常?
- 创建一个类,必须继承**Exception**类
- 在可能抛出自定义异常方法的方法头中声明该异常
- 在方法体中指明需要抛出自定义异常对象的位置★ 创建异常对象★ 使用**throw**子句抛出异常
自定义异常(例)
在可能抛出自定义异常方法的方法头中声明该异常
public static void show(**int score)**
throws NumberRangeException**{**
if(score<0||score>100){
NumberRangeException e=
new NumberRangeException**(“输入的数字不在指定的范围!请重新输入。“);**
throw e;
}
else{
int s=score/10;
switch(s){
case 10:
case 9:System.out.println(“A”);break;
case 8:System.out.println(“B”);break;
case 7:System.out.println(“C”);break;
case 6:System.out.println(“D”);break;
default:System.out.println**(“E”); }**
}
}
show()**方法的调用**
public static void main(String[] args**) {**
int score = Integer.parseInt**(args[0]);**
try{
show(score);
}catch(**NumberRangeException e){**
System.out.println**(e.getMessage());**
}
}
throws与throw
1.throws 用于抛出方法层次的异常,并且直接由这些方法调用异常处理类来处理该异常,所以它常用在方法的后面。比如 public static void main(String[] args) throws IOException
2.throw 用于方法块里面的代码,比throws的层次要低,表示它抛出异常, 但它不会处理它,而是由方法块的throws Exception来调用异常处理类来处理。
转载请注明:转自:TeenShare梯云分享
- 异常处理
- 异常
- 异常(Exception)又称例外—是在程序运行过程中发生的、会打断程序正常执行的事件。
- 例如:除0(ArithmeticException)、没有给对象开辟内存空间时会出现空指针异常(NullPointException)、文件找不到(FileNotFoundException)、数组元素下标越界(ArrayIndexOutOfBoundsException)等。这些事件的发生将阻碍程序的正常运行。为了增加程序的容错性、健壮性,程序设计时,必须考虑到可能发生的异常情况并做出相应的处理。
- 设计程序时必须考虑可能发生的异常事件并作出相应的处理。传统程序设计时,要由编程者自己测试出错发生的原因,通过 i f 语句判断是否出现了异常事件,并进行相应的处理。
- 传统异常处理存在的困难和问题
- Ⅰ 写程序难
- ★ 大部分精力花在出错处理上了
- Ⅱ 只把能够想到的错误考虑到
- ★ 对以外的情况无法处理
- Ⅲ 程序可读性差
- ★ 大量的错误处理代码混杂在程序中
- Ⅳ 出错返回的信息量太少
- ★ 无法更确切的了解错误状况或原因
- 1.Throwable**以下的异常都可以被捕获**
- 2.所有**Error类及其子类代表java运行时系统中可能发生的异常情况,是致命的,即程序遇到了非常严重的不正常状态,不能简单恢复执行,这就是错误**。如:内存耗尽、系统内部错误等,通常我们(应用程序)不应捕获这些异常。
- 3.所有**Exception类及其子类代表java程序中可能发生的异常情况,是非致命的,通过某种修正后程序还能继续执行。这类错误叫作异常。如:文件不存在、无效的下标、空引用、网络断开、打印机脱机、磁盘满了等,通常我们(应用程序)可以捕获这些异常。**
- Exception是要重点掌握的,它也分为两类: (1)受控异常(检查异常):java编译器对受控异常强制执行捕获或者声明
- (2)不受控异常(非检查异常):java编译器不会检查代码以确定是捕获或者声明不受控异常。尽管编译器对不受控异常没有捕获或者声明的强制要求,但在知道可能发生这种异常时应提供合适的异常处理代码。
- 在可能抛出自定义异常方法的方法头中声明该异常
- public static void show(**int score)**
- throws NumberRangeException**{**
- if(score<0||score>100){
- NumberRangeException e=
- new NumberRangeException**(“输入的数字不在指定的范围!请重新输入。“);**
- throw e;
- }
- else{
- int s=score/10;
- switch(s){
- case 10:
- case 9:System.out.println(“A”);break;
- case 8:System.out.println(“B”);break;
- case 7:System.out.println(“C”);break;
- case 6:System.out.println(“D”);break;
- default:System.out.println**(“E”); }**
- }
- }