一、Java中使用异常处理所带来的好处:
1、统一异常处理方式。当问题出现的时候,你也许不清楚该如何处理,但你知道不应该置之不理,在同一个环境里对异常做出正确的决定。(相对于早期C等语言主动检查错误来说)
2、降低错误处理代码的复杂度。如果不使用异常,那么就必须检查特定的错误,并在程序中得许多地方去处理它。而如果使用了异常,那就不必在方法调用处检查错误,因为异常机制将保证能够捕获这个错误。由此,将所有的异常在一个地方处理,即所谓的异常处理程序中。这种方法不仅节省代码,而且把“描述在正常执行过程中做了什么事”的代码和“出了问题怎么办”的代码分离。总之,与以前的错误处理方法相比,异常机制使代码的阅读、编写和调试工作更加井井有条。
二、Java抛出异常的流程:
通过当前正在解决的问题环境,不清楚如何处理当前产生的问题的时候,就要抛出异常,而不是顺着原来的路径执行下去。
当抛出异常后:首先,同Java其他对象的创建一样,将使用new在堆上创建异常对象。然后,当前的执行路径(它不能继续下去了)被终止,并且从当前环境中弹出异常对象的引用。此时,异常处理机制接管程序,并开始寻找一个恰当的地方继续执行程序。这个恰当的地方就是异常处理程序,它的任务就是将程序从错误的状态恢复,以使程序能要么换一种方式运行,要么继续运行下去。
三、异常分类:
Throwable是所有异常的根,java.lang.Throwable
Error:错误,Java.lang.Error
Exception:异常,java.lang.Exception
Exception分为CheckedException和RuntimeException,所有RuntimeException类及其子类的实例被称为Runtime异常,不属于该范畴的异常则被称为CheckedException。
①checkedException:只有Java语言提供了Checked异常,Java认为checked异常都是可以被处理的异常,所以Java程序必须显示处理checked异常。如果程序没有处理checked异常,该程序在编译时会发生错误无法编译。这体现了Java的设计哲学:没有完善错误处理的代码根本没有机会被执行。对Checked异常处理方法有两种:
1、当前方法知道如何处理该异常,则用try...catch块来处理。
2、当前方法不知道如何处理,则在定义该方法时声明抛出该异常。
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.NoSuchMetodException
java.io.IOException
②RuntimeException
Runtime如除数是0和数组下标越界等,其产生频繁,处理麻烦,若显示申明或者捕获将会对程序的可读性和运行效率影响很大。所以由系统自动检测并将它们交给缺省的异常处理程序。当然如果你有处理要求也可以显示捕获它们。
/**
* 运行时异常测试方法
* @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.IndexOutOfBoundsException
Java.lang.NullPointerException