异常处理的设计和重构学习二
【一】
Exception异常--->意思是例外。
一:异常处理机制代码和程序源代码放一块坏处1)-->逻辑代码和错误处理代码放在一起,降低程序的可读性
2)--->程序员在编写程序时考虑的例外情况多,对程序员本身要求高
二:异常机制-->当程序出现错误,程序如何安全退出的机制。
java的异常机制就是JDK中以Throwable类为父类所有可能出现的意外情况
三:java中采用面向对象的方式来处理异常---过程--->1)抛出异常:执行代码,发生异常,产生代表该异常的对象,并停止当前代码,并把异常交予jre处理(jvm)
------->2)捕获异常:jre得到异常后,寻找相应代码处理。
四:异常分类
--->Error(UnCheckedException)java运行系统内部错误或资源耗尽。例如Jvm崩溃,断电。程序员不能处理
Throwable《
--->Exception--->1)RuntimeException(UnCheckedException)编译时不报错,运行时报错。例:除数为0
--->2)非RuntimeException(CheckedException)编译时报错,★[需要运用异常机制处理异常]
运行时异常(Run异常处理机制代码和程序源代码放一块坏处1)-->逻辑代码和错误处理代码放在一起,降低程序的可读性timeException)[UnCheckedException]--->程序员自己逻辑出现错误,可以通过修改代码处理异常。强制停止程序运行,便于程序员修改,增强程序【安全性】
非运行时异常,编译异常[CheckedException]--->需要通过异常机制去处理的异常,增强代码的【健壮性】
处理异常和有用代码放在一起的坏处
1逻辑混乱
2对程序员自身要求高
java处理异常的方法
1:抛出异常。
2:捕获异常。
【二】
第一种办法:抛出异常,捕获异常(try catch)
【格式】
try{
//可能产生异常的源代码
}catch(Exception e){
//处理异常方法
}finally{
//释放资源
}
语法特点1)一个try语句必须至少带有一个catch{}或finally{}块
2)catch(对象)如果存在多个catch,那么对象从上往下的对象 ---> 【 小(子类)在上,大(父类)在下 】
3 ) 一个try语句可以产生多个catch,一个catch语句只能捕获一个异常对象
4)catch块中的常用方法 --->a) toString()-->显示异常类的类名和产生异常的原因
---->b) GetMessage()-->只显示产生异常的原因,不显示异常类名
---->c) printStackTrace()-->显示异常类类名,产生异常原因,打印栈堆信息(常用)
【三】
第二种办法:自动抛出异常--->throws子句
格式:
方法名+ throws 异常类 (){
//可能出现异常的源代码
}
自动抛出异常的特点--->1)当编译时异常( CheckedExcption )出现时,不一定处理它,可以把异常向上抛出,让调用它的方法处理。可以不断向上抛出,在main方法中处理,即程序运行时处理。
--->2)如果一个方法体内抛出多个异常,那么异常类在方法名后用【,】隔开
方法重写中声明异常的原则(1)-->父类方法没有声明异常,子类重写方法不能声明异常
(2)-->重写方法抛出的异常类,与被重写方法抛出的异常类关系。子类<=父类 (继承父子)
(3)--->子类抛出异常类的数目,不可多余父类抛出异常类的数目 (不是指个数,指的是类型)
【四】
手动抛出异常类throw
步骤:1)找一个合适的异常类
2)创建该类的对象
3)将对象手动抛出
4)throw后的代码不执行。
例子--->在方法体内抛出异常。throw
public static int sum( int a, int b) {
if(b==0){
throw new MyzeioException();
} else {
int sum=0;
sum=a/b;
return sum;
}
例子--->
public static void main(String[] args ) {
sdf ();
System. err .println( "sxf" ); // 不运行
}
public static void sdf(){
System. out .println( "PaymentRequestServiceImpl.sdf()" ); // 运行
int a =1/0;
System. err .println( "tt" ); // 不运行
}
例子--->
public static void main(String[] args ) {
try {
sdf ();
} catch (Exception e ) {
// TODO Auto-generated catch block
e .printStackTrace();
}
System. out .println( "PaymentRequestServiceImpl.main(sxf)" ); // 运行
}
public static void sdf() throws Exception{
System. out .println( "PaymentRequestServiceImpl.sdf()" ); // 运行
if ( true ){
throw new Exception();
} else {
System. out .println( "PaymentRequestServiceImpl.sdf(dddd)" ); // 不运行
}
System. out .println( "PaymentRequestServiceImpl.sdf(stttt)" ) ; // 不运行
}
【五】
第四种办法:--->自定义异常类
什么时候自定义异常类--->当jdk中的异常机制里的异常类 不能满足程序员编写代码可能产生的异常时 ,需自建异常类
* 第四种实现方法 自定义异常
* 当系统提供 Exception 不能满足 我们自身
* 个性话的 需要的时候
* 1 、创建一个异常的子类
* 2 、创建两个构造器
* 3 、有参数的构造器可以借助
* super( 参数 ) 去调用父类中的
* 含有参数参数的构造器
1、一般情况下 继承Exception或下面的子类(除了RuntimeException) ---》在编译时候 需要处理 MyCheckException (大多数自定义异常类继承Exception)
2、继承RuntimeException类 =======》在运行时候处理 RuntimeException (少之又少)
例子:
//自定义的异常类
public class MyzeioException extends Exception {
public MyzeioException (){}
public MyzeioException(String str){
super (str);
}
}
// 测试类
public class Test{
public static void main(String args){
try{
sum(2,0);
}catch(MyzeioException e){
e.printStackTack();
}
}
public static int sum( int a, int b) throws MyzeioException {
if (b==0){
throw new MyzeioException();
} else {
int sum=0;
sum=a/b;
return sum;
}
}