异常处理


1、异常捕获
try{ 正常逻辑代码;
} catch(异常类型 变量名 ){
处理;捕获块
}
1、在捕获时,小心语句中有局部变量,放入try块中后,try块后面引用该变量就无法引用了;
2、catch内就象申明一个变量的名,像形参一样;
catch(InputMismatchException ime){ } 一旦发生的异常与catch后的异常能够匹配上,则表明,我们对异常进行了捕获; 一旦被捕获,就不会被传递了,JVM就不会终止程序,整个程序就能正常进行了; 异常不正确,则不会被捕获;组程序会被JVM终止
3、多异常:可以使用Exception 捕获所有错误, 但是当try块中可能抛出两种不同的异常,不同的异常会有不同的处理方式;
【例】数学异常,数据匹配异常;两种出现之后,给用户反馈错误地方;
try{ 正常逻辑代码;
} catch(异常类型 变量名 ){
处理;捕获块 syso“***”
}catch (异常类型 变量名 ){
处理;捕获块 syso“***”
}catch Exception ex {
处理;捕获块 syso“发生未知异常”
ex.printStackTrace( ); //打印出未知的异常信息,堆栈信息;便于代码调整;
//运行阶段往往会被注释掉,写到维护日志里面;看起来太吓人了;和JVM报错很像( 少了在哪个线程)。
// ex.printStackTrace( ); ex是异常类,调用的方法是他继承自java.lang.Throwable中的;
} finally{
//不管是否发生异常,都必须去执行的代码; 就算前面有return结束方法都必须执行
在该语句块中主要使用资源清理、通道关闭、线程关闭、连接关闭
}


注意】:①、catch块中异常有继承关系,需要把子类写在前面,catch父类写在后面;否则后面的情况判断就没有存在意义; 如果担心有自己没有捕获的异常,最好在最后加一个Exception异常catch块;避免发生错误;
②、try-catch-finally 不允许单独出现,在catch,finally前必须有try;
异常区分:1、外部用户错误造成,提示一句; 2、 程序代码错误造成,则需要程序员进行修改
抓住提示用户错误的时候,如何让用户重新输入;语句块加while(){}; 在try块中最后加上break; break以上语句都没有抓住异常则结束整个循环;
灵活使用】1、在哪里抓异常要看流程控制; 2、根据业务来决定在哪里处理;

有错误的语句块没有在try-catch中则会造成错误被抛出; 打印功能在try语句块中不被执行,在之外会被执行;


2、try--catch 执行流程:
try中:
1、在try语句块执行中语句按照顺序执行语句,发生异常后,程序转向catch程序块,catch程序块里面的语句被执行;
2、存在异常则跳过try语句块下面的语句,执行异常语句块,执行完异常语句块后跳出try-catch方法;
3、没有则跳过catch语句块执行try-catch之后的语句;
4、当在catch块中有多个catch块的时候,catch块被顺序检查,检查中异常的匹配关系很重要;首先被匹配的异常块被执行,其他的catch块被忽略不再执行;


3、throws:在方法的申明后面实现前面,用throws关键字后面跟上会抛出的 异常类型的类名
表示可能会抛出的几种异常;

细节:1、一个方法的完成申明形式包括了throws,甚至main方法也可以throws;main方法中可以改变public和static 的先后, []的在arg前后, arg可以被修改; throws可以有或没有;
2、 方法重写的规范被更新,增加:子类被重写方法不能比父类抛出更多的异常(异常 范围而不是个数!);
3、只有抛出编译时异常,调用者才会受到警告:抛出运行时异常,调用者不会在编译期被警告;

面 试:对比throw 与 throws的异同:
 throwthrows
位置写在方法体中,是执行语句写在方法申明的最后,一条申明语句;
后面语句内容后面接一个异常对象后面接一个或多个异常类的类名;
效果不同执行到该语句会真正发生一个异常被抛出的动作仅仅表明本方法有可能会抛出某种或几种异常;请在编译期提醒调用者


4、程序员会怎样用异常处理?
①调用 先人有throws申明的方法,99%马上 try catch;
②运行时异常: 1、多做if判断,尽量不要异常有产生的机会;/数值为0;
2、不是所有的异常都用try-catch;能用修改使异常消失是更好的方案;特别是空指针;
3、1%的情况才考虑try-catch;并考虑try-catch 流程控制的执行代码的控制;
③throw和throws只有在大型分层项目当中才有可能自己去写;


5、自定义异常
第一步,自定义日志方法:
public class LovoException extends Exception{
构造重写:public LovoExcepyion( Exception cause){
super( cause );
通过一个异常构造另外一个异常;
}
}
在exception类中{
private String message;
添加set,get方法; //就 可以使用这个类或者这个类的子类记录信息了;
}
第二步,抓取错误,将错误信息装入自定义信息;
catch(数组下标越界 outE){ /抓住错误
lovoException le = new lovoException( outE ); //将自定义方法实例化,将错误传入
le.writeLog( ); //记录下错误信息;
} // 利用构造器,将OUTE的信息传入,继承了exception的构造方法,用子类构造子类


6、工作中的使用:
 页面层业务处理层数据访问层
使用try-catchthrowsthrows/throw,从新表达,用throws抛



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值