C07(异常)

来源:互联网 发布:简易交通灯单片机程序 编辑:程序博客网 时间:2024/06/07 16:46

关于异常的一点总结
在Java编程语言中,异常类定义程序中可能遇到的轻微的错误条件。可以写代码来处理异常并继续程序执行,而不是让程序中断。在Java语言中还有一种可以让程序中断的"异常",这就是错误类,错误类被认为是不能恢复的严重错误条件。当遇到这样的错误时,建议让程序中断。这样让程序非常有弹性,比如如果在进行数学计算的时候,除数是0,这样在Java中就成为一种可以捕获的异常,当遇到这种问题的时候,程序员可以写一个处理这个问题的代码,来处理它。这里先区分一个概念,throw与throws有什么不同。Java的异常处理机制是逐层向上的,也就是说当遇到了一个异常,那么编译器首先会把这个异常抛出到出现这个问题的try catch块里,如果没有try catch块,则会抛出到该方法里,看看该方法是否解决了这个问题,如果在该方法中就有该异常的解决办法,那么就在这个方法中捕获该异常,如果没有解决,就再把这个问题抛到包含到这个方法的方法里,看看它是不是解决了这个异常,如果没有解决,再继续向上抛出,以此类推,一直到解决它为止,在哪里解决了,就从那个解决它的地方继续执行,如果一直到最上层都没有解决,那么Java就会执行最后一部,就是告诉你哪里出现了异常,然后中止执行该程序。(注:参看调用栈机制)了解了这个程序,就好理解了throw与throws的区别,如果你觉得自己的方法里可能包含了某个错误,或者,你在该方法中编写了抛出语句,那么你就可以在该方法的()后加上一句throws someException,这样,如果你要使用该方法,编译器就规定你必须把它写到try catch块中,而且必须要写,否则编译器是不会通过的,这样的目的就是要程序员知道,该方法可能会抛出什么什么异常,要程序员对此作出处理,来确保程序能继续执行下去而不是中止执行,如果方法中没有加上throws someException,那么调用该方法就不用写try catch块也能通过编译,但是并不是说就不会出现异常了,如果程序还有异常存在,它还是会抛出异常,只是处理这个异常的是刚刚提到的那个机制,逐层的向上抛,一直到有人能处理它才会继续编译下去,如果抛到最上层都没有处理,那么编译器就会自己抓住该异常来处理,处理的结果就是中止程序,同样,一个没有写throws someException的方法,也同样可以写在一个try catch块中,如果该方法有异常抛出,try catch块同样能处理它并执行后面的操作。还有一点要注意的是,处理了try catch块中的异常后,程序要继续的地方是try catch块后面的代码,而不是try catch块里抛出异常的那条语句后面的代码。而throw则是你抛出异常的地方,比如,你可以写一个异常类,继承自someException,然后在某个方法中实例化它,或者直接new一个该类。这就是抛出异常的地方了,但是,如果你抛出的异常如果是那种不是你期望的地方发生的异常的方法,编写该方法则可以不使用throws someException,如果你抛出的异常是自己手写的throw new someException,则该方法必须要在方法名后面加上一句throws someException。如果你不加上这句,就不能通过编译,Java时刻提醒程序员,自己弄出来的问题,一定要自己解决。

调用栈机制(处理异常的机制)
    如果方法中的一个语句抛出一个没有在相应的try/catch块中处理的异常,那么这个异常就被抛出到调用方法中。如果异常也没有在调用方法中被处理,它就被抛出到该方法的调用程序。这个过程要一直延续到异常被处理。如果异常到这时还没被处理,它便回到main(),而且,即使main()不处理它,那么,该异常就异常地中断程序。
    考虑这样一种情况,在该情况中main()方法调用另一个方法(比如,first()),然后它调用另一个(比如,second())。如果在second()中发生异常,那么必须做一个检查来看看该异常是否有一个catch;如果没有,那么对调用栈(first())中的下一个方法进行检查,然后检查下一个(main())。如果这个异常在该调用栈上没有被最后一个方法处理,那么就会发生一个运行时错误,程序终止执行。

catch和finally语句
catch和finally的关系是,如果有一个try,那么后面可以有至少一个catch语句,可以没有finally语句,finally是无论执行了哪个catch后,都会执行的方法,如果finally没有执行到,只有一种可能,就是在catch处理的时候写入了System.exit(0)方法,如果在catch里写入了return语句,那么return在返回前,也必须要把finally里面的代码执行完,才能返回,关于捕获catch的写法是,由小到大,也就是说把如果有父类异常和子类异常,则必须先要catch子类异常,然后才写父类异常,如果是不相关的两个异常,则不需要考虑顺序。因为Java捕获异常的顺序是顺序执行,就好像switch一样,首先由第一个判断,如果能解决,就break,不能解决,就继续下面的catch,看看它们谁能解决,如果都没有解决,则会执行finally,(一般finally不作为catch的动作,也就是说,所有的catch块都没有能解决到抛出的异常的时候,还是会执行finally,然后将异常上抛至该方法,直至程序结束)如果没有finally,那么就将异常抛出至该方法,以此类推。


描述异常分类
在Java编程语言中,异常有三种分类。Java.lang.Throwable类充当所有对象的父类,可以使用异常处理机制将这些对象抛出并捕获。在Throwable类中定义方法来检索与异常相关的错误信息,并打印显示异常发生的栈跟踪信息。它有Error和Exception两个基本子类。
 Throwable类不能使用,而使用子类异常中的一个来描述任何特殊异常。每个异常的目的描述如下:
 Error表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。
 RuntimeException表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。比如,如果数组索引扩展不超出数组界限,那么,ArrayIndexOutOfBoundsException异常从不会抛出。比如,这也适用于取消引用一个空值对象变量。因为一个正确设计和实现的程序从不出现这种异常,通常对它不做处理。这会导致一个运行时信息,应确保能采取措施更正问题,而不是将它藏到谁也不注意的地方。
 其它异常表示一种运行时的困难,它通常由环境效果引起,可以进行处理。例子包括文件未找到或无效URL异常(用户打了一个错误的URL),如果用户误打了什么东西,两者都容易出现。这两者都可能因为用户错误而出现,这就鼓励程序员去处理它们。

 

共同异常
有些异常是程序员都容易出现但是都容易被忽视的异常,Java把这类异常作为预定义的异常,它们是
ArithmeticException—整数被0除,运算得出的结果
NullPointerException—当对象没被实例化时,访问对象的属性或方法的尝试(可以说它是Java的头号异常)
NegativeArraySizeException—创建带负维数大小的数组的尝试。
ArrayIndexoutofBoundsException—访问超过数组大小范围的一个元素的尝试。
SecurityException—典型地被抛出到浏览器中,SecurityManager类将抛出applets的一个异常,该异常企图做下述工作(除非明显地得到允许):
1访问一个本地文件
2打开主机的一个socket,这个主机与服务于applet的主机不是同一个。
3在运行时环境中执行另一个程序 

原创粉丝点击