首页 | 源码下载 | 网站模板 | 网页特效 | 广告代码 | 网页素材 | 字体下载 | 书库 | 站长工具
会员投稿 投稿指南 RSS订阅
当前位置:主页>网络编程>java教程>资讯:Java中的异常、断言、日志解析(上)

Java中的异常、断言、日志解析(上)

www.jz123.cn  2009-09-18   来源:   中国建站    责任编辑(袁袁)    我要投递新闻

  4)在这三种结构里面需要注意以下几个问题

  简单总结几点:

  [1]try、catch、finally三个语句块均不能单独使用,三者可以组成try+catch、try+catch+finally、try+finally三种结构,catch语句可以有一个或多个,而且都处于平级,finally语句最多一个

  [2]try、catch、finally三个代码块中变量的作用为代码块内部,即变量作用于为局部变量作用域,分别独立而不能相互访问。如果要在三个块中都可以访问,则需要将变量定义到这些块的外面,即在{}之外声明

  [3]多个catch块时候,只会匹配其中一个异常类并执行catch块代码,而不会再执行别的catch块,并且匹配catch语句的顺序是由上到下,在声明过程中子类需要放在前边捕捉

  至于throw和throws关键字,这里再摘录网上一篇BLOG里面的说明:

  throw关键字是用于方法体内部,用来抛出一个Throwable类型的异常。如果抛出了检查异常,则还应该在方法头部声明方法可能抛出的异常类型,该方法的调用者也必须检查处理抛出的异常。如果所有方法都层层上抛获取的异常,最终JVM会进行处理,处理也很简单,就是打印异常消息和堆栈信息。如果抛出的是Error或RuntimeException,则该方法的调用者可选择处理该异常。

  throws关键字用于方法体外部的方法声明部分,用来声明方法可能会抛出某些异常。仅当抛出了检查异常,该方法的调用者才必须处理或者重新抛出该异常。当方法的调用者无力处理该异常的时候,应该继续抛出,而不是囫囵吞枣一般在catch块中打印一下堆栈信息做个勉强处理。

  最终补充一个复杂的概念说明代码:


    import java.io.File;
  import java.io.FileNotFoundException;
  import java.io.FileReader;
  import java.io.IOException;
  /**
  * 关于异常的概念说明代码
  */
  public class ExceptionTester {
  public static void main(String args[]) throws IOException{
  try{
  processException();
  }
  finally{
  System.out.println("Main body");
  }
  }
  public static void processException() throws IOException{
  try{
  System.out.println("Inner Try");
  File file = new File("C:/read.txt");
  FileReader reader = new FileReader(file);
  }catch(IOException ex){
  System.out.println("Inner Exception Sub");
  throw new IOException();
  }catch(Exception ex){
  System.out.println("Inner Exception");
  throw new FileNotFoundException();
  }finally{
  try{
  System.out.println("File Not Found Try");
  throw new FileNotFoundException();
  }catch(FileNotFoundException ex){
  System.out.println("File Not Found Exception");
  }
  System.out.println("Inner Last");
  }
  System.out.println("Outer Last");
  }
  }

  先看看这个程序的输出,然后再详细分析:


    Inner Try
  Inner Exception Sub
  File Not Found Try
  File Not Found Exception
  Inner Last
  Main body
  Exception in thread "main" java.io.IOException
  at ExceptionTester.processException(ExceptionTester.java:29)
  at ExceptionTester.main(ExceptionTester.java:14)

  [1]首先程序进入processException()方法执行System.out.println("Inner Try"),所以第一行输出为Innser Try

  [2]异常发生,因为C:/read.txt文件不存在,所以此处会抛出异常java.io.FileNotFoundException,抛出代码的行为:

  FileReader reader = new FileReader(file);

  [3]抛出异常过后,首先捕捉到了该异常的是第一个catch块,因为IOException是FileNotFoundException的父类,所以该catch块捕捉了抛出的异常输出了Inner Exception Sub

  [4]catch捕捉到异常执行过后继续往外抛异常,这样catch块就执行完了,然后执行finally块的内容

  [5]在finally块中先执行try块的内容,所以输出为:File Not Found Try

  [6]紧接着又从该块里面抛出了FileNotFoundException异常,抛出该异常过后又被内部的catch块捕捉到,所以继续输出:File Not Found Exception

  [7]内部的catch块捕捉到异常过后,该异常就不往外继续抛,那么就继续执行finally后边的语句,所以输出Inner Last

  [8]然后这里需要注意的是,外层的异常并没有处理,因为外层catch里面的内容是继续抛出异常,这个时候finally执行完毕,就不会输出Outer Last了,而是直接把异常抛出到方法外面

  [9]最外层继续往外抛出异常,而最外层是try+finally结构,所以执行完finally语句块过后,继续往外抛异常,从main方法里面抛出,所以程序最后的输出是:

  Main body

  Exception in thread "main" java.io.IOException

  at ExceptionTester.processException(ExceptionTester.java:29)

  at ExceptionTester.main(ExceptionTester.java:14)

  iii.Java常用异常API全表【不包含JDBC部分,java.sql包里的Exception】

  接下来针对常见的异常类型进行一个简单的讲解,使得初学者更加明白[]中为继承树往上继续直到介绍的根类异常,该文档整理于Java API 6.0文档,这里不整理Error部分,因为Error部分一般情况不能被catch,也就是不能被捕捉,这里整理的主要是RuntimeException和CheckedException两种类型的异常

  1)java.lang包:【*:java.lang.RuntimeException的父类是java.lang.Exception,()里面标识着从什么时候的JDK版本号开始拥有该类】

  RuntimeException(1.0):

  |—ArithmeticException(1.0):[->RuntimeException]

  |:当出现运算条件的异常的时候,就抛出该异常,常见情况:计算除法的时候除数为0,该异常为RuntimeException

  |—ArrayStoreException(1.0):[->RuntimeException]

  |:试图将错误类型的对象存储到一个对象数组的时候抛出该异常,例如一个String的数组里面添加一个Integer对象的时候就会抛出该错误

  |—ClassCastException(1.0):[->RuntimeException]

  |:试图将一个对象强制转换成为不是该实例的子类的时候,强制转换类型会抛出该异常

  |—EnumConstantNotPresentException(1.5):[->RuntimeException]

  |:当应用程序试图通过名称和枚举类型访问那些不包含具有指定名称的常量或者枚举量的时候,抛出该异常

  |—IllegalArgumentException(1.0):[->RuntimeException]

  |:如果方法传递了一个不合法或者不正确的参数的时候,会抛出该异常

  |—IllegalThreadStateException(1.0):[->IllegalArgumentException->RuntimeException]

  |:当指示线程没有处于请求操作所要求的适当状态的时候抛出的异常,关联于Thread类中的suspend和resume方法

  |—NumberFormatException(1.0):[->IllegalArgumentException->RuntimeException]

  |:当应用程序试图将字符串转换成一种数值类型,但是该字符串不能转换为适当格式时,抛出该异常。

  |—NegativeArraySizeException(1.0):[->RuntimeException]

  |:如果应用程序试图创建大小为负的数组的时候,抛出该异常【*:需要区分于ArrayIndexOutOfBoundsException,一个创建数组的时候为负,一个是数组的索引为负,一个是创建的时候一个是使用的时候】

  |—IndexOutOfBoundsException(1.0):[->RuntimeException]

  |:指示某个排序索引超出范围的时候抛出,针对数组、字符串和向量排序

  |—ArrayIndexOutOfBoundsException(1.0):[->IndexOutOfBoundsException->RuntimeException]

  |:当访问数组的索引非法越界的时候,就抛出该异常,如果索引为负或者索引大于数组大小的时候,索引为非法索引,注意数组的最大索引为数组的length-1

  |—StringIndexOutOfBoundsException(1.0):[->IndexOutOfBoundsException->RuntimeException]

  |:此异常由String方法抛出,指示索引或者为负,或者超出字符串的大小。一般情况在charAt的方法调用的时候,当索引等于或者大于字符串的大小的时候抛出该异常

  |—NullPointerException(1.0):[->RuntimeException]

  |:当应用程序试图在需要对象的地方使用null时,抛出该异常,该异常为程序开发中的常用异常:

  [1]调用null对象的实例方法

  [2]访问或修改null对象的字段

  [3]将null作为一个数组,获得其长度

  [4]将null作为一个数组,访问或修改其时间片

  [5]将null作为Throwable值抛出

  |—SecurityException(1.0):[->RuntimeException]

  |:此异常由安全管理器抛出,指示存在一定的安全侵犯

  |—TypeNotPresentException(1.5):[->RuntimeException]

  |:当应用程序试图使用表示类型名称的字符串对类型进行访问,但无法找到带有指定名称的类型定义的时候抛出该异常,区别于ClassNotFoundException的是,该异常未经过类型检查,而ClassNotFoundException是经过类型检查的异常

  |—UnsupportedOperationException(1.2):[->RuntimeException]

  |:如果不支持请求的操作的时候,就抛出该异常

  Exception(1.0):

  |—InstantiationException(1.0):[->Exception]

  |:当应用程序试图使用Class中的newInstance方法创建类的实例的时候,指定的类对象没有办法被实例化,抛出该异常,一般有以下状况:

  [1]类对象标识一个抽象类、接口、数组类、基本类型、void

  [2]类没有非null的构造方法

  |—NoSuchFieldException(1.1):[->Exception]

  |:当某个类不存在该名称的字段的时候抛出该异常,一般情况在Java反射中使用的时候会抛出该异常

  |—NoSuchMethodException(1.0):[->Exception]

  |:在反射过程不能找到某一特定方法的时候,抛出该异常

  |—InterruptedException(1.0):[->Exception]

  |:如果线程在活动之前或者活动期间处于正在等待、休眠或者占用状态且该线程被中断的时候,抛出该异常。

  |—ClassNotFoundException(1.0):[->Exception]

  |:当JVM试图加载累的时候,抛出该异常,一般情况为调用以下方法:

  [1]Class类中的forName方法

  [2]ClassLoader类中的findSystemClass方法

  [3]ClassLoader类中的loadClass方法

  |—CloneNotSupportedException(1.0):[->Exception]

  |:当调用Object类中的clone方法的时候,前边已经讲过了对象拷贝,当调用该方法的对象无法实现Cloneable接口的时候,抛出该异常,而且在方法重写的时候可能会抛出该异常

  |—IllegalAccessException(1.0):[->Exception]

  |:当应用程序在使用反射的时候创建一个实例、设置或者获取一个字段、调用一个方法的时候,正在执行的方法无法访问指定的类、方法、字段或构造方法的时候抛出该异常

  【*:在书写继承树的时候,如果该类不属于该介绍包里面的内容这里使用全称】

  2)java.net包:

  Exception(1.0):

  |—URISyntaxException(1.4):[->Exception]

  |:抛出经过检查的指示字符串不能解析为URI引用的异常

  |—java.io.IOException(1.0):[->Exception]【后边会介绍】

  |—SocketTimeoutException(1.4):[->java.io.InterruptedIOException->java.io.IOException->Exception]

  |:如果在读取或者接受套子节的时候发生超时,则抛出此异常

  |—UnknownServiceException(1.0):[->java.io.IOException->Exception]

  |:抛出这一异常指示出现了未知的服务异常,可能是URL连接返回的MIME类型无意义,或者应用程序试图进行对只读的URL连接写入。

  |—UnknownHostException(1.0):[->java.io.IOException->Exception]

  |—指示主机IP地址无法确定而抛出的异常

  |—ProtocolException(1.0):[->java.io.IOException->Exception]

  |:抛出此异常指示在底层协议中存在错误,如TCP错误。

  |—HttpRetryException(1.5):[->java.io.IOException->Exception]

  |:抛出此异常指示HTTP请求需要重试,但由于启用了流模式不能自动重拨,重点是进行HTTP请求的重试操作

  |—MalformedURLException(1.0):[->java.io.IOException->Exception]

  |:抛出这一串异常指示出现了错误的URL地址,或者说在进行网络访问的时候在字符串里面找不到任何合法协议,或者无法解析传入的字符串,URI不合法等

  |—SocketException(1.0):[->java.io.IOException->Exception]

  |:抛出此异常指示在底层协议中存在错误,如TCP错误。

  |—NoRouteToHostException(1.1):[->SocketException->java.io.IOException->Exception]

  |:试图将套接字连接到远程地址和端口时发生错误的情况下,抛出此异常。通常为无法到达远程主机,原因是防火墙干扰或者中间路由器停机。

  |—PortUnreachableException(1.4):[->SocketException->java.io.IOException->Exception]

  |:在连接的数据报上已接收到 ICMP Port Unreachable消息时,抛出该异常。

  |—BindException(1.1):[->SocketException->java.io.IOException->Exception]

  |:试图将套字节绑定到本地地址和端口的时发生错误的情况下,抛出该异常,这些错误通常发生在端口正在使用中或者无法分配所请求的本地地址的时候抛出

  |—ConnectException(1.1):[->SocketException->java.io.IOException->Exception]

  |:试图将套字节连接到远程地址和端口时发生错误的情况下,抛出该异常,这些错误通常发生情况为拒绝远程连接的时候,例如远程地址/端口上没有进行侦听操作

  3)java.io包:

  Exception(1.0):

  |—IOException(1.0):[->Exception]

  |:当发生某种I/O异常的时候,抛出该异常,此类是失败或中断的I/O操作生成的异常通用类

  |—CharConversionException(1.1):[->IOException->Exception]

  |:当字符进行转换的时候发生的异常的基类

  |—EOFException(1.0):[->IOException->Exception]

  |:当输入过程中意外到达文件或流的末尾时,抛出此异常,此异常主要用于被数据输入流用来表明到达了流的末尾。有时候很多输入操作是返回了某个特殊值而不是抛出该异常

  |—FileNotFoundException(1.0):[->IOException->Exception]

  |:在不存在具有指定路径名的文件时,此异常将由FileInputStream、FileOutputStream和RandomAccessFile构造方法抛出。如果该文件存在,但是由于某些原因不可访问,比如试图打开一个只读文件进行写入,则此时这些构造方法仍然会抛出该异常。

  |—InterruptedIOException(1.0):[->IOException->Exception]

  |:I/O 操作已中断信号,抛出此异常。抛出 InterruptedIOException 指示输入或输出传输已经终止,原因是执行此操作的线程中断。字段bytesTransferred指示在发生中断之前已成功传输了多少字节。

  |—ObjectStreamException(1.1):[->IOException->Exception]

  |:特定于ObjectStream类的所有异常的超类。

  |—InvalidClassException(1.1):[->ObjectStreamException->IOException->Exception]

  |:当Serialization运行时检测到某个类具有以下几个问题的时候,抛出该异常

  [1]该类的序列版本号与从流中读取的类描述符的版本号不匹配

  [2]该类包含未知数据类型

  [3]该类没有可访问的无参数构造方法

  |—InvalidObjectException(1.1):[->ObjectStreamException->IOException->Exception]

  |:指示一个或多个反序列化对象未通过验证测试,该参数应该提供失败的原因

  |—NotActiveException(1.1):[->ObjectStreamException->IOException->Exception]

  |:当序列化和反序列化不活动的时,抛出该异常

  |—NotSerializableException(1.1):[->ObjectStreamException->IOException->Exception]

  |:当实例需要具有序列化接口时,抛出此异常。序列化运行时或实例的类会抛出此异常。参数应该为类的名称。

  |—OptionalDataException(1.1):[->ObjectStreamException->IOException->Exception]

  |:指示对象读取操作失败的异常,原因是无法读取流中的基本数据或已序列化对象的数据末尾。以下两种情况都可能抛出此异常:

  [1]流中下一个元素是基本数据时试图读取对象。在这种情况下,OptionalDataException的length字段设置成了可从流中直接读取的基本数据的字节数,而eof字段设置成了false。

  [2]试图使用类定义的 readObject 或 readExternal 方法读取数据末尾的后面。在这种情况下,OptionalDataException 的eof字段设置成了true,而length字段设置成了0。

  |—StreamCorruptedException(1.1):[->ObjectStreamException->IOException->Exception]

  |:当从对象流中读取的控制信息与内部一致性检查相冲突时,抛出此异常。

  |—WriteAbortedException(1.1):[->ObjectStreamException->IOException->Exception]

  |:在写入操作过程中抛出ObjectStreamExceptions之一时,在读取操作过程中将抛出此异常。终止写入的异常可在详细信息字段中找到。该流被重置为初始状态,而且对已经反序列化的对象的所有引用都被丢弃。

  |—SyncFailedException(1.1):[->IOException->Exception]

  |:当sync操作失败时,抛出该异常

  |—UnsupportedEncodingException(1.1):[->IOException->Exception]

  |:当使用的字符编码不支持的时候会抛该异常,一般在进行字符串编码的时候会出现该异常

  |—UTFDataFormatException(1.0):[->IOException->Exception]

  |:在数据输入流中或由实现该数据输入接口的任何类中以UTF-8修改版格式读取错误字符串时,抛出此异常。有关读取和写入UTF-8修改版字符串的格式。

  4)java.text包:

  Exception(1.0)

  |—ParseException(1.0):[-Exception]

  |:解析的时候出现以外错误的时候就会抛出该异常,而且该包里面只有这个异常。

  本文来自博客:http://blog.csdn.net/silentbalanceyh/archive/2009/09/13/4549128.aspx

 

上一篇:J2ME游戏开发中的经典算法 - 地图四色问题 下一篇:JAVA版hello world全攻略

评论总数:0 [ 查看全部 ] 网友评论


关于我们隐私版权广告服务友情链接联系我们网站地图