第七章 异常(Exception)处理

合集下载

Java异常(Exception)处理以及常见异常总结

Java异常(Exception)处理以及常见异常总结

Java异常(Exception)处理以及常见异常总结⽬录前⾔异常简介异常类型总结前⾔很多事件并⾮总是按照⼈们⾃⼰设计意愿顺利发展的,经常出现这样那样的异常情况。

例如:你计划周末郊游,计划从家⾥出发→到达⽬的→游泳→烧烤→回家。

但天有不测风云,当你准备烧烤时候突然天降⼤⾬,只能终⽌郊游提前回家。

“天降⼤⾬”是⼀种异常情况,你的计划应该考虑到这样的情况,并且应该有处理这种异常的预案。

计算机程序的编写也需要考虑处理这些异常情况。

异常(exception)是在运⾏程序时产⽣的⼀种异常情况,已经成为了衡量⼀门语⾔是否成熟的标准之⼀。

⽬前的主流编程语⾔java也提供了异常处理机制。

异常简介Java中的异常⼜称为例外,是⼀个在程序执⾏期间发⽣的事件,它中断正在执⾏程序的正常指令流。

为了能够及时有效地处理程序中的运⾏错误,必须使⽤异常类,这可以让程序具有极好的容错性且更加健壮。

在 Java 中⼀个异常的产⽣,主要有如下三种原因:1. Java 内部错误发⽣异常,Java 虚拟机产⽣的异常。

2. 编写的程序代码中的错误所产⽣的异常,例如空指针异常、数组越界异常等。

3. 通过 throw 语句⼿动⽣成的异常,⼀般⽤来告知该⽅法的调⽤者⼀些必要信息。

Java 通过⾯向对象的⽅法来处理异常。

在⼀个⽅法的运⾏过程中,如果发⽣了异常,则这个⽅法会产⽣代表该异常的⼀个对象,并把它交给运⾏时的系统,运⾏时系统寻找相应的代码来处理这⼀异常。

我们把⽣成异常对象,并把它提交给运⾏时系统的过程称为拋出(throw)异常。

运⾏时系统在⽅法的调⽤栈中查找,直到找到能够处理该类型异常的对象,这⼀个过程称为捕获(catch)异常。

例 1为了更好地理解什么是异常,下⾯来看⼀段⾮常简单的 Java 程序。

下⾯的⽰例代码实现了允许⽤户输⼊ 1~3 以内的整数,其他情况提⽰输⼊错误。

package io.renren.config;import java.util.Scanner;/*** Created by LiYangYong*/public class TestException {public static void main(String[] args) {System.out.println("请输⼊您的选择:(1~3 之间的整数)");Scanner input = new Scanner(System.in);int num = input.nextInt();switch (num) {case 1:System.out.println("one");break;case 2:System.out.println("two");break;case 3:System.out.println("three");break;default:System.out.println("error");break;}}}正常情况下,⽤户会按照系统的提⽰输⼊ 1~3 之间的数字。

第七讲异常

第七讲异常

调用者如何使用声明强制异常处理的方法 软件调用者(及使用者) 软件调用者(及使用者)在调用声明强制 异常处理的方法时,用两种处理方法: 异常处理的方法时,用两种处理方法: 1、在调用该方法的方法中捕捉相应的异常。 、在调用该方法的方法中捕捉相应的异常。 2、在调用该方法的方法首部声明抛出相应 、 的异常。(采用throws关键字) 。(采用 关键字) 的异常。(采用 关键字
5 用户定义的异常
Java定义的完善的 定义的完善的Exception类,对于常见的 定义的完善的 类 异常都能产生异常对象。 异常都能产生异常对象。 对于某个应用程序所特有的错误,则需要编程 对于某个应用程序所特有的错误, 人员根据程序的特殊逻辑在用户程序中自己创 建异常类和异常对象。 建异常类和异常对象。 用户定义的异常类型必须是Throwable的子 用户定义的异常类型必须是 的子 直接或间接), ),Java推荐以 推荐以Exception类 类(直接或间接), 推荐以 类 作直接父类创建用户异常类。 作直接父类创建用户异常类。
5 用户定义的异常
良好的程序应该当异常发生时, 良好的程序应该当异常发生时,给出相 应的提示信息, 应的提示信息,告诉用户到底发生了什 么错误, 么错误,可采用创建用户异常方法来解 决。 举例:参见下页源码阅读。 举例:参见下页源码阅读。
//UserDefineException.java public class IllegalSalaryException extends Exception { private Employee m_ConcernedEmp; //Employee对象 对象 private double m_IllegalSalary; //非法工资 非法工资 IllegalSalaryException( ) //构造方法 无参构造方法 构造方法1—无参构造方法 构造方法 {super(“不合法的起薪:低于最低工资”);} 不合法的起薪:低于最低工资” 不合法的起薪 void IllegalSalaryException(Employee emp,double iSal) //构造方法 构造方法2 构造方法 { this(); m_ConcernedEmp=emp; m_IllegalSalary=iSal; } public String toString() { String s; if(m_ConcernedEmp!=null) s="非法工资雇员号 非法工资雇员号"+m_ConcernedEmp.getEmpNo() + "非法工资额 非法工资额 非法工资雇员号 " + m_IllegalSalary + "合法最低工资 + Employee.getMinSalary(); 合法最低工资" 合法最低工资 else s="不合理,不能创建 不合理, 对象"; 不合理 不能创建Employee对象 对象 return; } }

第7章 程序异常处理与调试技术

第7章  程序异常处理与调试技术

第7章 程序异常处理与调试技术 在Delphi中有两种程序错误,一种是编译错误,在程序编辑阶段就可以由 编译器发现并给出提示。另外一种是运行错误,这类错误不能在编译阶段查出 ,只能在程序执行时发现,称为运行错误。Delphi提供了一种机制来处理运行 错误,保护程序的正常执行,这种机制就是异常处理。异常处理的方法是把正 常的执行程序同错误的处理程序分离开来,这样可以保证在没有错误时,程序 正常执行,当发生错误时,执行错误处理部分的程序,然后程序跳出保护模块 ,继续执行后续的程序。 7.1 异常处理 对于在应用程序中经常产生的异常,Delphi都进行了定义。如在 SysUtils单元中定义了类型转换异常(EConvertError),数学异常 (EMathError),输入输出异常(EInOutError)等;在ComCtrl单元定义了日 期异常(EDateTimeError),在Db单元中定义了数据库异常 (EDatabaseError),等。因此只需在单元中引用这些系统库单元就可以处理这 些异常
1.监视表达式 选择【View】→【Debug Windows】→【Watches】可以打开监视列表窗口 【Watch List】。在该窗口中单击鼠标右键,在弹出的快捷菜单中选择 【Add Watch】打开监视属性对话框,可以添加新的变量或表达式。如图所 示。
2.计算/修改表达式 选择【Run】→【Evaluate/Modify】可打开计算/修改对话框。如图7-4 所示。
一般有三种处理方式: 1.不管发生什么异常,使用统一的错误处理方式 Try … //需要检测的语句,例如可以是 X:=Y/Z Except HandleALLException; End; End; 2.某些异常使用特殊的处理方式,而其余的异常使用统一的处理方式。 对于一些可以预测的错误,使用更为详细的处理方式。例如: Try … Except On EZeroDivide Do HandleZeroDivideError //处理被零除错误 On EOverflow Do HandleOverflowError //处理溢出错误 On EMathError Do HandleMathError //处理其他数学异常 Else HandleAllOtherError //前面没有被处理的异常则由该程序负责处理 End;

异常

异常

1 什么是异常
程序的编译和运行结果如下: Java Visaul Basic C++ Exception in thread "main" ng.ArrayIndexOutOfBoundsException: 3 at Exception2.main(Exception2.java:8) 上面的例子编译可以通过,但运行时出现异常信息被抛出。 在其循环被执行四次之后,数组下标溢出,程序终止,并带 有错误信息,就象前面所示的程序那样。
1 什么是异常
【例3】被0除的例子 // Exception3.java class Exception3{ public static void main(String args[]){ int a=0; System.out.println(5/a); } } 我们编译这个程序得到其字节码文件,然后运行它,屏幕上的显示如下: Exception in thread "main" ng.ArithmeticException: / by zero at Exception3.main(Exception3.java:5) 因为除数不能为0,所以在程序运行的时候出现了除以0 因为除数不能为0,所以在程序运行的时候出现了除以0溢出的异常事件。
1 什么是异常
当编译这个程序时,屏幕上会输出下面的信息: Exception1.java:5: unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown FileInputStream fis = new FileInputStream("text.txt"); ^ Exception1.java:7: unreported exception java.io.IOException; must be caught or declared to be thrown while((b=fis.read())!=while((b=fis.read())!=-1) { ^ Exception1.java:10: unreported exception java.io.IOException; must be caught ordeclared to be thrown fis.close(); ^ 3 errors

异常Exception处理_听韩顺平课笔记

异常Exception处理_听韩顺平课笔记
练习2: catch中的++i会执行,但是不return finally一定执行,返回4
练习3:
练习3答案: catch中的++i执行了,但不会直接返回,将i的值保存到临时变量temp中,继续执行finally块 finally对i进行自加一操作,输出i=4,finally块执行完毕 返回临时变量temp的值,3
4.常 见 五 大 运 行 时 异 常
空指针异常:
空指针异常实例:
算数异常:除以0
数组下表越界异常:
类型转换异常:
数字格式不正确异常:
5.异 常 练 习
编译异常:在编译期间就必须处理的异常,否则代码不能通过编译
常见的编译异常:
案例:
练习:查看代码是否有问题
6.异 常 处 理 机 制
异常处理的方式:两种 try-catch-finally(释放资源),程序员在代码中捕获发生的异常,自行处理,finally一定会执行,如果没有发生异常,catch代码块不执 行 throws,将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是JVM。JVM处理异常:1.输出异常信息 2.退出程序 如果程序员没有显示处理异常,默认throws
练习题2: 练习2答案:
没有命令行传值的话,先抛出数组下表越界异常: 练习3:
考点:try中代码抛出异常后,剩余的代码不会执行 练习4:
16.异 常 处 理 小 结
13.throw VS throws
throw VS throws 一栏表: throws跟的是异常类型,throw跟的是异常对象
测试题: 考点:finally 在 throw 之前执行
14.异 常 习 题 1
练习题1: 分析涉及异常:

异常(例外)处理(Exceptions)(精)

异常(例外)处理(Exceptions)(精)
Java中定义了各种异常
3
Java中定义的异常类
Java中定义了各种异常类。ng.Throwable 是这些类的父类。 VirtualMachineError Error AWTError
ArithmeticException
NullPointerException IndexOutOfBoundsException EOFException
Hello! HELLO WORLD ! ! ng.ArrayIndexOutOfBoundsException at HelloWorld.main(HelloWorld.java:7)
2
Exception 的概念
Exception 是在程序运行时打断正常程序流程的 异常的情况 •试图打开的文件不存在 •网络链接中断 •操作数越界 •要加载的类文件不存在
10
//本例演示异常的父子类关系,注意父类异常的catch语句应该应该 //放在其子类异常catch语句的后面,否则,其子类异常永远不会被捕获。 public class TestException4 { public static void main(String [] args) { try { int a1=Integer.parseInt(args[0]); int a2=Integer.parseInt(args[1]); int result=a1/a2; System.out.println("The result is " + result); } catch(ArrayIndexOutOfBoundsException e) { System.out.println("下标越界:"+e.getMessage()); } catch(ArithmeticException e) { System.out.println("除数为零:"+e.getMessage()); } catch(Exception e) //若Exception的子类被捕获,则Exception不再会被捕获 { System.out.println("捕获了异常:"+e.getMessage()); } finally { System.out.println("进入Finally语句块"); } } }

Python中异常(Exception)的总结

Python中异常(Exception)的总结

Python中异常(Exception)的总结Python中的异常处理异常处理的语句结构try:<statements> #运⾏try语句块,并试图捕获异常except <name1>:<statements> #如果name1异常发现,那么执⾏该语句块。

except (name2, name3):<statements> #如果元组内的任意异常发⽣,那么捕获它except <name4> as <variable>:<statements> #如果name4异常发⽣,那么进⼊该语句块,并把异常实例命名为variableexcept:<statements> #发⽣了以上所有列出的异常之外的异常else:<statements> #如果没有异常发⽣,那么执⾏该语句块finally:<statement> #⽆论是否有异常发⽣,均会执⾏该语句块。

说明else和finally是可选的,可能会有0个或多个except,但是,如果出现⼀个else的话,必须有⾄少⼀个except。

不管你如何指定异常,异常总是通过实例对象来识别,并且⼤多数时候在任意给定的时刻激活。

⼀旦异常在程序中某处由⼀条except ⼦句捕获,它就死掉了,除⾮由另⼀个raise语句或错误重新引发它。

raise语句raise语句⽤来⼿动抛出⼀个异常,有下⾯⼏种调⽤格式:raise #可以在raise语句之前创建该实例或者在raise语句中创建。

raise #Python会隐式地创建类的实例raise name(value) #抛出异常的同时,提供额外信息valueraise # 把最近⼀次产⽣的异常重新抛出来raise exception from E例如:抛出带有额外信息的ValueError: raise ValueError('we can only accept positive values')当使⽤from的时候,第⼆个表达式指定了另⼀个异常类或实例,它会附加到引发异常的__cause__属性。

异常处理

异常处理

三、抛出异常
前面只是说明了如何获取Java运 前面只是说明了如何获取Java运 Java 行时被系统引发的异常。同时, 行时被系统引发的异常。同时,程序 还可以用throw语句引发明确的异常, throw语句引发明确的异常 还可以用throw语句引发明确的异常, throws语句来标明一个成员函数可 用throws语句来标明一个成员函数可 能抛出的各种异常。
Exception类的主要方法
1.public Exception() 2.public Exception(String s) 3.public String toString()//返回异常类的信息 4.public void printStackTrace()//打印输出当前 例外对象的堆栈使用轨迹,也就是程序先后 调用执行了哪些对象或类的哪些方法,使得 运行过程中产生了这个例外对象。
四、自定义异常
尽管Java的内置异常处理大多数常见错误 尽管Java的内置异常处理大多数常见错误,你 Java的内置异常处理大多数常见错误, 也许希望创建自己的异常类型来处理所应用的特 殊情况。做到这点非常简单:只要定义 Exception的一个子类就可以了 Exception当然 的一个子类就可以了( Exception 的一个子类就可以了 ( Exception 当然 Throwable的一个子类 的一个子类) 是 Throwable 的一个子类 ) 。 你的子类不需要实 际执行什么——它们在类型系统中的存在允许你 际执行什么 它们在类型系统中的存在允许你 把它们当成异常使用。 把它们当成异常使用。 Exception类自己没有定义任何方法。当然, Exception类自己没有定义任何方法。当然, 类自己没有定义任何方法 它继承了Throwable提供的一些方法。 Throwable提供的一些方法 它继承了Throwable提供的一些方法。因此所有 异常,包括你创建的,都可以获得Throwable Throwable定 异常,包括你创建的,都可以获得Throwable定 义的方法, 义的方法,
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
异常(Exception)处理 第七章 异常(Exception)处理
异常
运行期出现的错误 运行期
代码
public class HelloWorld { public static void main (String args[]) { int i = 0; String greetings [] = { "Hello!","No","WORLD!"}; while (i < 4) { System.out.println (greetings[i]); i++; } } }
:go()和main() – 在go方法中声明要抛出异常,在该方法体内, 抛出一个Exception对象 – 在main()方法中,调用go方法,使用try/catch 捕获go方法中抛出的异常
用户自定义异常对象
系统预定义异常类代表了程序运行过程中可能产生的绝大 多数异常。如果希望记录和应用相关的错误信息,则可创 建自己的异常类。该类的定义和普通类无太大区别,只需 继承Exception类或RuntimeException类即可。例如:
多重catch块
一段代码可能会引发多种类型的异常 当引发异常时,会按顺序来查看每个 catch 语句,并执行第一个与异常类型匹 配的catch语句 执行其中的一条 catch 语句之后,其后的 catch 语句将被忽略
抛出异常
如果在当前环境无法解决一个异常,就要 将其抛出,把异常交给调用者处理
练习
try 块 有异常 无异常 catch 块
finally 块
举例
public class HelloWorld2 { public static void main (String args[]) { int i = 0; String greetings [] = { "Hello world!", "No, I mean it!", "HELLO WORLD!!" }; while (i < 4) { try { System.out.println (greetings[i]); } catch (ArrayIndexOutOfBoundsException e){ System.out.println("Re-stting Index Value"); } finally { System.out.println("This is always printed"); } i++; } }}
关于异常的设计
异常处理不是用来代替测试程序 不要压制异常 抛出异常不是一件坏事
RuntimeException
FileNotFoundException
Exception
类 Exception 定义了一些你的程序可能出 现的轻度错误条件 异常可能发生在:
你试图打开的文件并不存在 网络连接中断 操作数处理的超出预描述的范围 需要加载的文件丢失
Error 类定义了一些严重的错误条件
public class Test{ public static void main(String[] args){ Test t=new Test(); try { t.connectMe("sinojava", 80); } catch (ServerTimedOutException e){ System.out.println("连接服务器 连接服务器"+e.getServerName()+",端口为 端口为"+e.getPort()+"失败 失败"); 连接服务器 端口为 失败 }} public void connectMe(String serverName,int port) throws ServerTimedOutException{ if(serverName.equals("sinojava")&&port==80){ System.out.println("连接成功 连接成功!"); 连接成功 }else throw new ServerTimedOutException("sinojava", port); } }
自定义异常举例: 自定义异常举例
public class ServerTimedOutException extends Exception{ private String serverName; private int port; public ServerTimedOutException(String serverName, int port){ this.serverName=serverName; this.port = port; } public int getPort(){ return port; } public void setPort(int port){ this.port = port; } public String getServerName(){ return serverName; } public void setServerName(String serverName){ this.serverName = serverName; }}
异常的执行流程
正常顺序 1,2,3,5 异常顺序 1,2,4,5 try块外异常不理会
异常发生处
try{ 1 2 3 } catch(Exception e){ 4 } 5
块后加入finally块,可以确保无论是否发生异常, 在try/catch块后加入 块后加入 块 可以确保无论是否发生异常, finally块中的代码总能被执行 块中的代码总能被执行
Java异常的使用 异常的使用
对非运行时异常必须捕获或声明。对运行时异常, 对非运行时异常必须捕获或声明。对运行时异常,若不能预测它 何时发生,程序可不作处理,而是交给Java运行时系统来处理; 运行时系统来处理; 何时发生,程序可不作处理,而是交给 运行时系统来处理 若能预知它可能发生的地点和时间,则应在程序中处理, 若能预知它可能发生的地点和时间,则应在程序中处理,而不应 简单地交给运行时系统。 简单地交给运行时系统。 异常可以人为地抛出, 语句。 异常可以人为地抛出,用throw new 语句。 异常可以是系统已经定义好的,也可以是用户自己定义的。 异常可以是系统已经定义好的,也可以是用户自己定义的。用户 自己定义的异常一定继承自Throwable或Exception类。 自己定义的异常一定继承自 或 类 在自定义异常类时, 在自定义异常类时,如果它所对应的异常事件通常总是在运行时 产生,而且不容易预测它将在何时何地发生, 产生,而且不容易预测它将在何时何地发生,可以将它定义为运 行时异常,否则应定义为非运行时异常。 行时异常,否则应定义为非运行时异常。 应该使用finally语句为异常处理提供统一的出口。 语句为异常处理提供统一的出口。 应该使用 语句为异常处理提供统一的出口
public class MyProjException extends Exception { …… }
自定义异常
通过继承ng.Exception类声明自己 的异常类。 在方法适当的位置生成自定义异常的实例, 并用throw抛出。 在方法的声明部分用throws声明该方法可 能抛出的异常。
异常处理机制
如果一个异常没有在当前的try、catch中 被处理,它将被抛至方法的调用者处。 如果异常被返回到main方法里,并且仍然 没有被处理,程序将异常中止。
练习
编写一个类ExceptionTest1,在main方法 中使用try、catch、finally:
– 在try块中,编写被0除的代码 – 在catch块中,捕获被0除所产生的异常,并且 处理异常 – 在finally块中,打印一条语句
异常处理的优点
把错误处理代码从常规代码中分离出来 按错误类型和差别分组 对无法预测的错误进行捕获和处理 克服了传统方法的错误信息有限的问题 把错误传播给调用堆栈
系统预定义异常对象
Throwable Exception Error VirtualMachineError IOException ArithmeticException NullPointerException ClassNotFoundException
手动抛出异常
声明方法可能要 抛出的各种异常
finally
无论是否发生异常, 无论是否发生异常, 代码总能执行
try,catch 语句的使用
try { //这里的代码可能抛出一个特别的异常 } catch (MyExceptionType e) { 如果MyExceptionType 的异常被抛出,将执 行这里的代码 } catch (Exception e) { 如果一个一般 Exception 被抛出时,将执行 这里的代码 }
正常与异常
正常与异常之比可达30% 比 70%
– 打开文件
文件不存在? 文件打不开?
– 读取文件
没有足够可读内容? 权限不允许读
– 写文件
磁盘满 网络断线
– 关闭文件
异常机制简介
在进行程序设计时,错误的产生是不可避免的, 如何处理错误?把错误交给谁去处理?程序又该 如何从错误中恢复?这是任何程序设计语言都要 解决的问题。 所谓错误,是在程序运行过程中发生的异常事件, 比如除0溢出、数组越界、文件找不到等,这些 事件的发生将阻碍程序的正常运行。为了增加程 序的强壮性,程序设计时,必须考虑到可能发生 的异常情况并做出相应的处理。
Java的异常处理是通过 个关键字来实现的:try、catch、 的异常处理是通过5个关键字来实现的 的异常处理是通过 个关键字来实现的: 、 、 finally、throw、throws 、 、
相关文档
最新文档