------- android培训、java培训、期待与您交流! ----------
异常:就是程序在运行时出现的不正常情况
异常由来:问题也是现实生活中的一个具体事物,也可以通过java的类的形式
进行描述,并封装为对象。其实就是java对不正常情况进行描述后的对象体现。
对于问题的划分:两种:一种是严重的问题,一种是非严重问题。对于严重的,java通过Error类进行描述。
对于Error一般不编写针对性代码对其进行处理。对于非严重的,java通过Exception类进行描述。
对于Exception可以使用针对性的处理方式进行处理。因为项目中会出现特有的问题:
而这些问题并未被java所描述并封装成对象, 所以对于这些特有的问题可以按照java的对问题封装的思想。
将特有的问题,进行自定义的异常封装。
自定义异常。(必须是继承Exception类)
需求:在本程序中,除数是负数也无法进行运算,那么久需要对这个问题进行自定义的
描述。
自己定义的异常java虚拟机不认识,只能手动抛出。当在函数内部出现了throw抛出异常对象,那么必须要给对应的处理动作
要么在内部try catch处理。要么在函数上声明让调用者处理。
继承Exception的原因:
异常体系有一个特点,因为异常类以及异常对象都会被抛出,他们都具备可抛性
这个可抛性是Throwable这个体系独有的特点,只有这个体系中的类和对象才可以被throws
和throw操作。
class FushuException extends Exception{
private String msg;
FushuException(String msg){
this.msg=msg;
}
public String getMessage(){
return msg;
}//因为父类把这些都做完了,子类只要传入一个String类型的异常信息就可以了
//FushuException(String msg){
//super(msg)}
}
class Demo01{
int div(int a,int b)throws FushuException{
if(b<0)
throw new FushuException("出现了除数是负数的情况了");//手动通过关键字throw抛出异常。
return a/b;
}
}
public class ExceptionDemo01 {
public static void main(String[] args) {
Demo01 d=new Demo01();
try{
int x=d.div(4,-1);
System.out.println("x="+x);
}catch(FushuException e){
System.out.println(e.toString());
System.out.println("除数出现负数");
}
}
}
异常体系:
Throwable
|--Error
|--Exception
|--RuntimeException
异常体系中的特点:异常体系中的所有类以及建立的对象都具备可抛。
也就是说可以被throw和throws关键字所操作
只有异常体系具备这个特点
-----------------------------
throw和throws的用法
throw定义在函数内,用于抛出异常对象。
throws定义在函数上,用于抛出异常类,可以抛出多个,用逗号隔开。
当函数内容有throw抛出异常对象,并未进行try处理,必须要在函数上声明,都在编译失败。
注意:RuntimeException 除外。也就是说,函数内如果抛出了该异常,函数上可以不申明。
如果函数声明了异常,调用者需要进行处理,处理方法可以throws可以try
异常有两种:
编译时受检测异常
该异常在编译时,如果没有处理(没有抛也没有try)编译失败
该异常被表示,代表着可以被处理。
运行时异常(编译时不检测)
在编译时,不需要处理,编译器不检查。
该异常的发生,建议不处理,让程序停止,需要对代码进行修正。
注意:
1.finally中定义的通常是 关闭资源的代码,因为资源必须释放。
2.finally只有一种情况下不会执行,当执行到System.exit(0);finally不会执行。
异常的好处:
1.将问题进行封装。
2.将正常流程代码和问题处理代码相分离,方便与阅读。
异常的处理原则:
1.处理方式有两种:try 或者 throws.
2.调用到抛出异常的功能时,抛出几个,,就处理几个。
一个try对应多个catch
3.多个catch时,父类的catchh往下放。
4.catch内,需要针对性的处理方式。不要简单的定义printStackTrack,输出语句,也不要不写。。
当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。
class NoValueException extends RuntimeException{
NoValueException(String msg){
super(msg);
}
}
interface Sha{
void getArea();
}
class Rec implements Sha{
private int len,wid;
Rec(int len ,int wid)throws NoValueException{
if(len<=0||wid<=0)
throw new NoValueException("出现负数了");
this.len=len;
this.wid=wid;
}
public void getArea(){
System.out.println(len*wid);
}
}
class Cic extends RuntimeException{
private int radius;
public static final double PI=3.14;
Cic(int radius){
this.radius=radius;
}
public void getArea(){
if(radius<=0)
throw new RuntimeException("出现负数了!");
System.out.println(radius*radius*PI);
}
}
public class ExceptionDemo02 {
public static void main(String[] args) {
try{//上面如果是RuntimeException则不用进行try catch处理。
Rec r=new Rec(-3,4);
r.getArea();
}catch(Exception e){
System.out.println(e.toString());
}finally{
System.out.println("over1");
}
System.out.println("over2");
}
}