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,捕捉过程
步