java异常处理课件

上传人:风*** 文档编号:241666699 上传时间:2024-07-14 格式:PPT 页数:103 大小:856.86KB
返回 下载 相关 举报
java异常处理课件_第1页
第1页 / 共103页
java异常处理课件_第2页
第2页 / 共103页
java异常处理课件_第3页
第3页 / 共103页
点击查看更多>>
资源描述
NCEPU异常机制异常机制14 七月七月 2024一二请在这里输入您的主要叙述内容整体概述三请在这里输入您的主要叙述内容请在这里输入您的主要叙述内容2一二请在这里输入您的主要叙述内容整体概述三请在这里输入您的主14 七月七月 2024NCEPU异常的概念v在进行程序设计时,错误的产生是不可避免的如何处理错误?把错误交给谁去处理?程序又该如何从错误中恢复?v这是任何程序设计语言都要解决的问题3NCEPU异常的概念在进行程序设计时,错误的产生是不可避免的14 七月七月 2024NCEPU所谓错误,是在程序运行过程中发生的异常事件,比如除0溢出、数组越界、文件找不到等,这些事件的发生将阻止程序的正常运行。为了加强程序的强壮性(robust),程序设计时,必须考虑到可能发生的异常事件并做出相应的处理。异常的概念4NCEPU所谓错误,是在程序运行过程中发生的异常事件,比如除14 七月七月 2024NCEPU openTheFile;determine its size;allocate that much memory;read-file closeTheFile;没有错误处理的程序5NCEPU没有错误处理的程序514 七月七月 2024NCEPUopenFiles;if(theFilesOpen)determine the length of the file;if(gotTheFileLength)allocate that much memory;if(gotEnoughMemory)read the file into memory;if(readFailed)errorCode=-1;else errorCode=-2;else errorCode=-3;else errorCode=-4;else errorCode=-5;以常规方法处理错误6NCEPUopenFiles;以常规方法处理错误614 七月七月 2024NCEPU程序可读性差,大量的错误处理代码混杂在程序中观察前面的程序,会发现大部分精力花在出错处理上只把能够想到的错误考虑到,此外的情况无法处理出错返回信息量太少,无法更确切的了解错误状况或原因以常规方法处理错误存在的问题7NCEPU以常规方法处理错误存在的问题714 七月七月 2024NCEPU 用异常的形式处理错误try openTheFile;determine its size;allocate that much memory;read-File;closeTheFile;catch(fileopenFailed)dosomething;catch(sizeDetermineFailed)dosomething;catch(memoryAllocateFailed)dosomething;catch(readFailed)dosomething;catch(fileCloseFailed)dosomething;finally dosomething;try里写我们尝试着要做的事情,每一个catch针对一种可能的错误每一个错误都有相应的处理办法,并且将实现功能(事务逻辑)与错误处理分开来8NCEPU 用异常的形式处理错误trytry里写我们尝试着要14 七月七月 2024NCEPUvJava异常是Java提供的用于处理程序中错误的一种机制。v所谓错误是指在程序运行过程中发生的一些异常事件(如:除0溢出,数组下标越界,所要读取的文件不存在)。v设计良好的程序应该在异常发生时提供处理这些错误的方法,使得程序不会因为异常的发生而阻断或产生不可预见的结果。Java的异常处理机制9NCEPUJava异常是Java提供的用于处理程序中错误的一14 七月七月 2024NCEPUvJava程序的执行过程中如出现异常事件,可以生成一个异常类对象,该异常对象封装了异常事件的信息并将被提交给Java运行时系统,这个过程称为抛出(throw)异常。v当Java运行时系统接收到异常对象时,会寻找处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获(catch)异常。Java的异常处理机制10NCEPUJava程序的执行过程中如出现异常事件,可以生成一14 七月七月 2024NCEPUCatch an exceptionvvJavaJava的异常机制的好处 使我们在一个地方将精力集中在要解决的问题上,而在另一个地方处理来自那部分代码的异常情况。try /Code that may make exception catch(Type1 id1)catch(Type1 id1)try openTheFile;determine its size;allocate that much memory;read-File;closeTheFile;catch(fileopenFailed)dosomething;catch(sizeDetermineFailed)dosomething;catch(memoryAllocateFailed)dosomething;catch(readFailed)dosomething;catch(fileCloseFailed)dosomething;finally dosomething;11NCEPUCatch an exceptionJava的异常14 七月七月 2024NCEPU如何处理 Throw an exception throw new NullPointerException();异常发生时,你不能解决问题,所以必须抛出一个异常(throw)一个异常对象建立起来了当前运行的路径被停止,异常对象被弹出异常处理机直接管,开始寻找一个合适的地方来继续执行12NCEPU如何处理 Throw an exception 14 七月七月 2024NCEPU把错误处理代码从常规代码中分离出来按错误类型分组(类Exception,派生)对无法预测的错误可以捕获和处理(基类,所有的异常类都是Exception类的子类)克服了传统方法错误信息有限的问题(getMessage)把错误传播给调用堆栈(比较:全局变量,返回值)异常机制的优点method1method2method3method4探测抛出异常传递捕获处理异常调用13NCEPU把错误处理代码从常规代码中分离出来异常机制的优点m14 七月七月 2024NCEPUe.printStackTace();14NCEPUe.printStackTace();1414 七月七月 2024NCEPU在异常被抛出的过程中,任何方法都可以捕获异常并进行相应的处理。15NCEPU在异常被抛出的过程中,任何方法都可以捕获异常并进14 七月七月 2024NCEPU如果所有的方法都选择了抛出此异常,最后 JVM将捕获它,输出相关的错误信息,并终止程序的运行。16NCEPU如果所有的方法都选择了抛出此异常,最后 JVM将14 七月七月 2024NCEPUJava通过面向对象的方法来处理程序错误,在Java中,错误被称为异常(Exception)(例外)Java 处理错误的方法在一个方法的运行过程中,如果发生了异常,则这个方法(或者是Java虚拟机)生成一个代表该异常的对象(包含了该异常的详细信息),并把它交给运行时系统,运行时系统寻找相应的代码来处理这一异常。17NCEPU Java通过面向对象的方法来处理程序错误,在14 七月七月 2024NCEPUJava 处理错误的方法我们把生成异常对象并把它提交给运行时系统的过程称为抛出(throw)一个异常。运行时系统在方法的调用栈中查找,从生成异常的方法开始进行回朔,直到找到包含相应异常处理的方法为止,这一个过程称为捕获(catch)一个异常。18NCEPUJava 处理错误的方法 我们把生成异常对象14 七月七月 2024NCEPUn当方法因为自身无法控制的原因而不能完成其任务n文件不存在,网络连接无法建立n处理在方法、类库、类中抛出的异常n如FileInputStream.read产生IOExceptionn在大的项目中采用统一的方式处理异常时n如编写一个文字处理器n异常应该是不经常发生但却可能发生的故障n一定发生的事件不应该用例外机制来处理n异常处理用于使系统从故障中恢复n提示信息/不产生无效的结果/释放资源什么情况下使用异常机制19NCEPU什么情况下使用异常机制1914 七月七月 2024NCEPUn终止程序会导致资源泄漏,利用异常处理释放资源n尽可能近地处理异常,这样程序清晰易读n能在局部处理的错误不要使用异常机制n异常机制的处理比正常处理效率低处理异常时的注意事项20NCEPU终止程序会导致资源泄漏,利用异常处理释放资源处理异14 七月七月 2024NCEPUContents1.异常处理2.异常分类3.抛出异常4.创建异常类21NCEPUContents1.异常处理2.异常分类3.抛出异14 七月七月 2024NCEPU1 错误与异常 v在程序运行时,经常会出现一些非正常的现象,如死循环、非正常退出等,称为运行错误。v根据错误的性质将运行错误分成两类:错误和异常。22NCEPU1 错误与异常 在程序运行时,经常会出现一些14 七月七月 2024NCEPU1 错误与异常 一、错误v错误是致命性的,即程序遇到了非常严重的不正常状态,不能简单地恢复执行。v例如:程序进入了死循环,或递归无法结束、或内存溢出。v错误只能在编程阶段解决,运行程序本身无法解决,只能依靠其他程序干预,否则会一直处于非正常状态。23NCEPU1 错误与异常 一、错误2314 七月七月 2024NCEPU1 错误与异常 二、异常v异常是非致命性的,通过某种修正后,程序还能继续执行。v例如:运算时除数为0,或操作数超出数据范围,或打开一个文件时发现文件并不存在,或欲装入的类文件丢失,或网络连接中断等等。v在源程序中加入处理异常的代码,当程序运行中出现异常时,由异常处理代码调整程序运行方向,使程序仍然可以继续运行直至正常结束。致命性的、程序自身无法解决的严重的运行错误,叫作错误;例如死循环、内存溢出,等非致命性的,可以由程序中的异常处理代码解决,程序还能继续正常运行的运行错误,叫作异常。例如数组下标越界、除数为0,等。24NCEPU1 错误与异常 二、异常致命性的、程序自身无14 七月七月 2024NCEPU1 错误与异常 vJava通过错误类(Error)和异常类(Exception)来处理错误和异常,它们都实现了Throwable接口。ObjectThrowableError错误类Exception异常类异常类Exception:当发生异常时,产生一个异常事件,生成一个异常对象(Exception类或其子类对象),并把它提交给运行系统,再由运行系统寻找相应的代码来处理异常。这个过程称为抛出一个异常。异常类Exception:Exception类有各种不同的子类,分别对应不同类型的异常,如除数为0的算术异常,数组下标越界异常,空指针异常等。异常类Exception:一个异常对象可以由Java虚拟机生成,也可以由运行的方法生成。异常对象中包含了异常事件类型、程序运行状态等必要的信息。异常类Exception:异常被抛出后,运行时系统把从生成对象的代码开始,沿着方法的调用栈逐层回溯查找,直到找到相应的处理方法,并把异常对象交给该方法为止.这个过程叫作捕获一个异常。简单地说:发现异常的代码可以“抛出”一个异常,运行系统“捕获”该异常,交由程序员编写的相应代码进行异常处理。错误类Error:(代表编译期和系统错误)Error类对象由Java虚拟机生成并抛出给系统,一般不由程序处理。死循环、递归无法结束、动态链接错误等。通常只能依靠其他程序干预,否则会一直处于非正常状态。25NCEPU1 错误与异常 Java通过错误类(Erro14 七月七月 2024NCEPU1 1 异常处理 一、异常的产生public class HelloWorld public static void main(String args)int i=0;String greetings =Hello world!,No,I mean it!,HELLO WORLD!;while(i 4)System.out.println(greetings i );i+;greetings0=Hello world!“greetings1=No,I mean it!greetings2=HELLO WORLD!i=0时,输出greetings0:Hello world!i=1时,输出greetings1:No,I mean it!i=2时,输出greetings1:HELLO WORLD!i=3时,数组下标越界,此时系统报告异常对象类型:Exception in thread main java.lang.ArrayIndexOutOfBoundsException:3at HelloWorld.main(HelloWorld.java:9)异常对象类型:数组越界异常类 第几个数组下标越界 发生异常的方法 发生异常的类 发生异常的行26NCEPU1 异常处理 一、异常的产生public c14 七月七月 2024NCEPU2 2 异常处理 一、异常的产生public class Try1 public static void main(String args)int i=0;int a =5,6,7,8;/简单类型不new也行for(;i 5;i+)System.out.println(a+i+=+a i );System.out.println(3/0=+(3/0);i=0时,输出:a 0 =5i=1时,输出:a 1 =6i=2时,输出:a 2 =7i=3时,输出:a 3 =8i=4时,数组下标越界,此时系统报告异常对象类型:Exception in thread main java.lang.ArrayIndexOutOfBoundsException:4at Try1.main(Try1.java:6)此时终止程序运行,因此不会执行同样会产生异常的输出语句:27NCEPU2 异常处理 一、异常的产生public c14 七月七月 2024NCEPU2 2 异常处理 一、异常的产生public class Try1 public static void main(String args)int i=0;int a =5,6,7,8;for(;i 4;i+)System.out.println(a+i+=+a i );System.out.println(3/0=+(3/0);3/0时,产生算术异常,此时系统报告异常对象类型:Exception in thread main java.lang.ArithmeticExce-ption:/by zeroat Try1.main(Try1.java:9)算术异常,由分母为0产生28NCEPU2 异常处理 一、异常的产生public c14 七月七月 2024异常处理机制 捕获异常声明抛出异常throwsTry-catch消极的处理方式积极的处理方式29异常处理机制 捕获异常声明抛出异常throwsTry-cat14 七月七月 2024NCEPU2 异常处理 v一般来说,系统捕获抛出的异常对象并输出相应的信息,同时终止程序运行,导致其后的程序无法运行。v人们总是期望可以让程序来接收并处理产生的异常对象,从而使程序可以正常地往下继续执行。这就是异常捕获和处理的意义所在。二、异常的捕获和处理30NCEPU2 异常处理 二、异常的捕获和处理3014 七月七月 2024NCEPUn捕获异常:try,catch和finally语句。n n使用使用trytry语句括住可能抛出异常的代码段,用语句括住可能抛出异常的代码段,用 catchcatch语语句指明要捕获的异常及相应的处理代码。句指明要捕获的异常及相应的处理代码。n ntrytry与与catchcatch语句的语法格式如下:语句的语法格式如下:n ntry try /此处为抛出具体异常的代码此处为抛出具体异常的代码 2 异常处理 31NCEPU捕获异常:try,catch和finally语句14 七月七月 2024NCEPU2 异常处理 v在Java的异常处理机制中,提供了try catch finally语句来捕获和处理一个或多个异常。v-语法格式为二、异常的捕获和处理可能产生异常的代码(保护代码)捕获某种异常对象进行处理的代码必然要执行的代码 try catch(ExceptionType e)finally catch语句至少有一个,可以有多个finally语句可以省略try-catch-finallytry-catch-finally语句的作用:语句的作用:当当trytry语句中的代码产生异常语句中的代码产生异常时,根据异常的不同,时,根据异常的不同,由不由不同的同的catchcatch语句中的代码对语句中的代码对异常进行捕获并处理异常进行捕获并处理(若没(若没有产生异常,则有产生异常,则catchcatch语句语句不执行不执行);而无论是否捕获到而无论是否捕获到异常,都必须执行异常,都必须执行finallyfinally语语句中的代码句中的代码32NCEPU2 异常处理 二、异常的捕获和处理可能产生异14 七月七月 2024NCEPU2 异常处理 33NCEPU2 异常处理 3314 七月七月 2024NCEPUpublic class SystemException public static void main(String args)int a=68;int b=0;try System.out.println(a/b);catch(ArithmeticException e)System.out.println(“0用作了除数”);System.out.println(“getMessage=”+e.getMessage()System.out.println(“程序结束”);这句能执行么?34NCEPUpublic class SystemExcept14 七月七月 2024NCEPUfinally语句v当一个异常被抛出时,程序的执行就不再是线性的,跳过某些行,甚至会由于没有与之匹配的catch子句而过早地返回。v利用finally子句可以保证,无论try程序块中是否抛出异常,finally程序块中的语句都会被执行到,这样可以对程序的状态作统一的管理。finally语句对增强程序的强壮性非常重要。通常finally进行资源的清除工作:比如删除临时文件,关闭打开的文件等35NCEPUfinally语句当一个异常被抛出时,程序的执行就14 七月七月 2024NCEPU在前例中应用finally语句public class SystemException public static void main(String args)int a=68;int b=0;try System.out.println(a/b);catch(ArithmeticException e)System.out.println(“0用作了除数”);System.out.println(“getMessage=”+e.getMessage()finally System.out.println(“程序结束”);36NCEPU在前例中应用finally语句public cla14 七月七月 2024NCEPU多个catch语句class ExceptionDemo2 public static void main(String args)try int a=args.length;System.out.println(a=+a);int b=42/a;int c=1;c4=99;catch(ArithmeticException e)/捕获算术运算异常 System.out.println(Divide by 0:+e);catch(ArrayIndexOutOfBoundsException e)System.out.println(Array index oob:+e);System.out.println(After try/catch blocks.);37NCEPU多个catch语句class ExceptionD14 七月七月 2024NCEPU2 异常处理 二、异常的捕获和处理v改写前面的示例public class HelloWorldpublic class HelloWorld public static void main(String args)int i=0;String greetings =Hello world!,No,I mean it!,HELLO WORLD!;while(i 4)System.out.println(greetings i);i+;public class HelloWorld 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-setting Index Value);i=-1;catch(Exception e)System.out.println(e.toString();finally System.out.println(Always printed);i+;greetings0=Hello world!“greetings1=No,I mean it!greetings2=HELLO WORLD!i=0 时:输出greetings0i=0 时:然后执行finally语句Hello world!i=0 时:然后 i+Hello world!Always printed38NCEPU2 异常处理 二、异常的捕获和处理publi14 七月七月 2024NCEPU2 2 异常处理 二、异常的捕获和处理public class HelloWorld 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-setting Index Value);i=-1;catch(Exception e)System.out.println(e.toString();finally System.out.println(Always printed);i+;greetings0=Hello world!greetings1=No,I mean it!greetings2=HELLO WORLD!i=1 时:继续循环i=1 时:输出greetings1Hello world!Always printedi=1 时:然后执行finally语句Hello world!Always printedNo,I mean it!i=1 时:然后 i+Hello world!Always printedNo,I mean it!Always printed39NCEPU2 异常处理 二、异常的捕获和处理publi14 七月七月 2024NCEPU2 2 异常处理 二、异常的捕获和处理public class HelloWorld 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-setting Index Value);i=-1;catch(Exception e)System.out.println(e.toString();finally System.out.println(Always printed);i+;greetings0=Hello world!“greetings1=No,I mean it!greetings2=HELLO WORLD!i=2 时:继续循环i=2 时:输出greetings2i=2 时:然后执行finally语句i=2 时:然后 i+Hello world!Always printedNo,I mean it!Always printedHello world!Always printedNo,I mean it!Always printedHELLO WORLD!Hello world!Always printedNo,I mean it!Always printedHELLO WORLD!Always printed40NCEPU2 异常处理 二、异常的捕获和处理publi14 七月七月 2024NCEPU2 2 异常处理 二、异常的捕获和处理public class HelloWorld 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-setting Index Value);i=-1;catch(Exception e)System.out.println(e.toString();finally System.out.println(Always printed);i+;greetings0=Hello world!“greetings1=No,I mean it!greetings2=HELLO WORLD!i=3 时:继续循环Always printedi=3 时:抛出ArrayIndexOutOfBoundsException类异常对象i=3 时:执行catch(ArrayIndexOutOfBoundsException e)i=3 时:i=-1i=3 时:然后执行finally语句i=3 时:然后 i+Always printedRe-setting Index Va-lueAlways printedRe-setting Index Va-lueAlways printed41NCEPU2 异常处理 二、异常的捕获和处理publi14 七月七月 2024NCEPU2 2 异常处理 二、异常的捕获和处理public class HelloWorld 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-setting Index Value);i=-1;catch(Exception e)System.out.println(e.toString();finally System.out.println(Always printed);i+;greetings0=Hello world!“greetings1=No,I mean it!greetings2=HELLO WORLD!i=0 时:继续循环(陷入死循环)i=3 时:结束本次循环时i=4Always printedRe-setting Index Va-lueAlways printedAlways printedRe-setting Index Va-lueAlways printed42NCEPU2 异常处理 二、异常的捕获和处理publi14 七月七月 2024NCEPU2 2 异常处理 二、异常的捕获和处理public class HelloWorld public static void main(String args)int i=0;String greetings =Hello world!,No,I mean it!,HELLO WORLD!;while(i 4)try i=5/0;catch(ArrayIndexOutOfBoundsException e)System.out.println(Re-setting Index Value);i=-1;catch(Exception e)System.out.println(e.toString();finally System.out.println(Always printed);i+;此时捕获的是一个算术异常ArithmeticException对象catch(Exception e)将捕获所有异常的超类对象e.toString()将返回对象e的内容字符串(Object类中方法)输出为:java.lang.ArithmeticException:/by zero43NCEPU2 异常处理 二、异常的捕获和处理publi14 七月七月 2024NCEPU2 2 异常处理 二、异常的捕获和处理public class HelloWorld 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-setting Index Value);i=-1;catch(Exception e)System.out.println(e.toString();finally System.out.println(Always printed);i+;此时捕获的是ArrayIndexOutOfBoundsException对象将被 catch(ArrayIndexOutOfBoundsException e)捕获因此不会再被 catch(Exception e)捕获44NCEPU2 异常处理 二、异常的捕获和处理publi14 七月七月 2024NCEPU2 2 异常处理 二、异常的捕获和处理public class HelloWorld 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+5/0);catch(ArrayIndexOutOfBoundsException e)System.out.println(Re-setting Index Value);i=-1;catch(Exception e)System.out.println(e.toString();finally System.out.println(Always printed);i+;i=0时,捕获的是ArithmeticException类异常对象java.lang.ArithmeticException:/by zerojava.lang.ArithmeticException:/by zeroAlways printedi=1和2:捕获的都是ArithmeticException类异常对象i=3:捕获ArrayIndexOutOfBoundsException类异常对象45NCEPU2 异常处理 二、异常的捕获和处理publi14 七月七月 2024NCEPU2 2 异常处理 二、异常的捕获和处理public class HelloWorld 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+5/0);catch(ArrayIndexOutOfBoundsException e)System.out.println(Re-setting Index Value);i=-1;catch(Exception e)System.out.println(e.toString();finally System.out.println(Always printed);i+;java.lang.ArithmeticException:/by zeroAlways printedi=3:捕获ArrayIndexOutOfBoundsException类异常对象 Always printedRe-setting Index ValueRe-setting Index ValueAlways printed46NCEPU2 异常处理 二、异常的捕获和处理publi14 七月七月 2024NCEPU2 2 异常处理 二、异常的捕获和处理public class HelloWorld 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(5/0+greetings i);catch(ArrayIndexOutOfBoundsException e)System.out.println(Re-setting Index Value);i=-1;catch(Exception e)System.out.println(e.toString();finally System.out.println(Always printed);i+;47NCEPU2 异常处理 二、异常的捕获和处理publi14 七月七月 2024NCEPU2 2 异常处理 二、异常的捕获和处理public class HelloWorld 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(5/0+greetings i);catch(Exception e)System.out.println(e.toString();i=-1;catch(ArrayIndexOutOfBoundsException e)System.out.println(Re-setting Index Value);finally System.out.println(Always printed);i+;catch 语句的排列顺序是从特殊到一般exception java.lang.ArrayIndexOutOfBounds-Exception has already been caughtcatch(Exception e)放在捕捉其他具体异常类的语句后48NCEPU2 异常处理 二、异常的捕获和处理publi14 七月七月 2024NCEPU练习v设下列try-catch语句块中的第二个语句s2将引起一个异常,试回答下列问题:try s1;s2;s3;catch(ExceptionType e1)dosomething;catch(ExceptionType e2)dosomething;s4;(1)S3会执行么?(2)如果异常未被捕获,s4会被执行么?(3)如果catch子句捕获了异常,s4会执行么?49NCEPU练习设下列try-catch语句块中的第二个语句s14 七月七月 2024NCEPU捕获和处理异常vExceptionType1,ExceptionType2,.,ExceptionTypek是产生的异常类型。v根据发生异常所属的类,找到对应的catch语句,然后执行其后的语句序列。v不论是否捕获到,总要执行finally后面的语句。v在有多个异常需要捕获时,异常类型的顺序很重要,在类层次树中,一般的异常类型要放在后面,特殊的放在前面。v在catch块的后面可以放 finally 块,其作用通常用于释放资源50NCEPU捕获和处理异常ExceptionType1,Exc14 七月七月 2024异常类(Exception)的常用方法类的全名+:+Messagethrow new Exception(“下标越界”)51异常类(Exception)的常用方法类的全名+:+14 七月七月 2024NCEPU例:public class CS public static void main(String args)try System.out.println(第一句);System.out.println(“第二句 5/0=+(5/0);System.out.println(第三句);catch(ArithmeticException e)/ArrayIndexOutOfBoundsException e.printStackTrace();System.out.println(捕获+e.toString()+异常+e.getMessage();System.out.println(第四句);52NCEPU例:public class CS 5214 七月七月 2024NCEPU 3 异常分类vJ2SDK定义了很多异常类,这些类对应了各种各样可能出现的异常事件。ThrowableEorrorExceptionRuntimeException53NCEPU 3 异常分类J2SDK定义了很多异常类,这些14 七月七月 2024NCEPUvError:称为错误,由Java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,程序对其不做处理。(也处理不了)vException:所有异常类的父类,其子类对应了各种各样可能出现的异常事件,一般需要用户显式的声明或捕获。vRuntime Exception:一类特殊的异常,如被0除、数据下标越界等,其产生比较频繁,处理麻烦,如果显式的声明或捕获将会对程序可读性和运行效率影响很大。因此由系统自动检测并将它们交给缺省的异常处理程序(用户可不必对其处理)。3 异常分类54NCEPUError:称为错误,由Java虚拟机生成并抛出,14 七月七月 2024NCEPU 3 异常分类v所有的包中都定义了异常类和错误类。vException类是所有异常的父类vError类是所有错误的父类,这两个类都实现了Throwable接口。55NCEPU 3 异常分类所有的包中都定义了异常类和错误类14 七月七月 2024NCEPU3 3 异常分类 ThrowableErrorException虚拟机错误内存溢出错误图形界面错误内存溢出错误栈溢出错误类定义未找到错误56NCEPU3 异常分类 ThrowableErrorE14 七月七月 2024NCEPU3 3 异常分类 ThrowableErrorExceptionRuntimeException运行时异常文件已结束异常文件未找到异常方法未找到异常输入输出异常图形界面异常57NCEPU3 异常分类 ThrowableErrorE14 七月七月 2024NCEPU3 3 异常分类 ThrowableErrorExceptionRuntimeException运行时异常算术异常类型强制转换异常方法未找到异常输入输出异常图形界面异常空指针异常数组负下标异常违背安全原则异常数组下标越界异常下标越界异常IndexOutOfBoundsExceptioncatch(ArrayIndexOutOfBoundsException e)catch(IndexOutOfBoundsException e)catch(RuntimeException e)catch(Exception e)catch(Throwable e)58NCEPU3 异常分类 ThrowableErrorE14 七月七月 2024NCEPU3 异常分类v算术异常ArithmeticException整数除法中,若除数为0,或用0取模,会发生该异常。例如:int i=12/0;int m=5%0;其他算术操作不会产生异常几个常见的公用异常类59NCEPU3 异常分类 几个常见的公用异常类5914 七月七月 2024NCEPU3 异常分类v空指针异常NullPointerException当程序试图访问一个空对象(即没有实例化的对象)中的变量或方法,或一个空数组中的元素时,会发生该异常。例如:int a =null;a 0 =0;String s=null;System.out.println(s.length();几个常见的公用异常类60NCEPU3 异常分类几个常见的公用异常类6014 七月七月 2024NCEPU3 异常分类v类型强制转换异常ClassCastException当进行类型强制转换时,对于不能进行的转换操作,会发生该异常。例如:Object obj=new Object();String s=(String)obj;几个常见的公用异常类61NCEPU3 异常分类几个常见的公用异常类6114 七月七月 2024NCEPU3 异常分类v数组负下标异常NagativeArraySizeException创建数组时,若数组元素个数为负,会发生该异常。例如:int a =new int -3;几个常见的公用异常类62NCEPU3 异常分类几个常见的公用异常类6214 七月七月 2024NCEPU3 异常分类v数组下标越界异常ArrayIndexOutOfBoundsException试图访问一个越界的数组元素时(即下标大于等于数组的成员变量length),会发生该异常。例如:int a =new int 1;a 1 =3;几个常见的公用异常类63NCEPU3 异常分类几个常见的公用异常类6314 七月七月 2024NCEPU3 异常分类vArithmeticExceptionvNullPointerExceptionvClassCastExceptionvNagativeArraySizeExceptionvArrayIndexOutOfBoundsException都是运行时异常类(RuntimeException)的子类几个常见的公用异常类64NCEPU3 异常分类几个常见的公用异常类6414 七月七月 2024NCEPU异常的分类v程序对错误与异常的三种处理方式:(1)程序不能处理的错误 Error类错误一般由系统进行处理,程序本身无法捕获和处理。(2)程序应去避免而不是去捕获的异常 对于运行时异常类如数租越界等,在程序设计正常时不会发生。这类异常应通过程序调试尽量避免而不是去捕获它。(3)必须捕获的异常 有些异常在编写程序时是无法预料的,为了保证程序的健壮性,Java要求必须对可能出现这些异常的代码用try-catch-finally语句,否则编译无法通过。文件没找到、网络通信失败异常等65NCEPU异常的分类程序对错误与异常的三种处理方式:文件没找14 七月七月 2024NCEPU前面所提到的异常或者是由Java虚拟机生成,或者是由Java类库中的某些类生成。事实上,我们在程序中也可以生成自己的异常对象,也即是异常可以不是出错产生,而是人为地抛出。不论哪种方式,生成异常对象都是通过throw语句实现:throw new ThrowableObject();ArithmeticException e=new ArithmeticException();throw e;注意:生成的异常对象须是Throwable或其子类的实例。4 抛出异常66NCEPU 前面所提到的异常或者是由Java虚拟机14 七月七月 2024NCEPU4 抛出异常v如前所见,在捕获一个异常前,必须有一段代码产生一个异常对象,并把它抛出v抛出的异常既可以是Java运行时系统(如前面的例子)也可以是由程序员自己编写的代码(即在try语句中的代码本身不会由系统产生异常,而是由程序员故意抛出异常)67NCEPU4 抛出异常如前所见,在捕获一个异常前,必须14 七月七月 2024NCEPU4 抛出异常v注意:若某个代码使用throw语句抛出了异常,则必须使用try-catch语句进行捕捉处理,否则会出现编译错误,系统显示要求进行异常捕获的信息。1.使用throw语句抛出异常68NCEPU4 抛出异常1.使用throw语句抛出异常614 七月七月 2024NCEPU4 4 抛出异常v使用throw语句抛出异常的格式为throw 其中:throw 是关键字 是创建的异常类对象1.使用throw语句抛出异常class ExceptionTry public void run(byte k)byte y=1,i;for(i=1;i=k;i+)y=(byte)(y*i);System.out.println(k+!=+y);public static void main(String args)ExceptionTry et=new ExceptionTry();for(byte i=1;i 8;i+)et.run(i);到底哪些结果是错误的,从什么时候开始溢出的,在编程时不能确定,必须在程序中增加检测手段数据溢出(byte型只有8位:-127128)1!=12!=23!=64!=245!=1206!=-487!=-8069NCEPU4 抛出异常1.使用throw语句抛出异常c14 七月七月 2024NCEPU4 4 抛出异常class ExceptionTry public void run(byte k)byte y=1,i;for(i=1;i Byte.MAX_VALUE/i)throw new Exception(overflow);else y=(byte)(y*i);catch(Exception e)System.out.println(e.getMessage();e.printStackTrace();/显示异常信息System.exit(0);System.out.println(k+!=+y);public static void main(String ar
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!