Java 异常类总结

Java异常的分类和类结构图

Java标准裤内建了一些通用的异常,这些类以Throwable为顶层父类。

Throwable又派生出Error类和Exception类。

错误:Error类以及他的子类的实例,代表了JVM本身的错误。错误不能被程序员通过代码处理,Error很少出现。因此,程序员应该关注Exception为父类的分支下的各种异常类。

异常:Exception以及他的子类,代表程序运行时发送的各种不期望发生的事件。可以被Java异常处理机制使用,是异常处理的核心。

 

 

图1 Java异常类层次结构图

 

java.lang.Error

Direct Known Subclasses:

AnnotationFormatError, AssertionError, AWTError, CoderMalfunctionError, FactoryConfigurationError, FactoryConfigurationError, IOError, LinkageError, ServiceConfigurationError, ThreadDeath, TransformerFactoryConfigurationError, VirtualMachineError等

 

java.lang.RuntimeException

Direct Known Subclasses:

ArithmeticException[算术异常], ArrayStoreException[数组存储异常], BufferOverflowException, BufferUnderflowException,  ClassCastException, DataBindingException, DOMException, EmptyStackException, EnumConstantNotPresentException, EventException, FileSystemAlreadyExistsException, FileSystemNotFoundException, IllegalArgumentException,IllegalPathStateException, IllegalStateException, IllformedLocaleException, ImagingOpException, IncompleteAnnotationException, IndexOutOfBoundsException, JMRuntimeException,  MissingResourceException[缺少资源异常], NegativeArraySizeException, NoSuchElementException,NullPointerException, ProfileDataException, ProviderException, ProviderNotFoundException,  RejectedExecutionException, SecurityException, SystemException, TypeConstraintException, TypeNotPresentException, UndeclaredThrowableException, UnknownEntityException, UnmodifiableSetException, UnsupportedOperationException, WebServiceException, WrongMethodTypeException等。

 1 public class ArithmeticException extends RuntimeException {
 2     private static final long serialVersionUID = 2256477558314496007L;
 3 
 4     public ArithmeticException() {
 5         super();
 6     }
 7 
 8     public ArithmeticException(String s) {
 9         super(s);
10     }
11 }
 1 public
 2 class ArrayStoreException extends RuntimeException {
 3     private static final long serialVersionUID = -4522193890499838241L;
 4 
 5     public ArrayStoreException() {
 6         super();
 7     }
 8 
 9     public ArrayStoreException(String s) {
10         super(s);
11     }
12 }

 

国际化找不到资源文件,会报MissingResourceException异常,需要在classpath下添加message_en_US.properties、message_zh_CN.properties等资源文件。

message_en_US.properties中内容:hello = Welcome you!

 1 import java.util.Locale;
 2 import java.util.ResourceBundle;
 3 
 4 public class Main {
 5     public static void main(String[] args) {
 6         Locale locale = new Locale("en","US"); // new Locale("zh","CN");  
 7         //设置本土化显示国家语言  
 8         ResourceBundle bundle = ResourceBundle.getBundle("message", locale);  
 9         //此类的作用是通过ResourceBundle类来进行资源文件的绑定  
10         String value = bundle.getString("hello");  
11         //从资源文件中通过键拿到值  
12         System.out.println(value);
13     }
14 
15 }

 

 1 public class MissingResourceException extends RuntimeException {
 2 
 3     public MissingResourceException(String s, String className, String key) {
 4         super(s);
 5         this.className = className;
 6         this.key = key;
 7     }
 8 
 9    
10     MissingResourceException(String message, String className, String key, Throwable cause) {
11         super(message, cause);
12         this.className = className;
13         this.key = key;
14     }
15 
16     
17     public String getClassName() {
18         return className;
19     }
20 
21     public String getKey() {
22         return key;
23     }
24 
25     //============ privates ============
26 
27     // serialization compatibility with JDK1.1
28     private static final long serialVersionUID = -4876345176062000401L;
29 
30     /**
31      * The class name of the resource bundle requested by the user.
32      * @serial
33      */
34     private String className;
35 
36     /**
37      * The name of the specific resource requested by the user.
38      * @serial
39      */
40     private String key;
41 }

 

 

从大体来分异常为两块:

1. error---错误 : 是指程序无法处理的错误,表示应用程序运行时出现的重大错误。例如jvm运行时出现的OutOfMemoryError以及Socket编程时出现的端口占用等程序无法处理的错误。

2. Exception --- 异常 :异常可分为运行时异常跟编译异常

3. 检查性异常: 不处理编译不能通过

4. 非检查性异常:不处理编译可以通过,如果有抛出直接抛到控制台

5. 运行时异常: 就是非检查性异常

6. 非运行时异常: 就是检查性异常

异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。

 

常见异常总结:

非检查性异常(RuntimeException):

java.lang.ArithmeticException,算术异常,当出现异常的运算条件时,抛出此异常,divide by zero

java.lang.ArrayStoreException,数组存储异常

java.lang.IllegalArgumentException,方法的参数错误

java.lang.ClassCastException,类型转换异常,当试图将对象强制转换为不是实例的子类时,抛出该异常

java.lang.IndexOutOfBoundsException,数组下标越界异常,具体分:java.lang.ArrayIndexOutOfBoundsException、java.lang.StringIndexOutOfBoundsException

java.lang.NullPointerException,空指针异常,调用了未经初始化的对象或者是不存在的对象

java.lang.NumberFormatException,字符串转换为数字异常

 

检查性异常类:

java.io.IOException,IO流异常

java.lang.ClassNotFoundException,类未找到异常

java.lang.IllegalAccessException,没有访问权限,拒绝访问一个类的时候,抛出该异常

java.lang.NoSuchMethodException,方法不存在异常

java.lang.NoSuchFiledException,属性不存在异常

java.lang.EOFException,文件已结束异常,当程序在输入的过程中遇到文件或流的结尾时,引发异常

 

 1. Java.lang.NullPointerException

  这个异常大家肯定都经常碰到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片创建时的路径错误等等。对数组操作中出现空指针,很多情况下是一些刚开始学习编程的朋友常犯的错误,即把数组的初始化和数组元素的初始化混淆起来了。数组的初始化是对数组分配需要的空间,而初始化后的数组,其中的元素并没有实例化,依然是空的,所以还需要对每个元素都进行初始化(假如要调用的话)

 

  2. java.lang.ClassNotFoundException

  这个异常是很多原本在JB等开发环境中开发的程序员,把JB下的程序包放在WTk下编译经常出现的问题,异常的解释是"指定的类不存在",这里主要考虑一下类的名称和路径是否正确即可,假如是在JB下做的程序包,一般都是默认加上Package的,所以转到WTK下后要注重把Package的路径加上。

 

  3. java.lang.ArithmeticException

  这个异常的解释是"数学运算异常",比如程序中出现了除以零这样的运算就会出这样的异常,对这种异常,大家就要好好检查一下自己程序中涉及到数学运算的地方,公式是不是有不妥了。

 

  4. java.lang.ArrayIndexOutOfBoundsException

  这个异常相信很多朋友也经常碰到过,异常的解释是"数组下标越界",现在程序中大多都有对数组的操作,因此在调用数组的时候一定要认真检查,看自己调用的下标是不是超出了数组的范围,一般来说,显示(即直接用常数当下标)调用不太轻易出这样的错,但隐式(即用变量表示下标)调用就经常出错了,还有一种情况,是程序中定义的数组的长度是通过某些特定方法决定的,不是事先声明的,这个时候,最好先查看一下数组的length,以免出现这个异常。

 

  5. java.lang.IllegalArgumentException

  这个异常的解释是"方法的参数错误",很多J2ME的类库中的方法在一些情况下都会引发这样的错误,比如音量调节方法中的音量参数假如写成负数就会出现这个异常,再比如g.setColor(int red,int green,int blue)这个方法中的三个值,假如有超过255的也会出现这个异常,因此一旦发现这个异常,我们要做的,就是赶紧去检查一下方法调用中的参数传递是不是出现了错误。

 

  6. java.lang.IllegalAccessException

  这个异常的解释是"没有访问权限",当应用程序要调用一个类,但当前的方法即没有对该类的访问权限便会出现这个异常。对程序中用了Package的情况下要注重这个异常。