----------------------<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>、期待与您交流! ----------------------