异常:是在运行时期发生的不正常情况,把问题封装成对象抛出就叫做异常,
在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) {
}
}
}