http://book.csdn.net/bookfiles/150/1001506491.shtml
1.1 简介为全面了解“异常”的概念,先来分析一个实例。假定要编写一个Java程序,该程序读入用户输入的一行文本,并在终端显示该文本。这是一个演示Java语言I/O功能的简单回显(echo)程序。若认为代码一定能正常运行,则可以编写以下程序:
1 import java.io.*;
2 public class BuggyEchoInput{
3 public static void main(String [] args){
4 System.out.println("Enter text to echo");
5 InputStreamReader isr = new InputStreamReader(System.in);
6 BufferedReader inputReader = new BufferedReader(isr);
7 String inputLine = inputReader.readLine();
8 System.out.println("READ: " + inputLine);
9 }
10 }
分析一下这段代码,在BuggyEchoInput类中,第3行声明了一个main方法;第4行提示用户输入文本;在第5、6行设置BufferedReader对象连接到InputStreamReader,而InputStream Reader又连接到标准输入流System.in;第7行读入一行文本;第8行用标准输出流System.out显示出该文本。
实际上,BuggyEchoInput类完全可能出现问题。要在调用第7行的readLine方法时正确读取输入,下面几种假设都必须成立:假定键盘有效,键盘能与计算机正常通信;假定键盘数据可从操作系统传输到Java虚拟机,又从Java虚拟机传输给inputReader。
大多数情况下,上述假设都成立,但不尽然。为此,Java采用异常方法,以应对可能出现的错误,并采取步骤进行更正。在本例,若试图编译以上代码,将看到以下消息:
BuggyEchoInput.java:7: unreported exception java.io.IOException;
must be caught or declared to be thrown
String inputLine = inputReader.readLine();
1 error
从中可看到,第7行调用的readLine方法可能出错;若果真如此,则产生IOException来记录故障。编译器器错误是在告诉您:需要更改代码来解决这个潜在的问题。
在HTML Java文档中,也可看到同样的信息。若在浏览器打开BufferedReader类的Java文档页,并查看readLine方法,将看到图1-1显示的内容。
图1-1 BufferedReader类的readLine方法的Java文档 由图1-1可知,readLine方法有时产生IOException。如何处理该潜在故障?编译器要求“捕获”或“声明”IOException。“捕获(catch)”指当readLine方法产生错误时截获该错误,并处理或记录问题。而“声明(declare)”指错误可能引发IOException,并通知调用该方法的任何代码:可能产生异常;换言之,“声明”不处理异常,而将异常传给调用该方法的任何代码。
若要捕获异常,必须添加一个特殊的“处理代码块”,来接收和处理IOException。可能的回显程序如下所示:
1 import java.io.*;
2 public class EchoInputHandle{
3 public static void main(String [] args){
4 System.out.println("Enter text to echo");
5 InputStreamReader isr = new InputStreamReader(System.in);
6 BufferedReader inputReader = new BufferedReader(isr);
7 try{
8 String inputLine = inputReader.readLine();
9 System.out.println("READ: " + inputLine);
10 }
11 catch (IOException exc){
12 System.out.println("Exception encountered: " + exc);
13 }
14 }
15 }
新添的代码块包含关键字try和catch(第7、10、11和13行),表示要读取输入。若成功,则正常运行。若读取输入时出错,则捕获问题(由IOException对象表示),并采取相应措施。在本例,采用的处理方式是输出异常。
若不准备捕获IOException,仅声明异常,则要特别指定main方法可能出错,而且特别说明可能产生IOException。此时的程序可能如下所示:
1 import java.io.*;
2 public class EchoInputDeclare{
3 public static void main(String [] args) throws IOException{
4 System.out.println("Enter text to echo");
5 InputStreamReader isr = new InputStreamReader(System.in);
6 BufferedReader inputReader = new BufferedReader(isr);
7 String inputLine = inputReader.readLine();
8 System.out.println("READ: " + inputLine);
9 }
10 }
此代码未采取措施来处理readLine方法的可能故障。但它说明:main方法可能产生IOException,调用该方法的任何代码都必须作好处理问题的准备。
在简要介绍这个示例程序后,下面将详细讨论基本概念,讲述异常和异常的产生方式,描述基本类层次结构,解释捕获和声明异常的规则。 |