12异常与设计模式.docx
- 文档编号:26821855
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:20
- 大小:1.40MB
12异常与设计模式.docx
《12异常与设计模式.docx》由会员分享,可在线阅读,更多相关《12异常与设计模式.docx(20页珍藏版)》请在冰豆网上搜索。
12异常与设计模式
12异常与设计模式
12.1默写
1、接口的特点?
声明接口的关键字?
2、抽象类的特点?
抽象方法的特点?
关键字?
3、构造方法的概念?
与普通方法的区别
4、Static与非static的区别?
5、什么是方法重写?
什么是方法重载?
6、多态的前提条件?
哪两种使用方式?
12.2为什么需要异常处理
异常是正常情况中特殊情况,有可能发生,也有可能不发生
publicstaticvoidmain(String[]args){
Scannerinput=newScanner(System.in);
System.out.println("请输入被除数:
");
intnumA=input.nextInt();
System.out.println("请输入除数:
");
intnumB=input.nextInt();
System.out.println(String.format("%d/%d=%d",numA,numB,numA/numB));
System.out.println("谢谢使用本程序");
}
正常情况:
出现异常的时候
输入的数据类型与程序期望的数据类型不一致
最后的一行,告诉我们是在程序中异常出现的行数
第一行,告诉我们是异常的类型
除数为0,在数学中,除数不能为0
没有异常机制时,使用if-else解决问题
publicstaticvoidmain(String[]args){
Scannerinput=newScanner(System.in);
System.out.println("请输入被除数:
");
intnumA;
if(input.hasNextInt()){
numA=input.nextInt();
System.out.println("请输入除数:
");
intnumB;
if(input.hasNextInt()){
numB=input.nextInt();
if(numB==0){
System.out.println("除数不能为0");
}else{
System.out.println(String.format("%d/%d=%d",numA,numB,numA/numB));
System.out.println("谢谢使用本程序");
}
}else{
System.out.println("对不起,您输入的有误,请输入整数!
");
}
}else{
System.out.println("对不起,您输入的有误,请输入整数!
");
}
}
弊端:
1、代码臃肿
2、程序员要花很大精力“堵漏洞”
3、程序员很难堵住所有“漏洞”
12.3java处理异常的5个关键字
异常的组合形式
第一种try…catch
try{
System.out.println("请输入被除数:
");
intnumA=input.nextInt();
System.out.println("请输入除数:
");
intnumB=input.nextInt();
System.out.println(String.format("%d/%d=%d",numA,numB,numA/numB));
System.out.println("谢谢使用本程序");
}catch(Exceptione){
//e.printStackTrace();//打印异常的堆栈信息
System.out.println("出错了");
}
第二种组合try—finally
publicstaticvoidmain(String[]args){
Scannerinput=newScanner(System.in);
try{
System.out.println("请输入被除数:
");
intnumA=input.nextInt();
System.out.println("请输入除数:
");
intnumB=input.nextInt();
System.out.println(String.format("%d/%d=%d",numA,numB,numA/numB));
}finally{
System.out.println("谢谢使用本程序");
}
}
第三种组合try-catch..finally
try{
System.out.println("请输入被除数:
");
intnumA=input.nextInt();
System.out.println("请输入除数:
");
intnumB=input.nextInt();
System.out.println(String.format("%d/%d=%d",numA,numB,numA/numB));
}catch(Exceptione){
System.out.println("出错了");
}finally{
System.out.println("谢谢使用本程序!
");
}
12.4异常的执行情况
(1)正常情况
红色的代码是程序所执行的代码
try{
System.out.println("请输入被除数:
");
intnumA=input.nextInt();
System.out.println("请输入除数:
");
intnumB=input.nextInt();
System.out.println(String.format("%d/%d=%d",numA,numB,numA/numB));
}catch(Exceptione){
e.printStackTrace();
System.out.println("出错了");
}
System.out.println("谢谢使用本程序");
第二种情况,出现了异常,而且异常的类型与catch所捕所的异常相匹配
运行效果图:
try{
System.out.println("请输入被除数:
");
intnumA=input.nextInt();
System.out.println("请输入除数:
");
intnumB=input.nextInt();
System.out.println(String.format("%d/%d=%d",numA,numB,numA/numB));
}catch(Exceptione){
//e.printStackTrace();
System.out.println("出错了");
}
System.out.println("谢谢使用本程序");
第三种情况,产生了异常,但是异常的类型与catch所捕获的异常不匹配
运行效果图
try{
System.out.println("请输入被除数:
");
intnumA=input.nextInt();
System.out.println("请输入除数:
");
intnumB=input.nextInt();
System.out.println(String.format("%d/%d=%d",numA,numB,numA/numB));
}catch(ArithmeticExceptione){//算术异常
//e.printStackTrace();
System.out.println("除数不能为0");
}
System.out.println("谢谢使用本程序");
异常信息的三种形式
catch(ArithmeticExceptione){//算术异常
//[1]e.printStackTrace();
//[2]System.err.println("除数不能为0");
//[3]System.out.println(e.getMessage());
}
12.5常用的异常类型
继承关系图
12.6finally
Finally:
无论是否发生异常,都要执行的代码。
Finally唯一不执行的情况
try{
System.out.println("请输入被除数:
");
intnumA=input.nextInt();
System.out.println("请输入除数:
");
intnumB=input.nextInt();
System.out.println(String.format("%d/%d=%d",numA,numB,numA/numB));
}catch(Exceptione){//算术异常
System.out.println("出错了!
");
System.exit
(1);---中断程序,退出java虚拟机
}finally{
System.out.println("谢谢使用本程序");
}
12.7在catch中有return,程序会不会执行finally;
代码
try{
System.out.println("请输入被除数:
");//[[1]]
intnumA=input.nextInt();
System.out.println("请输入除数:
");
intnumB=input.nextInt();
System.out.println(String.format("%d/%d=%d",numA,numB,numA/numB));
}catch(Exceptione){//算术异常//[[2]]
System.out.println("出错了!
");
return;//[4]
}finally{
System.out.println("谢谢使用本程序");//[[3]]
}
12.8多重异常
代码
try{
System.out.println("请输入被除数:
");
intnumA=input.nextInt();
System.out.println("请输入除数:
");
intnumB=input.nextInt();
System.out.println(String.format("%d/%d=%d",numA,numB,numA/numB));
}catch(ArithmeticExceptione){//算术异常
System.out.println("不能被0除");
}catch(InputMismatchExceptione){
System.out.println("请输入整数");
}catch(Exceptione){
System.out.println("出错了!
");
}finally{
System.out.println("谢谢使用本程序");
}
执行顺序,首先与第一个catch进行匹配,不匹配,再去与第二个catch进行匹配,如果所有的都不匹配就执行最后一个Exception,因为Exception是所有异常的父类
在写多重catch的时候,Exception放到最后
12.9throws关键字
publicclassTest4{
publicstaticvoiddiv(intnumA,intnumB)throwsException{
System.out.println(String.format("%d/%d=%d",numA,numB,numA/numB));
System.out.println("谢谢使用本程序");
}
publicstaticvoidmain(String[]args){
try{
Test4.div(10,0);
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
/*publicstaticvoidmain(String[]args)throwsException{
Test4.div(10,0);
}*/
}
在方法的定义处使用throws声明该方法可能会产生异常(这个异常是Exception),那么该方法的调用处就必须做try-catch处理,或者继续使用throws声明
如果声明的是RuntimeException的子类,那个这个异常在运行时,可以处理,也可以不处理
publicclassTest5{
publicstaticvoiddiv(intnumA,intnumB)throwsInputMismatchException{
System.out.println(String.format("%d/%d=%d",numA,numB,numA/numB));
System.out.println("谢谢使用本程序");
}
publicstaticvoidmain(String[]args){
Test5.div(10,0);
}
}
在继承中的子类父类中方法的声明时,声明异常
(Exception,RuntimeException)
Exception:
(1)如果父类的方法中没有使用throws声明异常,那么子类也不能声明Exception异常
publicclassFather{
publicvoidshow(){
}
}
子类
如果子类真的会有这样一个Exception的异常,那么要么给父类添加上异常,要么自己处理
publicclassFather{
publicvoidshow()throwsException{
}
}
或者
publicclassSonextendsFather{
@Override
publicvoidshow(){
try{
}catch(Exceptione){
//TODO:
handleexception
}
super.show();
}
}
RuntimeException
publicclassFather{
publicvoidshow(){
}
}
子类
publicclassSonextendsFather{
@Override
publicvoidshow()throwsRuntimeException{
//TODOAuto-generatedmethodstub
super.show();
}
}
父类的方法如果没有声明异常,那么子类在重写方法的时候,声明的是RuntimeException或者是RuntimeException的子类的异常时,程序可以不进行处理。
12.10throw关键字
Exception
publicvoidsetGender(Stringgender)throwsException{
if("男".equals(gender)||"女".equals(gender)){
this.gender=gender;
}else{
thrownewException("性别只能是男或者女");
}
}
或者
publicvoidsetGender(Stringgender){
if("男".equals(gender)||"女".equals(gender)){
this.gender=gender;
}else{
try{
thrownewException("性别只能是男或者女");
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
RuntimeException
publicvoidsetGender(Stringgender)throwsRuntimeException{
if("男".equals(gender)||"女".equals(gender)){
this.gender=gender;
}else{
thrownewRuntimeException("性别只能是男或者女");
}
}
或者
publicvoidsetGender(Stringgender){
if("男".equals(gender)||"女".equals(gender)){
this.gender=gender;
}else{
thrownewRuntimeException("性别只能是男或者女");
}
}
总结:
Throws与throw的区别
(1)throws是声明,定义在方法名的后面(方法的外部)
(2)throw是手动抛出异常,定义在方法的内部
(3)如果throw的Exception,那么必须声明或处理
(4)如果throw的RuntimeException,那么可以处理,也可以不处理
12.11自定义异常类
自定义异常类的步骤
自定义异常类
//声明一个类,继承自Exception类,
publicclassGenderExceptionextendsException{
publicGenderException(Stringmessage){
super(message);//调用父类带参构造方法
}
}
如何来使用
publicvoidsetGender(Stringgender)throwsGenderException{
if("男".equals(gender)||"女".equals(gender)){
this.gender=gender;
}else{
thrownewGenderException("性别只能是男或者女");
}
}
publicstaticvoidmain(String[]args){
try{
newPerson().setGender("其它");
}catch(GenderExceptione){
System.out.println(e.getMessage());
}
}
小结
异常:
运行时有可能发生,也有可能不发生的情况
三种组合形式:
try…catch,try..finally,,try..catch..finally
Finally:
无论是否发生异常,都要执行的代码,只有唯一一种不执行的情况,使用
System.exit
(1);
如果在catch中有return程序会怎么执行
(1)没有异常发生,执行,try-finally
(2)有异常发生,try,异常类型匹配,执行catch,执行finally,最后执行catch中的return
异常的种类
Throwable:
Error:
不能处理的,我们不管
Exception:
检查时异常必须做处理的,否则编译无法通过
RuntimeException—》运行时异常,可以不处理,
在继承的关系中,父类是否声明异常,子类是否需要做处理,取决于异常的类型,
Exception就必须处理,RuntimeException可以不处理
Throws与throw:
Throws:
声明,定义在方法的外边,
Throw:
抛出,定义在方法的里边
自定义异常类
(1)编写类,继承Exception或RuntimeException
(2)编写构造方法
12.12设计模式
工厂设计模式:
主要的作用,就是根据不同的参数情况,创建不同的子类对象
主要作用就是创建子类对象的
(1)父类作方法的返回值类型Human(人)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 12 异常 设计 模式