1、异常及其处理办法前言1.“未被检测到的错误将可能被忽略.”引自一家领先计算公司的技术文档2.“在真的开始编程时我才发现,它比预想的难多了.忽然我意识到:我生命中的大多数时间都要花在查找自己程序的错误上了.”MauricecWilkes 谁不希望自己一路顺风?谁不希望一夜间盖起高楼大厦,造出航天飞机?但幻想代替不了现实.最现实的做法是未雨绸缪,防患于未然.制定异常处理策略,应随机应变地解决各类问题。Java异常处理机制ThrowableError(unchecked)ExceptionIOException(checked)RuntimeException(unchecked)Throwable
2、类1.Throwable 类是 Java 语言中所有错误或异常的超类。2.在java程序设计语言中,异常对象都是派生于Throwable类的一个实例。3.如果java中内置的异常类不能满足需求,用户还可以创建自己的异常类。Error类Error类层次结构描述了java运行时系统的内部错误和资源耗尽错误。如果出现这样的内部错误,除了通知用户,并尽力使程序安全地终止外,再无能为力。不过这样的情况很少出现Exception类q Java程序设计的时候将Exception划分成两个分支:一支为曾经能够正确运行,而由于某些情况导致的异常属于IOException。另一支由程序错误导致的异常属于Runti
3、meException。IOException类包含以下情况:q试图在文件尾部后面读取数据。q试图打开一个错误格式的URLRuntimeException类包含下面情况:q错误的类型转换。q数组访问越界。q访问空指针。如果出现RuntimeException异常,就一定是你的问题以下为RuntimeException异常:qNullPointerException 空指针异常qIndexOutOfBoundsException 指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。qIllegalArgumentException 抛出的异常表明向方法传递了一个不合法或不正确的参数。
4、q更多RuntimeException异常查看API帮助文档抛出异常1.找到一个合适的异常类2.创建这个类的一个对象3.将对象抛出例如:String readData(InputStream input)throws IOException throw new IOException();抛出异常的格式1例如:public void doGet(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException 抛出异常的格式2捕获异常q 必须设置try/catch 语句块,try语句块的简单形
5、式如下:try code more code more code catch(ExceptionType e)handler for this type 如果try语句块中任何代码抛出一个在catch子句中指定的异常类,那么1.程序将跳过try语句块中的其余代码。2.程序将执行catch子句中的处理器代码。q演示代码:public void read(String fileName)try InputStream in=new FileInputStream(fileName);int b;while(b=in.readLine()!=-1)process input catch(IOExce
6、ption e)e.printStackTrace();捕获多个异常try code catch(exceptiontype e1)catch(exceptiontype e2)catch(exceptiontype e3)不论后面跟着多少个catch都一样,try-catch语句是这样执行的:首先逐个从上到下执 行try块中的java语句,如果没有发生异常,则执行完try块后跳过catch块(不论有多少个catch都跳过)。如果try块中某条语句存在异 常,则跳到相对应的catch块中(发生什么异常,就跳到什么catch里,如果没有准确对应的,就跳到父类异常的catch中),执行完该catc
7、h块 中的语句,然后跳过其它的catch块,接着往下走。Finally子句 try /1 code that might throw exceptions /2catch(IOException e)/3 show error dialog /4finally /5以下3种情况会执行finally子句:1.代码没有抛出异常。在这种情况下,程序首先执行try语句块中的全部代码,然后执行finally子句中的代码。2.代码抛出一个在catch子句中捕获的异常。程序执行try语句块中的所有代码,直到发生异常为止。此时,将跳过try语句块中剩余的代码,而转去执行与该异常匹配的catch子句中的代码,最
8、后执行finally子句中的代码。3.代码抛出了一个异常,但这个异常不是由catch子句捕获。在这个情况下,程序将执行try语句块中所有语句,直到有异常被抛出为止。此时,将跳过try语句块中剩余代码,然后执行finally子句中的代码。并将异常抛给这个方法的调用者。finally子句无论在try语句块中是否遇到异常,finally子句中的代码块都会被执行。空指针异常qJava.lang.NullPointerException由RuntimeException派生出来,是一个运行级别的异常。意思是说可能会在运行的时候才会被抛出,而且需要看这样的运行级别异常是否会导致你的业务逻辑中断。出现空指针
9、异常原因:q 使用了未初始化的对象,并调用其方法(虽然已经声明)例如:String s=null;/对象s为空(null)int length=s.length();/发生空指针异常。q 是数据库查询时出现了查询为空的项目,却也依然引用其变量。q 将 null 作为一个数组,获得其长度。例如:String array=null;int length=array.length;用一句最朴实的话形容:就是你拿空的对象去做有实例的对象做的事情。解决方案q检查到对象为空时,设置对象值为空字符串或一个默认值。q检测到对象为空时,根本不执行某操作,直接跳转到其他处理中。q检查到对象为空时,提示用户操作有错
10、误。处理方法一String userName=request.getParameter(username);/该变量值为空时,转化为默认空字符串If(userName=null)userName=;If(userName.equals(“root”)处理方法二String userName=request.getParameter(username);/该变量值为空时,转化为默认空字符串,不执行有关操作。If(usreName!=null)If(userName.equals(root).处理方法三String userName=request.getParameter(username);/
11、该变量值为空时,转化为默认空字符串,不执行有关操作。If(usreName=null)/提示用户输入信息为空q实际中,上面提供到三种处理方式也同样适用于其他异常的处理:异常处理方式 1)检查到异常出现,设置对象值为空字符串或一个默认值;异常处理方式 2)检测到异常出现,根本不执行某操作,直接跳转到其他处理中。异常处理方式 3)检查到异常出现,提示用户操作有错误。个人建议:q使用equals时尽量使用常量比对变量,慎用变量比对常量。如:String ok=null;if(ok.equals(ok)/会抛异常System.out.println(true);elseSystem.out.println(false);改成:if(ok.equals(ok)/不会抛异常System.out.println(true);elseSystem.out.println(false);总结 不管是在程序中遇见异常情况,还是在生活中遇见异常情况,能处理的处理,不能处理的及时上抛或者上报。谢谢各位观看!作者:RAY制作日期:2009-04-12