------------------------java.lang.Throwable
Throwable : 可抛出的
|--Error :错误,一般情况下,不编写针对性的代码进行处理,通常是jvm发生的,需要对程序进行修正。
|---Exception 异常,可以有针对性的处理方式。
两者的区别:
error 属于编译时期的错误,根本不会编译通过,也就是不会生成.class文件。
exception属于运行时错误,只有在调用的时候才会报错,比如空指针或数组下标越界等等。
命名规范;无论是错误还是异常,它们都有具体的子类体现每一个问题,它们的子类都有一个共性,就是都以父类名作为子类的后缀名。
可抛性:这个体系的类和对象都可以被throws和throw两个关键字所操作。
使用场景:在实际的开发中,发现该功能会出现一些问题,应该将问题在定义功能时标示出来,这样调用者就可以再使用这个功能的时候,预先给出一些处理方式。
如何标示呢?通过throws关键字完成,格式:throws 异常类名,异常类名....
标示后,调用者就必须要处理,否则编译失败。
Throws与Throw的区别
Throws:在方法上抛。用于抛出异常类,后面跟的是异常类的名,可以跟多个,用逗号隔开。throws用在函数上。
Throw :在方法体中抛。用于抛出异常对象,后面跟的是异常对象;throw用在函数内。
处理方式有两种,捕捉和抛出
try{
//需要被检测的代码
}catch(异常类 变量名){
//异常处理代码}
finally{
//一定会执行的代码
}
异常分类
编译时异常:只要是Exception及其子类都是编译时被检测的异常
运行时异常:子类RuntimeException .以及RuntimeException的子类是运行时异常,也就是这个异常是编译时不被检测的异常。
编译时被检测的异常和运行时异常的区别:
编译时被检测的异常在函数内被抛出,函数必须要声明,否则编译失败。
声明的原因:是需要调用者对该异常进行处理。
运行时的异常如果在函数内 被抛出,在函数上不需要声明。
不声明的原因:不需要调用者处理,运行时异常发生,已经无法再让程序继续运行,所以,不让调用者处理,直接让程序停止,由调用者对代码进行修正。
定义异常处理时,什么时候时候定义try , 什么时候定义throws呢?
功能内部如果 出现异常,如果内部可以处理,就用try;
如果功能内部处理不了,就必须声明出来,让调用者处理。
自定义异常
将项目中的特有问题也进行封装,这个异常,称为自定义异常。
package com.inphase;
/**
* 除数不为零异常
* @author Administrator
*
*/
public class DivisorNotZeroException extends Exception{
public DivisorNotZeroException() {
super();
}
public DivisorNotZeroException(String message) {
super(message);
}
}
package com.inphase;
/**
* 定义除数不为负数的异常
* @author Administrator
*
*/
public class DivisorNotMinusException extends Exception {
public DivisorNotMinusException() {
super();
}
public DivisorNotMinusException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
}
package com.inphase;
import sun.org.mozilla.javascript.internal.ast.ThrowStatement;
/*
* 除法方法类
*/
public class Divisor {
public int dividor(int x , int y ) throws DivisorNotZeroException, DivisorNotMinusException{
if (y==0) {
throw new DivisorNotZeroException("您输入的是"+y+",规定除数不能为0!");//抛出异常
}
if (y<0) {
throw new DivisorNotMinusException("您输入的是"+y+",规定除数不能为负数!"); //抛出异常
}
return x/y;
}
}
package com.inphase;
/**
* 测试Demo
* @author Administrator
*
*/
public class Demo {
public static void main(String[] args) {
Divisor div = new Divisor();
try {
System.out.println(div.dividor(4, -1));
} catch (DivisorNotZeroException e) {
e.printStackTrace();
} catch (DivisorNotMinusException e) {
e.printStackTrace();
}
}
}
输出结果为:
com.inphase.DivisorNotZeroException: 您输入的是0,规定除数不能为0!
at com.inphase.Divisor.dividor(Divisor.java:14)
at com.inphase.Demo.main(Demo.java:13)
利用throws向上抛出异常测试案例
package com.inphase;
/**
* 测试Demo
* @author Administrator
*
*/
public class Demo {
public static void main(String[] args) throws DivisorNotZeroException, DivisorNotMinusException {
Divisor div = new Divisor();
System.out.println(div.dividor(4, -1));
}
}
Exception in thread "main" com.inphase.DivisorNotMinusException: 您输入的是-1,规定除数不能为负数!
at com.inphase.Divisor.dividor(Divisor.java:18)
at com.inphase.Demo.main(Demo.java:11)