16.2.2 自定义异常
用户自定义异常通过扩展Exception类来创建。这种异常类可以包含一个“普通”类所包含的任何东西。
【实例16.6】下面就是一个用户定义异常类的例子,它包含一个构造函数、几个变量和方法。
01 public class One
02 {
03 public static void main(String str[]args)throws ServerTimedOutException
04 {
05 try
06 {
07 throw new ServerTimedOutException("Could not connect",80);
08 }
09 catch(ServerTimedOutException e)
10 {
11 System.out.println("异常信息是:"+e.toString());
12 }
13 }
14 }
15 class ServerTimedOutException extends Exception
16 {
17 private String reason;
18 private int port;
19 public ServerTimedOutException(String reason, int port)
20 {
21 this.reason=reason;
22 this.port=port;
23 }
24 public String getReason()
25 {
26 return reason;
27 }
28 public int getPort()
29 {
30 return port;
31 }
32 }
【代码说明】第15~32行自定义了一个异常类ServerTimedOutException,其继承自Exception类。第5~8行捕获异常信息,第9~12行处理异常信息。
【运行效果】
异常信息是:ServerTimedOutException
【实例16.7】考虑一个客户服务器程序。在客户代码中,要与服务器连接,并希望服务器在5秒内响应。如果服务器没有响应,代码就抛出一个异常(如一个用户定义的ServerTimedOutException),实现方法如下所示。
01 public void connectMe(String serverName)throws
02 ServerTimedOutException{
03 int success;
04 int portToConnect=80;
05 success=open(serverName, portToConnect);
06 if(success==-1){
07 throw new ServerTimedOutException(
08 "Could not connect",80);
09 }
10 }
要捕获异常,使用try语句:
11 public void findServer()
12 {
13 try{
14 connectMe(defaultServer);
15 }catch(ServerTimedOutException e){
16 System.out.println("Server timed out, trying alternate");
17 try{
18 connectMe(alternateServer);
19 }catch(ServerTimedOutException e1)
20 {
21 System.out.println("No server currently available");
22 }
23 }
【代码说明】上述代码并不完整,只是给出了部分代码,包括第2行的异常声明,第13~22行的捕获异常和处理异常。读者可根据上一个实例的实现方法,实现这个实例。
也可部分地处理一个异常,然后将其抛出。如:
try{
……
}catch(ServerTimedOutException e){
System.out.println("Error caught");
throw e;
}