java异常种类

所有异常,都继承自java.lang.Throwable类。

Throwable有两个直接子类,Error类和Exception类。

Trow

Throwable是所有异常的根,java.lang.Throwable

  • Error是错误,java.lang.Error

java.lang.Error发生在应用程序不应该试图捕获的情况。Java程序不需要去throw或catch此类及其子类,因为这种异常不应该由应用程序处理,并且通常属于abnormal的情况。

  • Exception是异常,java.lang.Exception

java.lang.Exception是指Java程序应该捕获的异常。其中,java.lang.RuntimeException是其中一个特别的子类。
Exception则可使从任何标准Java库的类方法,自己的方法以及运行时任何异常中抛出来的基类型。
异常可分为执行异常(RuntimeException)和检查异常(Checked Exceptions)两种

①Checked异常

只有java语言提供了Checked异常,Java认为Checked异常都是可以被处理的异常,所以Java程序必须显示处理Checked异常。如果程序没有处理Checked异常,该程序在编译时就会发生错误无法编译。这体现了Java的设计哲学:没有完善错误处理的代码根本没有机会被执行。对Checked异常处理方法有两种

1 当前方法知道如何处理该异常,则用try…catch块来处理该异常。

2 当前方法不知道如何处理,则在定义该方法是声明抛出该异常。

package cn.xy.test;

import java.io.IOException;

/**
 * Checked异常测试方法
 * @author xy
 *
 */
public class CheckedExceptionMethods
{
    // 总异常类,既有checkedException又有RuntimeException,所以其中的checkedException必须处理
    public void method1() throws Exception
    {
        System.out.println("我是抛出异常总类的方法");
    }

    // 捕获并处理这个异常
    public void testMethod1_01()
    {
        try
        {
            method1();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    // 把异常传递下去
    public void testMethod1_02() throws Exception
    {
        method1();
    }

    public void testMethod1_03() throws Exception
    {
        throw new Exception();
    }

    public void testMethod1_04()
    {
        try
        {
            throw new Exception();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    // checkedException典型代表IOException
    public void method2() throws IOException
    {
        System.out.println("我是抛出IO异常的方法");
    }

    public void testMethod2_01()
    {
        try
        {
            method2();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    public void testMethod2_02() throws Exception
    {
        method2();
    }

}

我们比较熟悉的Checked异常有

Java.lang.ClassNotFoundException
Java.lang.CloneNotSupportedException
Java.lang.IllegalAccessException
Java.lang.InterruptedException
Java.lang.NoSuchFieldException
Java.lang.NoSuchMetodException

②RuntimeException

Runtime如除数是0和数组下标越界等,其产生频繁,处理麻烦,若显示申明或者捕获将会对程序的可读性和运行效率影响很大。所以由系统自动检测并将它们交给缺省的异常处理程序。当然如果你有处理要求也可以显示捕获它们。

package cn.xy.test;

/**
 * 运行时异常测试方法
 * @author xy
 *
 */
public class RuntimeExcetionMethods
{
    public void method3() throws RuntimeException
    {
        System.out.println("我是抛出运行时异常的方法");
    }

    public void testMethod3_01()
    {
        method3();
    }

    public void testMethod1_02()
    {
        throw new RuntimeException();
    }
}

我们比较熟悉的RumtimeException类的子类有

Java.lang.ArithmeticException
Java.lang.ArrayStoreExcetpion
Java.lang.ClassCastException
Java.lang.EnumConstantNotPresentException
Java.lang.IllegalArgumentException
Java.lang.IllegalThreadStateException
Java.lang.NumberFormatException
Java.lang.IllegalMonitorStateException
Java.lang.IllegalStateException
Java.lang.IndexOutOfBoundsException
Java.lang.ArrayIndexOutOfBoundsException
Java.lang.StringIndexOutOfBoundsException
Java.lang.NegativeArraySizeException’
Java.lang.NullPointerException
Java.lang.SecurityException
Java.lang.TypeNotPresentException
Java.lang.UnsupprotedOperationException

类设计时使用Exception的几个最佳实践(读Effective Java有感)

在Effective Java的Item 58中,Java Exception被分为三类:

Error,checked exception和runtime exception。在设计类时,这三种Exception这样使用为佳:

  • Error:用于JVM相关的错误,例如resource deficiences,invariant failures以及其他使JVM无法正常运行的异常。

  • Runtime Exception:用于编程错误,JDK自带的很多就是用于编程错误

  • Checked Exception:用于可以恢复的异常。

由于Error通常用于JVM相关的错误,因此其他的unchecked exception都应该继承自Runtime Exception