【黑马程序员】java中的---------------------异常机制

来源:互联网 发布:家装监理必知300 编辑:程序博客网 时间:2024/05/17 03:25

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! -------------------------------------------

异常机制:Throwable

一、定义:就是程序在运行时出现的不正常情况

导致程序运行失败,称之为异常。


二、异常处理机制

当异常发生错误时,异常处理机制会捕获异常错误信息,并且按照给定的处理方式

进行处理,并且把错误信息返回给调用者,让程序开发人员以便分析与维护


三、异常体系

在java中,描述异常的基类是Throwable类,它所要异常的父类

只有继承这个基类的异常,在这个体系中都具备可抛性



一种;对严重问题java通过Error类进行描述

第二种;对非严重问题java通过Exception类进行描述。

还有就是:对于一些特有的问题,需要需要我们按照java的对象封装思想,将特有问题进行字定义的异常封装

  继承Exception

处理方式:

第一种:在函数上声明Throws抛出或者函数内throw抛出异常对象

区别:

throws是在函数上声明抛出异常

int show(int a,int b)throws Exception//声明异常,并抛出{return a/b;}


throw是在函数内部用来抛出异常对象,且要在函数上声明

int div(int a,int b)throws Exception{if(b<0)//手动抛出自定义异常throw new FushuException("除数出现负数了:"+b);}

第二种:在函数内try{}catch(){}处理

调用者调用到存在异常的函数进行异常处理


class Test{int show(int a,int b)throws Exception//声明异常,并抛出{return a/b;}}//对于Exception等异常,要么抛,要么try处理class ExceptionTest{public static void main(String[] args){Test t=new Test();try{int x=t.show(8,0);System.out.println("x="+x);}catch(Throwable e){System.out.println(e.toString());}System.out.println("程序结束");}}


四、异常处理原则
1. 多个异常声明存在,必须需要多个对应的catch(){ }语句进行处理(一个try对应多个catch)
2. 一个try对应多个catch语句块的时候,要将父类的catch语句块放在最下面,
否则,子类的catch语句块无法执行到,编译失败
3. catch语句块中的异常处理方法,尽可能的有意义,有针对性
不要简单的printStackTrace();异常输出语句,也不要不书写任何语句
4. 当某个异常捕获到之后,无法处理时,可以在catch语句块中抛出
五、自定义异常:
1、自定义异常就是java中异常体系中的异常类没有符合我们在程序开发中发生的异常
这时需要我们自己定义这个特有异常,并且继承Exception类或者RuntimeException类
2、必须继承Exception类或者RuntimeException类,因为只有在Threowable这个体系中才具备可抛性
 只有在这个体系中才具备可抛性,具备异常体系中共性方法的操作,
才可以throw和throws操作


//自定义异常class FushuException extends Exception{private int value ;//定义特有变量FushuException(){super();//通过super语句将异常信息传递给父类}FushuException(String msg,int value){super();this.value=value;}public int getValue(){return value;}}class ExceptionTest{int div(int a,int b)throws Exception{if(b<0)//手动抛出自定义异常throw new FushuException("除数出现负数了:"+b);}}class ExceptionDemo{public static void main(String[] args ){ExceptionTest et=new ExceptionTest();try{int x=et.div(5,-9);}catch(FushuException e){System.out.println("错误信息:"+e.message());}}}

六、RuntimeException类:它是运行时异常
1.如果函数内抛出该异常,函数上不要声明,编译通过
2.如果函数上声明了该异常,调用者可以不要处理,编译通过
NumberFormatException字符串转换为数字时。
比如int i= Integer.parseInt(“ab3″);

ArrayIndexOutOfBoundsException:数组越界
比如 int[] a=new int[3]; int b=a[3]; 


StringIndexOutOfBoundsException:字符串越界
比如 String s=”hello”; char c=s.chatAt(6);


ClassCastException:类型转换错误
比如 Object obj=new Object(); String s=(String)obj; 


ArithmeticException:算术错误,典型的就是0作为除数的时候。

IllegalArgumentException:非法参数,在把字符串转换成数字的时候经常出现的一个异常
Catch(){}是用于处理异常,如果没有catch(){}就代表异常未被处理,如果是检测是异常,
函数上必须声明

finally{}语句块:定义一定执行的代码,通常用于关闭资源
除了,finally语句前执行到system.exit(0);


class Test{int show(int a,int b)throws Exception//声明异常,并抛出{return a/b;}}class ExceptionTest{public static void main(String[] args)//对于Exception等异常,要么抛,要么try处理{Test t=new Test();try{int x=t.show(8,0);System.out.println("x="+x);}catch(Throwable e){System.out.println(e.toString());}//system.exit(0);系统退出//finally语句中定义一定执行代码finally{System.out.println("程序结束");}}}


七、异常在继承关系的子父类中的体现:


1.子类覆盖父类时,如果父类中方法抛出异常,那么子类覆盖的方法只能抛出父类异常或者是异常的子类
2.如果父类方法抛出多个异常,子类在覆盖方法时,只能抛出父类异常的子集
3.如果父类或者接口的方法中没有异常抛出,那么子类覆盖父类的方法,也不可以抛出异常,
   这时,发生异常只能try{}catch(){}处理,不能抛出


注意:

在throw语句后面不能有语句,因为后面的语句无法执行到。try{//程序抛出异常,导致程序的跳转,下面的语句无法执行到,编译失败throw new ArithmeticException();System.out.println("无法执行读到的语句");}特殊情况:class Test{int show(int a,int b){return a/b;}void mothed()throws Exception//将函数上声明异常表示该函数有可能发生异常{int x= 5/0;throw new Exception();//函数内部抛出异常}}class ExceptionTest{public static void main(String[] args){Test t=new Test();try{//这里调用mothed()方法,此方法内抛出异常,但是编译通过//这种情况有可能发生异常,下面的语句有可能被执行t.mothed();int x=t.show(8,0);System.out.println("x="+x);}catch(Throwable e){System.out.println(e.toString());}//一定可执行语句finally{System.out.println("程序结束");}}}

示例:请看下面代码执行结果class Demo{public static void func ()throws Exception//函数上声明异常{try{throw new Exception();//函数内部抛出异常}finally{System.out.println("B");//一定执行语句}}public static void main(String[] args){try{func();//表示该方法有可能发生异常,下面语句有可能执行System.out.println("A");//编译通过,但是该语句执行不到}catch(Exception e){//异常处理System.out.println("C");}System.out.println("D");}}执行结果:B   C   D

比较上面的代码:class Demo{public static void func(){try{throw new Exception();//抛出异常,程序跳转到catch语句块System.out.println("A");//无法执行到的语句,编译失败}catch(Exception e){System.out.println("B");}}public static void main(){try{func();}catch(){System.out.println("C");}System.out.println("D");}}













	
				
		
原创粉丝点击