null异常异常异常的概念
异常的分类
捕获异常
声明异常
抛出异常
创造自己的异常
总结 异常的概念 异常的概念什么是异常?
异常实际上是程序中错误导致中断了正常的指令流的一种事件.
没有处理错误的程序:
read-file {
openTheFile;
determine its size;
allocate that much memory;
closeTheFile;
}异常的概念异常的概念以常规方法处理错误
openFiles;
if (theFilesOpen) {
determine the lenth of the file;
if (gotTheFileLength){
allocate that much memory;
if (gotEnoughMemory) {
read the file into memory;
if (readFailed) errorCode=-1;
else errorCode=1;
}else errorCode=-3;
}else errorCode=-5 ;
}else errorCode=-5; 异常的概念 异常的概念观察前面的程序你会发现大部分精力花在出错处理上了.
只把能够想到的错误考虑到,对以外的情况无法处理
程序可读性差
出错返回信息量太少
异常的概念 异常的概念用异常的形式处理错误
read-File;
{ try {
openTheFile;
determine its size;
allocate that much memory;
closeTheFile;
}catch(fileopenFailed) { dosomething; }
catch(sizeDetermineFailed) {dosomething;}
catch(memoryAllocateFailed){ dosomething;}
catch(readFailed){ dosomething;}
catch(fileCloseFailed) { dosomething; }
catch(Exception) {dosomething;} //其它未考虑到的错误
}异常的概念异常的概念和传统的方法比较异常的优点:
1.把错误代码从常规代码中分离出来
2. 把错误传播给调
用堆栈
3. 按错误类型和
错误差别分组
4. 系统提供了对于一些无法预测的错误的捕获和处理
5. 克服了传统方法的错误信息有限的问题null什么情况下使用例外机制?
当方法因为自身无法控制的原因而不能完成其任务
文件不存在,网络连接无法建立……
处理在方法、类库、类中抛出的例外
如FileInputStream.read产生IOException
在大的项目中采用统一的方式处理例外时
如编写一个文字处理器
例外应该是不经常发生但却可能发生的故障
一定发生的事件不应该用例外机制来处理
例外处理用于使系统从故障中恢复
提示信息/不产生无效的结果/释放资源异常的概念null不同的例外处理策略
关键性应用(处理所有例外)
实验软件(可以忽略许多例外)
处理例外时的注意事项
终止程序会导致资源泄漏,利用例外处理释放资源
尽可能近地处理例外,这样程序清晰易读
能在局部处理的错误不要使用例外机制
例外机制的处理比正常处理效率低异常的概念 异常的概念 异常的概念.class ExcepTest
{ public void main(String args[])
{ int b=0; int a;
try { a=5/b;}
catch(ArithmeticException e)
{ System.out.println(“divided by 0”);} }}try{ URL url=new
URL(http://www.hit.edu.cn/”,”hit.gif”);}
catch(MalformedURLException e)
{ badURL=true; repaint();}异常的分类异常的分类异常是一个对象,它继承自Throwable类,所有的Throwable类的子孙类所产生的对象都是例外.
Error:由Java虚拟机生成并抛出,Java程序不做处理.
Runtime Exception(被0除等系统错误,数组下标超范围):由系统检测, 用户的Java 程序可不做处理,系统将它们交给缺省的异常处理程序.
Exception(程序中的问题,可预知的): Java编译器要求Java程序必须捕获或声明所有的非运行时异常
throw:用户自己产生异常异常的分类异常的分类异常的分类异常的分类.ThrowableErrorExceptionRuntimeException缺省的异常
处理程序
由用户捕获或
声明并处理不做处理用户自己产生的异常要处理null例外的分类 一个例外是由一个对象来代
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
的,所有的例外都直接或间接地继承自Throwable类。
在Java类库的每个类包中都定义了例外类,这些例外类分成两大类:Error类及Exception类,后者是Java程序中需要大量处理的。
除了Java类库所定义的例外类之外,用户也可以通过继承已有的例外类来定义自己的例外类,并在程序中使用(利用throw产生,throws声明抛出,catch捕捉并处理)。null Error:由Java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,Java程序不做处理。
Runtime Exception:Java虚拟机在运行时生成的例外,如被0除等系统错误、数组下标超范围等,其产生比较频繁,处理麻烦,对程序可读性和运行效率影响太大。因此由系统检测, 用户可不做处理,系统将它们交给缺省的异常处理程序(当然,必要时,用户可对其处理)。
Exception:一般程序中可预知的问题,其产生的例外可能会带来意想不到的结果,因此Java编译器要求Java程序必须捕获或声明所有的非运行时异常。例外的分类null public static void main(String[] args) {
try {
testThrowable();
}
catch (Throwable t) {
System.err.println(t.toString());
System.err.println(t.getMessage());
System.err.println(t.getLocalizedMessage());
t.printStackTrace();
}
}
…
static void testThrowable() throws Throwable {
throw new Throwable("测试 Throwable 的用法。");
}
java.lang.Throwable: 测试 Throwable 的用法。
测试 Throwable 的用法。
测试 Throwable 的用法。
java.lang.Throwable: 测试 Throwable 的用法。
at test.Untitled1.testThrowable(Untitled1.java:137)
at test.Untitled1.main(Untitled1.java:79)null public static void main(String[] args) {
try {
testThrowable();
}
catch (Throwable t) {
System.err.println(t.toString());
System.err.println(t.getMessage());
System.err.println(t.getLocalizedMessage());
t.printStackTrace(System.err);
}
}
…
static void testThrowable() throws Throwable {
throw new Throwable();
}
java.lang.Throwable
null
null
java.lang.Throwable
at test.Untitled1.testThrowable(Untitled1.java:137)
at test.Untitled1.main(Untitled1.java:79)null 例外示例:
(1)编译时例外:在程序中必须对其进行处理,否则编译器会指出错误。
在使用能够产生异常的方法而没有捕获和处理,程序将不能通过编译。
(2)运行时例外:程序中可以不做处理,直接由运行时系统来处理。例外的分类捕获异常捕获异常捕获并处理异常
try {
//接受监视的程序块,在此区域内发生
//的异常,由catch中指定的程序处理;
}
// 不能有其它语句分隔
catch(要处理的异常种类和标识符) {
//处理异常;
}catch(要处理的异常种类和标识符) {
//处理异常;
}null捕获例外 try语句
捕获例外的第一步就是用try {…}语句指定了一段代码,该段代码就是一次捕获并处理例外的范围。在执行过程中,该段代码可能会产生并抛弃一个或多个例外,因此,它后面的catch语句进行捕获时也要做相应的处理。
如果没有例外产生,所有的catch代码段都被略过不执行。null捕获例外 catch语句
每个try语句必须伴随一个或多个catch语句,用于捕获try代码块所产生的例外并做相应的处理。 catch语句有一个形式参数,用于指明其所能捕获得例外类型,运行时系统通过参数值把被抛弃的例外对象传递给catch语句。
程序设计中要根据具体的情况来选择catch语句的例外处理类型,一般应该按照try代码块中例外可能产生的顺序及其真正类型进行捕获和处理,尽量避免选择最一般的类型作为catch语句中指定要捕获的类型。
当然也可以用一个catch语句处理多个例外类型,这时它的例外类型应该是这多个例外类型的父类,但这种方式使得在程序中不能确切判断例外的具体类型。null catch(Exception e)
捕获所有Exception
catch(Throwable t)
捕获Exception和Error例外总是由距离产生例外最近的匹配catch代码段处理
如果没有相应的例外处理,
则例外被交给上一层try代码段进行处理
例外处理的查找依据类型匹配原则顺序进行
第一个匹配的例外处理被执行,当例外处理执行完毕,程序接着最后一个catch代码段后的语句执行
例外处理的顺序影响到例外的处理
子类例外可被父类例外处理捕获
不要先捕获父类例外,再捕获子类例外
如果找不到相应的例外处理
非GUI程序将结束程序执行;
Applet或GUI程序则回复到事件处理状态捕获例外
—— catch语句null捕获例外
—— catch语句尽量避免用一般类型作为catch中指定要捕获的类型。
一般应该按照try代码块中例外可能产生的顺序及其真正类型进行捕获和处理,
在例外处理中无法访问try代码段中声明的变量
因为此时try代码段已经退出了,例外处理所需要的任何信息一般都应该通过例外对象来传递
在使用方法时尽量直接处理该方法可能产生的例外
这样你的程序就会更健壮
在使用库方法之前,应该先仔细阅读说明文档
那里会介绍方法可能产生的例外以及例外产生的条件
在使用各种例外类之前也应该先仔细阅读说明文档
那里会介绍例外的具体含义及例外产生的条件null在catch代码段中产生的例外不是由相同try的后续catch代码段处理,而是由包含整个try-catch结构的上层try代码段检测并处理
可以把catch到的例外对象再次抛出,使上层try-catch结构继续处理该例外事件;也可以把例外对象转换为其它例外对象…
catch (Exception e) { throw e; }
try-catch机制不该被用于
流程
快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计
控制,例外情形应该是很稀少的,而不是经常性的
在catch代码段中的return语句用于退出方法,而不是返回到例外抛出点(throw point)捕获例外
—— catch语句 捕获异常 捕获异常常见的异常
ArithmeticException //算术异常 比如被零除
ArrayIndexOutOfBoundsException
//数组下标越界
ArrayStoreException
//放入数组的类型不符
IOException//I/O异常
FileNotFoundException
//找不到文件异常
NullPointerException//空指针异常
MalformedURLException//url无法解析异常
NumberFormatException//字符串转换数值异常如果在使用能够产生异常的方法而没有捕获和处理,将不能通过编译
捕获异常 捕获异常例:编写Java程序,包含三种异常
算术异常, 字符串越界,数组越界
观察输出信息:
每个异常对象可以直接给出信息
捕获异常捕获异常class first_exception
{ public static void main(String args[])
{ char c; int a,b=0;int[] array=new int[7];
String s="Hello"; try {a=1/b;}
catch(ArithmeticException ae)
{ System.out.println(“Catch “+ae));}try {array[8]=0;}
catch(ArrayIndexOutOfBoundsException ai)
{ System.out.println((“Catch “+ai);} try{ c=s.charAt(8));}
catch(StringIndexOutOfBoundsException se)
{ System.out.println((“Catch “+se);}}} 捕获异常 捕获异常一定会执行的程序块---finally
异常处理的统一出口
try {
//常规的代码;
}
catch()
{ //处理异常 }
finally {
//不论发生什么异常(或者不发生任何异常),都要执行的部分;
}null捕获例外 finally语句
捕获例外的最后一步是通过finally语句为例外处理提供一个统一的出口,使得在控制流程转到程序的其他部分以前,能够对程序的状态作统一的管理。
无论try所指定的程序块中是否抛出例外,也无论catch语句的例外类型是否与所抛弃的例外的类型一致,finally所指定的代码都要被执行,它提供了统一的出口。(finally语句与switch中的default语句是不同的!)
通常在finally语句中可以进行资源的清除工作,如关闭打开的文件、删除临时文件等。 声明异常 声明异常一个方法不处理它产生的异常,而是沿着调用层次向上传递,由调用它的方法来处理这些异常,叫声明异常.
声明异常的方法
在产生异常的方法名后面加上要抛出(throws)的异常的列表
void compute(int x)throws ArithmeticException {…}
returnType methodName([parameterlist]) throws exceptionList 声明异常 声明异常例:若因某种原因不想在创建URL的方法中处理异常
public method1()
{ int x;
try { x=System.in.read();
compute(x);}
catch(IOException ioe)
{ System.out.println(“read error”); }
catch(ArithmeticException e)
{ System.out.println(“devided by 0”); }
}public int compute(int x) throws
ArithmeticException e)
{ return z=100/x;}声明异常声明异常 声明异常 声明异常例:说出程序执行结果
public class exception1
{
void Proc(int sel) throws
ArithmeticException,
ArrayIndexOutOfBoundsException
{ System.out.println(“In Situation" + sel );
if (sel==0) {
System.out.println("no Exception caught");
return;
}else if(sel==1) {int iArray[]=new int[5];
iArray[10]=3;
}
} 声明异常声明异常public static void main(String args[])
{ try { Proc(0);
Proc(1);
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("Catch"+e);
}
} c:>java throwsException
In Situation 0
no Exception caught
In Situation 1
Catch java.lang.ArrayIndexOutOfBoundsException:10 抛出异常 抛出异常抛弃异常: 不是出错产生,而是人为地抛出
throw ThrowableObject;
throw new ArithmeticException();
例:编写程序人为抛出(JavaThrow.prj)
ArithmeticException,
ArrayIndexOutOfBoundsException
StringIndexOutOfBoundsExceptionA methodExceptionAnother methodthrowcaught 抛出异常 抛出异常class JavaThrow
{ public static void main(String args[])
{try{ throw new ArithmeticException();}
catch(ArithmeticException ae)
{ System.out.println(ae); }try{ throw new
ArrayIndexOutOfBoundsException();}
catch(ArrayIndexOutOfBoundsException ai)
{ System.out.println(ai); }
try { throw new
StringIndexOutOfBoundsException();}
catch(StringIndexOutOfBoundsException si){
{ System.out.println(si); }null任何从Throwable派生的类对象都可以用throw语句抛出,抛出例外用来表明程序遇到的错误无法正常执行而需要例外处理
throw new MyException(“some infomation”);
例外可以由try代码段中的语句抛出
也可以从被try代码段中调用的方法中抛出
例外还可能产生于数组下标越界以及Java虚拟机内部错误等
Exception和Error是Throwable的直接派生类
Exception,程序应该处理的例外
Error代表系统严重错误,一般程序不处理这类错误
例外抛出点后的代码在抛出例外后不再执行
也可以说例外的抛出终止了代码段的执行抛出例外(throw语句) 创造自己的异常 创造自己的异常不是由Java系统监测到的异常(下标越界,被0-除等),而是由用户自己定义的异常.
用户定义的异常同样要用try--catch捕获,但必须由用户自己抛出 throw new MyException.
异常是一个类,用户定义的异常必须继承自Throwable或Exception类,建议用Exception类.
创造自己的异常 创造自己的异常形如:
class MyException extends Exception
{….};
例1 :计算两个数之和,当任意一个数超出范围时,抛出自己的异常
public class NumberRangeException extends Exception
{ public NumberRangeException(String msg)
{ super(msg); }
}nullpublic int CalcAnswer(String str1, String str2) throws NumberRangeException
{
int int1, int2;
int answer = -1;
try
{
int1 = Integer.parseInt(str1);
int2 = Integer.parseInt(str2);
if( (int1 < 10) || (int1 > 20)|| (int2 < 10) || (int2 > 20)))
{
NumberRangeException e = new NumberRangeException
("Numbers not within the specified range.");
throw e;
}
answer = int1 + int2;
}catch (NumberFormatException e){
System.out.println( e );
}
return answer;
}nullpublic void getAnswer()
{
String answerStr;
try
{
int answer = CalcAnswer(“12”, “5”);
answerStr = String.valueOf(answer);
}catch (NumberRangeException e){
answerStr = e.getMessage();
}
System.out.println(answerStr);
} 创造自己的异常 创造自己的异常例2 :在定义银行类时,若取钱数大于余额则作为异常处理(InsufficientFundsException).
思路:产生异常的条件是余额少于取额, 因此是否抛出异常要判断条件
取钱是withdrawal方法中定义的动作,因此在该方法中产生异常.
处理异常安排在调用withdrawal的时候,因此withdrawal方法要声明异常,由上级方法调用
要定义好自己的异常类小结小结1.一般
格式
pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载
:正常程序和出错处理分离开来
try { Java statement;
}catch(ExceptionType1 ExceptionObject) {
Exception1 handling;
} catch(ExceptionType2 ExceptionObject) {
Exception2 handling;
}….
}finally {
final handling;
// (统一的出口,最终必定要执行)
}} 小结 小结2.把异常传播给堆栈,沿着被调用的顺序往前寻找,只要找到符合该异常种类彻底异常处理程序,就交给这部分程序去处理小结小结3.异常可以人为地抛出,用throw new 语句
5.异常可以是系统已经定义好的,也可以是用户自己定义的
5.用户自己定义的异常一定继承自Throwable或Exception类作业作业当用户输入“T”或“t”时,人为抛出一个自定义异常,处理 方式为打印出错信息