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的情况下要注重这个异常。