Java基础11--Object类--异常机制(二)

2014-11-24 07:42:56 · 作者: · 浏览: 1
处理,直接修改程序。

5,该体系的特点:

子类的后缀名都是用其父类名作为后缀,阅读性很强。

11-8,异常-原理&异常对象的抛出throw

1,异常抛出过程,用下面程序为例说明:

class Demo {
	public void method(int[] arr, int index) {
		/*  第一步:
		这一句会抛出一个异常
		throw new ArrayIndexOutOfBoundsException(index);
		这个抛出动作由JVM自动执行,运行到此处,发现角标越界,便抛出此异常
		抛给调用者,即主函数,抛出异常后,这个方法结束,不再输出haha。
		*/
		System.out.println(arr[index]);
		System.out.println("haha");
	}
}
class ExceptionDemo {
	public static void main(String[] args) {
		int[] arr = new int[3];
		Demo d = new Demo();
		/* 第二步:
		throw new ArrayIndexOutOfBoundsException(index);
		调用者主函数接收抛出的异常,继续向上抛出,抛给JVM,抛出后不再输出over。
		*/
		d.method(arr,3);
		System.out.println("over");
	}
}

第三步:

JVM的处理方式为:在控制台输出异常信息,反馈给用户,程序结束。

2,自定义异常抛出信息。

系统自带的抛出信息为英文,有时会在成阅读不便。故自定义信息,使其简明易懂。

class Demo {
	public int method(int[] arr, int index) {
		if(arr == null) 
			throw new NullPointerException("数组的引用不能为空!");
		if(index >= arr.length) 
			throw new ArrayIndexOutOfBoundsException("数组角标越界!" + index);
		if(index < 0) 
			throw new ArrayIndexOutOfBoundsException("数组角标不能为负数:" + index);
		return arr[index];
	}
}
class ExceptionDemo {
	public static void main(String[] args) {
		int[] arr = new int[3];
		Demo d = new Demo();
		int num = d.method(null,-30);
		System.out.println("num = " + num);
		System.out.println("over");
	}
}

使用throw关键字抛出异常。

11-9,异常-自定义异常&异常类的抛出

1,对于角标是正数不存在,可以用角标越界表示。

对于角标为负数的情况,准备用复数角标异常来表示。

负数角标这种异常在Java中并没有定义过,那就按照Java异常的创建思想,面向对象,将服输角标进行自定义描述,并封装成对象。

这种自定义的问题描述称为自定义异常。

注意:如果让一个类称为异常类,必须要继承异常体系,因为只有称为异常体系的子类才有资格具备可抛性,才可以被两个关键字所操作,throws和throw。

2,若要成为异常类,必须继承Exception类,并在产生此异常的方法后加上throws 异常类名。

调用此方法的语句的所属的方法也要加上throws 异常类名。

示例:

//自定义异常类必须继承Exception类,才具备可抛性
class FuShuIndexException extends Exception {
	FuShuIndexException() {}
	FuShuIndexException(Stirng msg) {
		super(msg);//用的是父类的构造方法,传参数调用
	}
}
class Demo {
	//在方法上throws声明这个方法可能抛出的异常
	public int method(int[] arr, int index) throws FuShuIndexException {
		if(index < 0) {
			throw new FuShuIndexException("角标不能是负数!");
		}
		return arr[index];
	}
}
class ExceptionDemo {
	//调用了可能抛出异常的方法,调用他的方法也要抛出异常
	public static void main(String[] args)throws FuShuIndexException {
		int[] arr = new int[3];
		Demo d = new Demo();
		int num = d.method(arr,-30);//此语句可能抛出异常
		System.out.println("num : " + num);
	}
}

11-10,异常-编译时检测异常和运行时异常的区别&throw和throws的区别

1,异常的分类:

(1)编译时被检测异常,只要是Exception和其子类都是,除了特殊子类RuntimeException体系这种问题一旦出现,希望在编译时就进行检测,让这种问题有对应的处理方式。这样的问题都可以针对性的处理。

(2)编译时不检测异常(运行时异常):就是Exception中的RuntimeException和其子类,这种问题的发生,无法让功能继续,运算无法进行,更多是因为调用者的原因导致的,或者是引发了内部状态变化而导致的。那么这种问题一般不处理,直接编译通过,在运行时,让调用者调用时的程序强制停止,让调用者对代码进行修正。

所以自定义异常类时,要么继承Exception,要么继承RuntimeException。

2,throw和throws的区别。

(1)throws使用在函数上。

throw使用在函数内。

(2)throws抛出的是异常类,可以抛出多个,用逗号隔开。

throw抛出的是异常对象。

3,11-9的例子中,若写为:

Class FuShuIndexException extendsRuntimeException,则Demo类中的方法和ExceptionDemo中的main方法就不用throw FuShuIndexException了。

11-11,异常-异常捕获try-catch

1,异常处理的捕捉形式:

这是可以对异常进行针对性处理的方式。

具体格式是:

try{
	//需要被检测异常的代码
} catch(异常类 变量) { //该变量用于接收发生的异常对象
	//处理异常的代码
} finally {
	//一定会被执行的代码
}

示例:

class ExceptionDemo {
	public static void main(String[] args) {
		int[] arr = new int[3];
		Demo d = new Demo();
		try {
			int num = d.method(arr, -1);
			/*
			由于num是局部变量,出了作用域便不可用,如后面的代码用到此变量
			也要放到try中。
			*/
			System.out.println("num=" + num);
		} catch(FuShuIndexException e) { //接收的是什么异常,此处就写什么异常类。
			System.out.println("message:" + e.getMessage());//打印异常信息
			//打印e的信息,格式为:异常名:信息,toString可以不写。
			System.out.println("string:" + e.toString());
			/*
			void类型的方法,不能在sop中输出。此方法输出异常的名称,信息,位置等,
			等同于throw出的异常信息,JVM默认的处理机制就是调用异常对象的这个方法。
			*/
			e.printStackTrace();
			System.out.println("负数角标异常");
		}
		System.out.println("over");
	}
}
class Demo {
	//抛出此异常,catch中也应该接受此异常处理要有针对性。
	public int method(int[] arr, int index) throws FuShuIndexException {
		if(index < 0) {
			throw new FuShuIndexException("角标不能是负数");
		}
		return arr[index];
	}
}

2,捕捉过程

\