黑马程序员_异常(老毕视频总结及《疯狂java》补充)

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

                            黑马程序员_异常(老毕视频总结及《疯狂java》补充)

 

 

异常:是对问题的描述。将问题进行对象的封装。

 

异常体系:

         Throwable

                   |--Error

                   |--Exception

                            |--RuntimeException

异常体系的特点:异常体系中的所有类以及建立的对象具备可抛性

                                     也就是说可以被throw和throws关键字所操作

                                     只有异常体系具备这个特点

Throw定义在函数内,用于抛出异常对象

Throws定义在函数上,用于抛出异常类,也可以抛出多个逗号隔开。

 

当函数内容有throw抛出异常对象,并未进行try处理。必须要在函数上声明。都编译失败

注意:RuntimeException除外,也就是说,函数内如果抛出的RuntimeException异常,函数上可以不用声明

如果函数声明了异常,调用者需要进行处理。处理方法可以throws可以try

异常有两种

         编译时被检测异常

                   该异常在编译时,如果没有处理(没有抛出也没有try),编译失败

                   该异常被标识,代表这可以被处理

         运行时异常(编译时不检测)

                   在编译时,不需要处理,编译器不检查

                   该异常的发生,建议不处理,让程序停止。需要对代码进行修正

 

异常处理

try

{

需要被检测的代码

}

Catch()

{

处理异常代码

}

Finally

{

一定会执行的代码

}

注意:finally中定义的通常是:关闭资源代码  因为资源必须释放

          

 

自定义异常

定义类继承Exception 或者RuntimeExcetpion

1为了让该自定义类具备可抛性

2让该类具备操作异常的共性方法

 

当要定义自定义异常的信息时,可以使用父类已经定义好的功能

异常信息传递给父类的构造函数

Class MyException extends Exception

{

         MyException(Stringmessage)

         {

                   Super(message)

}

}

自定义异常:按照java的面向对象思想,将程序中出现的特有问题进行封装

 

异常的好处:

         1将问题进行封装

         2将正常流程代码和问题处理代码相分离。方便于阅读

 

异常处理

1处理方式有两种:try或者throws

2调用到抛出异常的功能时,抛出几个,就处理几个

         一个try对应多个catch

3多个catch,父亲的catch放到最下面

4catch内,需要定义针对性处理方式,不要简单的定义:printStackTrace,输出语句

                   也不要不写

                   当捕获到的异常,本功能处理不了时,可以继续在catch中抛出

 

                   如果该异常处理不了,但并不属于该功能出现的异常

                   可以将异常转换后,再抛出和该功能相关的异常

比如:汇款的例子

异常的注意事项:

在子父类覆盖时:

1子类抛出的异常必须是父类的异常的子类或者子集

2如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try不能抛

 

以上部分为老毕视频总结     下面为结合疯狂java总结

---------------------------------------------------------------------------------------------------------------------------------

*面试题:

当系统执行到程序中catch块代码里的return;语句时,系统是否还会执对应的finally块?(是)

垃圾回收机制不能关闭资源:jvm的垃圾回收机制不会这些资源,垃圾机制属于java内存管理的一部分,它只负责回收堆内存中分配出来的内存。

 

  

 

 

 

因为程序开始时指定oos=null;ois=null;完全可能在程序运转过程之前就引发异常那么oos,ois还来不及初始化,因此oos,ois根本无需关闭

应该改为:

Finally

{

         If(oos!=null)

         {

                   Oos.close();

}

If(ois !=null)

{

         Ois.close();

}

}

首先要保证不是oos不是null再保证ois不是null

但是这样依然不够安全

如果在oos时出现了异常,那么程序将在关闭oos时非正常退出,这样就会导致ois得不到关闭从而导致资源泄露

 

所以应该写:

Finally

{

         If (oos!= null)

         {       

try

                   {

                            Oos.close();

}

Catch(Exception ex)

{

                   Ex.printStackTrace();

}

}

If(ois!=null)

{

         Try

         {

                   Ois.close();

}

Catch(Exception ex)

{

         Ex.ptintStackTrace();

}

}

}       

l  使用finally块关闭物理资源,保证关闭操作总是被执行

l  关闭每个资源之前首先保证该资源的引用变量不为null

l  为每个物理资源使用单独的try…catch块来关闭资源,保证关闭资源时引发的异常不会影响其他资源的关闭

 

 

 

finally的异常处理流程

当程序执行try块catch块遇到throw语句时,throw语句会导致该方法立即结束,但是系统执行throw语句时不会立即抛出异常,而是去寻找异常处理流程中是否包含finally块。如果没有,程序立即抛出异常、终止方法。如果有,系统立即开始执行finally块,只有当系统执行完finally块后,系统才会再次跳回来抛出异常、中止。如果finally块用return来结束方法,系统将不会跳回try块去抛出异常。中止方法。

 

Finally只有一种情况不会执行。当执行System.exit(0);不会执行

System.exit(0)被调用时,将停止当前线程和所有其他当场死亡的线程。Finally块并不能让已经停止的线程继续工作

虚拟机退出当前执行两项清理工作

1执行系统中注册的所有关闭钩子

2JVM对所有还未结束的对象调用Finalizer

 

 

Java语法规定,对于非自动关闭资源的try语句,每个try块至少需要一个catch或一个finally块,决不能只有单独一个try块。

 

Java语言规定,子类重写父类的方法时,不能声明抛出比父类方法类型更多。范围更大的异常

 

 

 

 

 

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值