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

---------------------- 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值