【黑马程序员】Java基础04:你至少应该掌握5个异常...

来源:互联网 发布:刷svip永久软件 编辑:程序博客网 时间:2024/05/21 13:09
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------


一、引子:你至少应该掌握5个异常!

有一道面试题,请说出至少5个异常类,常见异常如下:

IOExceptionIO流异常

RuntimeException:运行时异常

ClassNotFoundException:没有找到指定的类异常

ClassCastException:类型转换异常

IndexOutOfBoundsException:角标越界异常

InterruptedException:中断时异常

UnknownHostException:未知主机异常

 

二、异常的概念与体系

Exception(异常):就是程序在运行时出现不正常情况。

由于问题也是现实生活中一个具体的事物,也可以通过Java类的形式进行描述,把问题封装成对象。

 

异常体系:Throwable

 |--------Error:严重的问题,一般不编写针对性的代码对其进行处理;

 |--------Exception:可以使用针对性的处理方式进行处理;

 

三、对异常处理

1声明抛出异常

throws:

用在函数上,是用来声明一个方法可能抛出的所有异常信息,声明处的异常类可以跟多个,用逗号隔开

如:public void method()throwsIOException{...}

throws在方法声明时抛出异常,使程序通过编译,但是要在调用方法时使用try-catch捕获异常

 

throw:

用在函数内,用于抛出一个异常类对象如:throw newRuntimeException(),或者抛出自定义的异常类对象,throw new MyException()

在方法体内部抛出异常时, 要与throws或者try-catch语句块结合使用,否则程序无法通过编译;

 

注意:

程序出现异常时,程序不会向下执行,JVM会将异常封装成相应的异常类的对象然后向外抛出

对于一个方法的返回值正常运行时要求方法必须返回定义的类型,如果不是,运行出现异常返回的是异常对象

抛弃过程中可以对异常类型进行扩展,但是不能缩小

 

2try...catch... finally  处理

示例代码:

try{

需要被检测的代码

}catch(异常类变量){

处理异常的代码

}finally{

一定会被执行的语句

}

 

注意:

部分情况下,如果没有一定要执行的语句,可以只用try...catch二个模块,finally可以省略;

程序会在return前执行finally里的程序如果System.exit(0)finally之前,则不会执行finally里的程序

一个try语句后可以跟多个catch语句;catch时子类异常放上面,父类异常放下面

如果抛出的异常不进行try...catch处理,调用时也不处理,而是继续抛出,直到抛出到JVM

 

3自定义异常类型

因为项目中会出现特有的问题,而这些问题并未被Java所描述并封装对象,所以可按Java对问题封装的思想,将这些特有问题进行自定义的异常封装。

package blog.itheima;//自定义算术异常class ArithmeticException extends Exception {private int value;ArithmeticException(){super();}ArithmeticException(String msg, int value) {super(msg);this.value = value;}int getValue(){return value;}}class Demo {int div( int a, int b) throws ArithmeticException {if(b<=0)throw new ArithmeticException("被除以负数或0了,错误",b);return a/b;}}class ExceptionTest {public static void main(String[] args){Demo d = new Demo();try{int x = d.div(4,5);System.out.println("x="+x);}catch (ArithmeticException e){System.out.println(e.toString());System.out.println("错误的数是:"+e.getValue());}}}


四、异常在子父类覆盖中的体现

1、子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法只能抛出父类的异常或者该异常的子类;

2、如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集;

3、如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常;如果子类方法发生了异常,就必须要进行try...catch处理,绝对不能抛。


---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
0 0
原创粉丝点击