黑马程序员-Exception
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
概念:
异常:在程序运行中出现的不正常情况,就叫异常。java是面向对象的语言,所以在描述异常时也将其封装成了具体的对象。并且将这些异常分为两大类:Error和Exception(都属于Throwable的子类)。
Error:java中比较严重的错误,比如jvm内存溢出。一般不编写针对性的代码对其处理。
Exception:java中非严重的异常,这些异常是可以编写代码进行处理的。其中Exception又分为运行时异常和编译时异常。
运行时异常:在程序运行时被检测的异常,这种异常如果在调用的方法上被声明时,可以不用try{}catch{}处理,如果在方法内部用throw new 抛出该种异常时,可以不用在方法上用thorws关键字声明。
编译时异常:编译时期被检测的异常,这种异常如果在方法上声明了,那么在调用该方法时必须try{}catch{}处理,否则编译失败。如果在方法内部用throw new 抛出该种异常时,必须在该方法上用throws关键字声明。
java中异常处理格式:
try{
需要被检测的代码;
}
carch(异常类 变量){
处理异常的代码;
}
finally{
一定被执行的代码;如释放资源等
}
代码及示例:
异常处理过程:
public class ExceptionDemo {
/**
* 异常
* @param args
*/
public static void main(String[] args) {
try {
int i=4/0;//出现异常后就被虚拟机检测到,直接转向catch代码块,其后面代码不会执行。
System.out.println(i);
} catch (Exception e) {//将捕获的异常传入
System.out.println("出现除数为零!");
e.printStackTrace();//调用异常类的方法。java中jvm的默认异常处理机制。
}
}
}
异常处理方式:
public class ExceptionDemo {
/**
* 异常
* @param args
*/
public static void main(String[] args)/*throws Exception*/ {
try {
int i=div(6, 0);//调用声明异常的方法。
//处理方式可try可抛,可以在调用该功能的方法上用throws关键字抛出
System.out.println(i);
} catch (Exception e) {
System.out.println("出现除数为零!");
e.printStackTrace();
}
}
public static int div(int a,int b)throws Exception{//声明该方法存在异常
return a/b;
}
}
多异常处理方式:
public class ExceptionDemo {
/**
* 异常
* @param args
*/
//java中多异常的处理:
//1.声明异常时,建议声明更具体的异常,这样处理可以更具体。
//2.对调用的方法声明几个异常,就对应几个catch块,不要定义多余的catch块,如果多个catch块中的异常存在继承关系,那么父类的catch块放最下面。
public static void main(String[] args){
try {
int i=div(4, 0);
System.out.println(i);
} catch (ArithmeticException e) {//编写针对性的catch块进行处理
System.out.println("出现除数为零!");
e.printStackTrace();
}catch (ArrayIndexOutOfBoundsException e) {//编写针对性的catch块进行处理
System.out.println("出现角标越界!");
e.printStackTrace();
}catch (Exception e) {//父类异常catch块放在最下面
e.printStackTrace();
}
}
public static int div(int a,int b)throws ArithmeticException,ArrayIndexOutOfBoundsException{//声明多个异常
int[] arr=new int[a];
System.out.println(arr[4]);
return a/b;
}
}
自定义异常:
public class ExceptionDemo2 {
/**
* @param args
*/
public static void main(String[] args) {
try {
div(4,-3);
} catch (Exception e) {
e.printStackTrace();
}
}
public static int div(int a,int b)throws NewException{
if(b<0)
throw new NewException("自定义异常");
return a/b;
}
}
public class NewException extends Exception{
/**
* 自定义异常
* @param args
*/
//为什么自定义异常要继承Exception类?
//因为异常体系都有一个特点:异常类和异常对象都可被抛出。这个可抛性是Throwable这个体系所独有的。只有这个体系中的类或对象才可以被throws和throw操作。
public NewException(String message) {
super(message);//调用父类的构造函数
}
}
运行时异常:
public class RuntimeExceptionDemo {
/**
* 运行时异常
* @param args
*/
//RuntimeException的特点:
//1.在函数内抛出该异常,可以不用再函数上声明。
//2.在函数上声明了该异常,在调用该函数时可以不进行异常处理(抛或try)
public static void main(String[] args) {
div(2, 2);//调用时并未做处理
}
public static int div(int a ,int b){//该方法上并没有throws关键字声明异常
if(b==0)
throw new RuntimeException("除数为零!");
return a/b;
}
}
throws 和 throw的区别:
1.throws用在函数上,throw用在函数内。
2.thorws后面跟的是异常类,可以跟多个,用逗号隔开。而throw后面跟的是异常对象。
总结:
在编写自定义异常时,应该注意该抛运行时异常或是编译时异常。如果某个功能在定义时可能存在异常,同时又不希望调用者在调用时由于手动处理而将问题隐藏掉,那么此时抛运行时异常,反之抛编译时异常。
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------