首先要明确为什么会有异常这种机制,我们写程序的时候为了保证代码的健壮性,需要对用户的输入,函数的传值等等进行一下判断,如果是非法的输入传值,就需要进行异常的处理,在c/c++中我们一般都是通过if语句进行的判断,然后在if语句中进行处理,最后返回一个代表异常的值。在java中一切都是对象,所以对于异常来说也是对象,所以在if语句中我们需要去new出一个对象,这个对象代表的就是某类的异常,然后我们不是通过return进行返回,而是使用关键字throw抛出这个异常对象给调用者,程序调用终止。那么我们就来看看java中的异常类的继承关系吧。

java中对异常的处理 java中对异常的处理java中的异常类都是继承自Throwable,这个类有俩个子类,一个是Exception,这个类的子类的异常是程序员导致的也是程序员可以处理的,我们一般都是操作的这类异常。另一个子类是error,这个异常不是我们可以管得了的,比如内存溢出等等,需要虚拟机去处理。Exception中有一个子类叫做RuntimeException,这个类的子类代表的是运行时候的异常,而其他的exception是编译时候的异常,编译的时候会去检查这类异常,通常需要我们在函数调用的时候进行声明,告诉调用者这个函数可能会抛出什么什么样的异常。当产生runtimeException的时候,我们通常不需要处理这类异常,比如说数组越界,空指针等等,这种异常使得程序无法再继续运行下去,所以直接就让程序停掉好了。下面就具体的通过代码看看如何使用。

package zaojiahua;

public class Test {
	//对非runtimeException异常的处理采用了抛出的方式,这里是告诉虚拟机这个函数
	//的调用可能出现异常,出现了异常以后交给了虚拟机去处理
	public static void main(String [] args)throws FushuIndexException
	{
		int arr[] = new int[3];
		Demo d = new Demo();
		d.getNum(arr, -1);
	}
}

class Demo{
	//函数声明的时候使用throws为了说明可能出现的异常情况,但是如果该异常是
	//RuntimeException的子类的话就不需要抛出了
	public int getNum(int arr[],int index)throws FushuIndexException
	{
		//对可能发生的异常进行判断
		if(arr == null)
		{
			//如果发生了异常就new出异常的对象,然后抛给调用者
			throw new NullPointerException("空指针");
		}
		else if(arr.length < index+1){
			throw new ArrayIndexOutOfBoundsException("数组下标越界"+index);
		}
		else if(index < 0)
		{
			//抛出自定义的异常类
			throw new FushuIndexException("数组下标不能为负");
		}

		return arr[index];
	}
}

//自定义的异常类,该异常类必须继承自Exception,这样才能抛出
class FushuIndexException extends Exception
{
	public FushuIndexException()
	{

	}
	public FushuIndexException(String str)
	{
		super(str);
	}
}
package zaojiahua;

public class Test {
	public static void main(String [] args)
	{
		int arr[] = new int[3];
		Demo d = new Demo();
		//当异常不是runtimeException的子类的时候需要对其进行声明或者是捕获
		//下面采用的就是捕获的方式
		//try代表对可能发生异常的代码段进行异常的捕获
		try
		{
			d.getNum(null, -1);
		}//一旦发生了异常,在catch中对异常进行处理,里边的参数代表的就是接收指定
		//的异常类
		catch(FushuIndexException e)
		{
			//e.printStackTrace(); //jvm默认的异常处理调用函数
			//System.out.println(e);
			System.out.println(e.getMessage());
		}
		catch(NullPointerException e)
		{
			System.out.println(e.getMessage());
			//return;
			//如果调用的是以下的这句话(代表退出jvm)那么finally语句是不会执行的。
			//System.exit(-1);
		}
		//多catch的情况下,将父类catch放到最后边
		catch(Exception e)
		{

		}
		//finally中存放一定会执行的代码
		finally
		{
			System.out.println("finally");
		}

		System.out.println("over");

	}
}

class Demo{
	//对多个异常的声明用逗号隔开
	public int getNum(int arr[],int index) throws FushuIndexException,NullPointerException
	{
		//对可能发生的异常进行判断
		if(arr == null)
		{
			//如果发生了异常就new出异常的对象,然后抛给调用者
			throw new NullPointerException("空指针");
		}
		else if(arr.length < index+1){
			throw new ArrayIndexOutOfBoundsException("数组下标越界"+index);
		}
		else if(index < 0)
		{
			//抛出自定义的异常类
			throw new FushuIndexException("数组下标不能为负");
		}

		return arr[index];
	}
}

//自定义的异常类,该异常类必须继承自Exception,这样才能抛出
class FushuIndexException extends Exception
{
	public FushuIndexException()
	{
	}
	public FushuIndexException(String str)
	{
		super(str);
	}
}