JAVA从菜鸟到进阶(四)——异常

异常:是在运行时期发生的不正常情况,把问题封装成对象抛出就叫做异常,
在java中用类的形式对不正常的情况进行描述和封装,描述不正常的情况的类,就叫做异常类。其实异常是java通过面向对象的思想把问题封装成立对象,用异常类对问题进行描述。不同的问题用不同的类进行具体描述。

Throwable:无论是Error,Exception。问题发生就应该可以抛出,让调用者知道并处理。
1.该体系特点在于Throwable及所有子类具有可抛性
2.一般不可处理的Error 特点:是有JVM抛出产生 这种问题发生一般不做处理,直接修改程序。
3.Exception类可以处理

该体系的特点:
子类的后缀名都是用其父类名作为后缀,阅读性很强。
注意:
1,如果一个类称为异常类,必须要继承异常体系,因为只有称为异常体系的子类才有资格具备可抛性。
2,如果在函数内发生异常,必须在函数上进行声明,在调用者上也必须进行处理

异常的分类:
1,编译时被检测异常 只要是Exception和其子类都是(除了RuntimeException及其子类)
这种问题一旦出现,希望在编译时就进行检测,让这种问题有对应处理方式,这样问题可以针对性处理。
2,运行时异常RuntimeException(编译时不检测)
这种问题发生无法让功能继续,运算无法进行,更多是因为调用者的原因导致的,或者引发了内部状态的改变导致的。这种问题一般不处理,直接编译通过,在运行时调用时的程序强制停止,让调用者对代码进行修改。
注意:所以在自定义异常时,要么继承Exception,要么继承RuntimeException

throw 和 throws的区别
1,throws使用在函数上,throw使用在函数内。
2,throws抛出的是异常类,可以抛出多个,用逗号隔开。
throw抛出的是对象

异常处理的捕获形式:
try
{ //需要被检测的代码
}
catch(异常类变量 e)//该变量用于接受发生的异常对象
{ //处理异常的代码
}
finally
{ //一定会被执行的代码
}
注意:1,jvm默认的处理机制就是调用异常对象 printstacktrace方法。
2,当一个try对应多个catch时,父类的catch放在最下面,否则编译失败。
catch(NullpointerException e )//NullpointerException extends Exception
{
}
catch(…)
{
}
catch(Exception e)
{
}

异常处理的原则:
1.函数内部如果抛出需要检测异常,那么函数上必须要声明或在函数内用try catch捕捉,否则编译失败。
2.如果调用到了声明异常的函数,要么try catch ,要么throws,否则编译失败。
3.什么时候catch,什么时候throws
功能内容解决用catch
解决不了用throws告诉调用者,由调用者解决。
4.一个功能如果抛出多个异常,那么调用时必须有对应多个catch进行针对性处理

5.finally
finally是一定会执行的代码
catch{
return ;//catch加return后后面的代码不会执行,但finally中的会执行
}
finally
{
}
System.out.println();
//只有一种情况System.exit(0)是退出jvm不会执行 finally中的代码块

finally 作用:通常用于关闭(释放)资源
连接数据库
查询(发生Exception)
关闭连接(finally)

注意:try catch finally代码块组合特点
1 try catch finally
2 try catch(多个) 当没有必要资源需要释放时,可以不用定义finally
3 try finally 异常无法直接处理 当资源需要释放

异常转换 (异常封装)
void addDate(Data D)
{
//连接数据库
try{
//添加数据,出现异常(SQLException);
}
catch(SQLExcption)
{
//处理代码 throw new NoAddException();
}
finally
{
//关闭数据库
}
对不需要暴露的异常进行封装

异常的注意事项
1.子类在覆盖父类方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常或者该异常的子类
2.如果父类抛出多个异常,那么子类只能抛出父类异常的子类

简单说:子类覆盖父类只能抛出父类的异常或者子类或者子集类
注意:如果父类的方法没有抛出异常,那么子类覆盖时绝对不能抛出,只能try

package ExceptionDemo;
class PlanDelay extends Exception
{
	PlanDelay(String str)
	{
		super(str);
	}
}
class NaPingException extends Exception
{
	NaPingException(String str)
	{
		super(str);
	}
}
class MaoYanException extends Exception
{
	MaoYanException(String str)
	{
		super(str);
	}
}
class Teacher 
{  
	private String name;
	Teacher(String name)
	{
		this.name=name;
	}
	void Teach(Computer c) throws PlanDelay
	{   
			try {
				c.Run();
				System.out.println("上课");
			} catch (NaPingException e) {
				System.out.println("重启电脑");
				c.stmethod(0);
				Teach(c);
				
			} catch (MaoYanException e) {
				System.out.println("冒烟解决不了");
				
				throw new PlanDelay("计划无法完成");
			}
		
	
	
	}
	
}
class Computer
{   
	private int state=0;
	Computer(int state)
	{
		this.state=state;
	}
	public void stmethod(int state)
	{
		this.state=state;
	}
	void Run() throws NaPingException,MaoYanException
	{  
		if(state==1)
		{
			throw new NaPingException("蓝屏了");
		}
		if(state==2)
		{
			throw new MaoYanException("冒烟");
		}
		System.out.println("电脑启动了");
	}
}
public class ExceptionDemo2 {
public static void main(String []args)
{
	Teacher t=new Teacher("pzh");
	Computer PC=new Computer(2);
	try {
		t.Teach(PC);
	} catch (PlanDelay e) {
	     try {
	    	 System.out.println("买了一台新电脑");
			t.Teach(new Computer(0));
		} catch (PlanDelay e1) {
			
		}
		
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值