nullnull JavaEE基础教程 第7章 异常7.1 异常的处理机制7.2 异常的处理7.3 自定义异常null 异常是程序运行过程中产生的错误。比如在进
行除法运算时,如果除数为0,则运行时Java会自
动抛出一个算术异常,它会中断程序的正常运行,
如果不对它进行处理,有时会产生严重的后果。例
如:在转账过程中,将钱从一个账户转到另一个账
户时,如果钱已经从一个账户转出,在转到另一个
账户的过程中出现异常,程序被迫中止。此时,用
户就会损失这笔钱。null7.1 异常的处理机制7.1 异常的处理机制
在Java语言中,通过异常处理机制为程序提供错误处理的能力。
根据这个处理机制,对程序运行时可能遇到的异常情况,预先提供一些处理的方法。在程序执行代码的时候,一旦发生异常,程序会根据预定的处理方法对异常进行处理,异常处理完毕后,程序继续运行。
Java异常处理机制通过5个关键字进行控制:try、catch、throw、throws和finally。下面阐述系统如何通过这5个关键字对异常进行处理。程序将必须监控异常的语句包含在try块中。如果在try块中发生异常,程序将引发一个异常,通过使用catch关键字,系统捕获异常,并将处理该异常的代码写在catch块中。在finally块中,可以指定在程序结束之前必须执行的代码,无论异常是否发生,这段代码一定会被执行。异常的引发可以有自动和手动两种方法,如果需要手动产生异常,可以通过使用throw关键字来实现。throws关键字出现在方法的声明中,标识调用该方法可能抛出的各种异常。
返回null 7.2.1 Java内置异常
为了处理一些常见的异常,Java语言中提供了一些内置的异常类供我们使用。这些类都继承自java.lang.Throwable类,而Throwable类又继承自Object类。Throwable类有两个重要的子类:Error类和Exception
类。它们分别用来处理两种类型的异常。
Error类及其子类通常用来描述Java运行时的内部错误,比如:在读取磁盘上的文件时,磁盘的扇区出现了损坏;从软盘中读取文件数据时,软驱中没有放入软盘。Error类又称为致命异常类,该类表示的异常是比较严重的异常,一旦发生该类型的异常,通过修改程序代码是不能恢复程序的正常运行的。在一般情况下,发生该异常后,程序应该马上终止。 7.2 异常的处理返回nullException类及其子类代表另一种类型的异常。该类用于用户程序可
以捕获的异常情况。通过捕获和处理产生的异常,可以恢复程序的正常
运行。该类有一个重要的子类RuntimeException,又称为运行时异常。
在程序中出现除数为0的运算、数组下标越界等情况时,都会引发该类型
的异常。 null Java语言中
规定
关于下班后关闭电源的规定党章中关于入党时间的规定公务员考核规定下载规定办法文件下载宁波关于闷顶的规定
:只有Throwable、Error、Exception类及其派生类的实例,Java运行时系统才将它识别为系统异常。表7-1中列出了一些常用的异常类及其用途。下面简单介绍常见的异常类,其他异常类将在后面的章节中陆续介绍。
1)ArithmeticException类
该类用于描述算术异常,比如当除数为0时,会抛出该异常。
int result=8 /0 ; // 除数为0,抛出ArithmeticException异常
2)NullPointerException类用来描述空指针异常,当引用的对象是null时,如果试图通过“.”操作符访问该对象的成员时,会抛出该异常。
String str=null;
int len=str.length(); //因为str为null对象,不能调用它的length()方法。null3)ArrayIndexOutOfBoundException类
该类用来描述数组下标越界时出现的异常。
float[] arr=new float[4];
arr[4]=9; //数组的最大下标是3,而此处的4超过了该值
4)NubmerFormatException类
该类用于描述字符串转换为数字时的异常。
String str=”23U”;
double d=Double.parseDouble(str); //“23U”不能转换为double类型的数
null7.2.2 try和catch语句
在Java语言中,对容易引发异常的代码,可通过try…catch语句捕获。在try
语句块中编写可能引发异常的代码,然后在catch语句块中捕获这些异常,并进
行相应的处理。try…catch语句块的语法格式如下:
try{
可能产生异常的代码
}catch(异常类1 异常对象1){
异常处理代码段1
}catch(异常类2 异常对象2){
异常处理代码段2
}
……
}catch(异常类n 异常对象n){
异常处理代码段n
}
nulltry语句块中的代码执行后可能同时产生多种异常,程序捕获
哪一种类型的异常,是由catch语句中的“异常类”参数指定。
catch语句类似于方法的声明,包含一个异常类型和该类型
的一个对象,通过在catch块中调用该对象的方法可以获取
该异常的详细信息。代码中的每个catch语句块都用来捕获
一种类型的异常。如果try语句块中的代码执行时发生异常,
则会由上而下依次查找能捕获该异常的catch语句块,并执
行该catch语句块中的代码。
null 例7-1 根据输入的总分和人数,计算平均成绩
程序清单:ch07\ComputeAvg.java
import java.util.InputMismatchException;
import java.util.Scanner;
public class ComputeAvg {
public static void main(String[] args) {
int score,num; double avg;
Scanner in=new Scanner(System.in);
try{
System.out.println("请输入总分:");
score=in.nextInt(); //A
System.out.println("请输入人数:");
num=in.nextInt(); //B
avg=score/num; //C
System.out.println("平均成绩为:"+avg);
}catch(InputMismatchException e1){
System.out.println("输入不是数字!");
}catch(ArithmeticException e2){
System.out.println("人数不能为0");
}catch(Exception e3){
System.out.println("其他异常:");
} } }null以上介绍了如何使用try…catch结构实现异常处理。在使用该结构时,还必
须注意以下几点:
1)catch块一定要与try块一起使用,不能够单独使用catch块。
2)一个try块可以有多个catch块。但是,多个catch块的排列顺序必须是从特殊到一般,最后一个一般是Exception类。
3)如果不发生异常,catch块永远不会被执行。
4)一旦某个catch块被执行后,其他catch块都会被忽略。
5)try…catch结构可以嵌套使用null7.2.3 throw语句
前面介绍了如何获取并处理被Java运行时系统抛出的
异常。那么,用户可以显式地在程序中手动引发异常吗?
答案是可以的,通过使用Java异常处理机制提供的throw
关键字主动地抛出异常。throw语句的语法结构如下:
throw 异常类的实例程序
在执行到throw语句时,首先检查它所在层的try块,
是否有一个catch子句与该实例的类型匹配。如果找到匹
配的,则程序的控制权转移到该语句块。如果没有找到匹
配的,再检查上一层的catch语句块,直到执行到最外层
的catch块。如果一直找不到相应的异常处理代码,则程
序的控制权将交还给系统,程序将停止运行。 null例7-2 定义一个方法check(),检查输入的商品数是否大于0,如果小于0就抛出异常
。然后在主函数中调用该方法。
程序清单:ch07\checkDemo.java
import java.util.Scanner;
public class checkDemo {
public static void check(){
Scanner in=new Scanner(System.in);
System.out.println("请输入商品的书目:");
int num=in.nextInt();
if(num<0)
throw new NumberFormatException("商品书目不能小于0!");
else
System.out.println("商品数目为:"+num);
}
null public static void main(String[] args) {
try {
check();
} catch (Exception e) {
System.out.println("异常:"+e.getMessage());
}
}
}
程序的运行结果如下。
请输入商品的书目:
-3
异常:商品书目不能小于0! null 7.2.4 throws语句
若某个方法可能会产生异常,但不想在当前方法中处理该异常,那么可以将该异常抛出,然
后在调用该方法的代码中捕获并处理该异常。
为了实现该功能,可以使用Java语言提供的throws关键字实现该功能。throws关键字写在方
法声明的后面,用来指定该方法可能抛出的异常,多个异常之间用逗号隔开。
例7-3 定义一个方法test(),该方法可能抛出两种类型的异常,然后在主函数中调用该方法,
并处理可能出现的这些异常。null程序清单:ch07\throwsDemo.java
import java.io.IOException;
import java.util.Scanner;
public class throwsDemo {
public static void test() throws NullPointerException,IOException
{
System.out.println("请输入一个数字(0,1):");
Scanner in=new Scanner(System.in);
int flag=in.nextInt();
if(flag==1)
throw new NullPointerException(); null else
throw new IOException();
}
public static void main(String[] args) {
try {
test();
} catch (NullPointerException e) {
System.out.println("系统抛出了"+e.getClass()+"类型的异常");
} catch (IOException e) {
System.out.println("系统抛出了"+e.getClass()+"类型的异常");
}
}
}
程序运行后,如果输入“1”,方法test()抛出了NullPointerException类型的异常,程序
的输出结果如下所示:
请输入一个数字(0,1):
1
系统抛出了class java.lang.NullPointerException类型的异常 null7.2.5 finally语句
在编写异常处理代码时,无论try块中是否有异
常抛出,都有一些工作必须在try语句正常结束或者
出现异常后进行的,比如对try块中所调用资源的回
收工作。finally语句块可以包含一些无论程序是否正
常运行都必须执行的一些语句。该子句是可选的,
但是每个try语句块应该至少有一个catch语句块或
finally语句块。 null7.3 自定义异常 通常使用Java内置的异常类型可以描述在编写程序时出现的大部分异常情况,但根据需要,有时候需要创建自己的异常类,用来描述编程过程中遇到的一些特殊情况。下面就来介绍一下如何创建和使用自定义的异常类。
自定义异常类时,它必须派生自Throwable类及其子类。一般情况下,用户自定义异常类应该继承自Exception类。这样,可以使用Exception类中的所有方法。在程序中定义和使用自定义异常类,一般可分为以下几个步骤:返回null(1)创建派生自Exception类或其子类的自定义异常类
(2)在方法中通过throw语句抛出自定义的异常类对象
(3)如果在当前抛出异常的方法中处理异常,可以使用try…catch
语句块捕获并处理该异常;否则在方法声明处通过throws语句
指明方法可能抛出的异常。
(4)在调用由throws语句声明的方法时,在调用方法的代码中,捕获
并处理自定义的异常类对象。
null 例7-4 创建一个自定义异常类,个性化处理除数为0的情况。
程序清单:ch07\ExceptionTest.java
import java.util.Scanner;
class MyException extends Exception { //继承Exception类
private String myString;
public MyException(String myString) {
this.myString = myString; }
public String getMyString() {
return myString;
}
@Override
public String toString() { //重写了类的方法
return myString; }
}
public class ExceptionTest {
public static void main(String[] args) {
double i,j;
Scanner scan=new Scanner(System.in);
System.out.println("请输入分子:");
i=scan.nextDouble();null System.out.println("请输入分母");
j=scan.nextDouble();
try {
if(j==0){ //判断分母的值
throw new MyException("除数不能零!"); //A
}
else
System.out.println("分数值为:"+i+"/"+j+"="+(i/j));
} catch (MyException e) {
System.out.println(e); }
}
}
null该程序代码定义了一个继承Exception类的自定义异常类MyException。在这个类中,定义了一
个字符串成员,重写了toString()方法,个性化输出自定义的错误信息。然后在测试类中输入了两
个数,如果第二个数为0,则在代码行A处抛出带有自定义错误信息的异常对象,然后在catch块中
对上述抛出异常。程序的运行结果如下:
请输入分子:
3
请输入分母
0
除数不能零!
nullThe End