异常处理总结
异常是我们无论在日常学习还是工作时,都会遇到并且为之苦恼的,很多方法进行操作时都可能产生异常。异常是不正常情况,和错误稍有不同,这需要搞清楚,异常是一个运行时可能产生的不正常行为,一旦出现,java程序的执行顺序就被破坏,java程序就必须处理,不然整个程序就没法完成任务,而错误是指程序的运行错误,实际中,异常的寻找往往比报错更加困难费解。
Java类库的每个包中都定义了异常类,所有这些类都是Throwable类的子类。Throwable类派生了两个子类,分别是Error类和Exception类,其中,Eror类及其子类用来描述Java运行系统中的内部错误以及资源耗尽的错误,这类错误比较严重。Exception类称为非致命性类,可以通过捕捉处理使程序继续执行。Exception类又可以根据错误发生的原因分为运行时异常和非运行时异常。
在java中, java异常是一个对象,通过5个关键字来进行管理:try,catch,throw,thorws和finally。try和catch一般成对出现(也可以只有try和finally),且是java处理异常时必须用到的(如果异常抛给JVM处理则不需要用到),try和catch就是对可能出现异常的代码进行监控及对描述出现异常后进行处理的方法。这里我们还要涉及到finally(记住有别于final功能完全不一样),finally描述的代码是无论异常是否出现必须进行的操作,如关闭文件,数据流等,比如下列代码
try {
i=A.add(B);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} try catch 错误处理;
他的执行规则是:首先执行try中的代码 如果抛出异常会由catch去捕获并执行 如果没有发生异常 catch去捕获会被忽略掉 但是不管有没有异常最后都会执行。
try 语句使你能够测试代码块中的错误。
catch 语句允许你处理错误。
throw 语句允许你创建自定义错误。(抛出错误)
finally 使你能够执行代码,在 try 和 catch 之后,无论结果如何。
如下列测试代码
某种程度上try 和catch一般是在预计某段代码可能会出错(比如浏览器兼容问题)或者想故意利用这种错误来达成目的(这其实是一种偷懒的行为)时,就可以把这段代码放入try内,然后当出现错误时就会自动去执行catch里的代码
在catch代码块中使用了Exception对象的printStackTrace()方法输出了异常的栈日志,除此之外,Exception对象还提供了其他的方法用于获取异常的相关信息,其最常用的3个方法如下:
(1) getMessage)方法:获取有关异常事件的信息。
(2) toString)方法:获取异常的类型与性质。
(3) printStackTrace()方法:获取异常事件发生时执行堆栈的内容。
注意:
有时为了编程简单会忽略catch代码块后的代码,这样try..catch语句就成了一种摆设,一旦程序在运行过程中出现了异常,就会导致最终运行结果与期望的不一致,而错误发生的原因很难查找。因此要养成良好的编程习惯,最好在catch代码块中写入处理异常的代码。
java的内置异常主要由java.lang提供,常见的异常有ArrayIndexOutOfBoundsException数组索引越界,ClassCastException无效转换,IndexOutOfBoundsException其他类型的索引越界,NullPointerException空应用异常,UnsupportedOperationException不支持操作异常,ClassNotFoundException类未找到。
java出了内置了很多异常类以外,还支持我们自己创建异常类,它继承Exception,当然它也是继承了Throwable定义的方法。在编写代码时,我们必须得抛出异常,才能被捕捉,然后再处理,所以在创建自己后,必须在运行可能出现异常的代码中显示地抛出异常。
如果某个方法可能会发生异常,但不想在当前方法中处理这个异常,则可以使用throws、throw关键字在方法中抛出异常,本节将对如何在方法中抛出异常进行讲解。
如在Servlet中,我们便使用了throws来抛出异常
最后说一下throw和throws的区别:throw是显示的抛出异常,它的一般形式是throw ThrowableInstance,ThrowableInstance必须是一个Throwable的对象或者子类对象。throw语句后面,执行流会立即停止,其后的任何语句将不再执行(有同样功能的是return语句),然后再检查最近的try/catch语句块(可能是try/finally语句块),如果找到匹配的语句块就将控制转移到那条语句,如果没找到,则会执行默认的异常处理程序——停止程序,并输出堆栈踪迹。而throws是在一个方法可能引起一个不能处理的异常时进行标示的,即警惕调用者注意该异常。简单的说throw和throws都是抛出异常,throw是在方法体中抛出异常,而throws是在方法声明中。
注意:
使用throws为方法抛出异常时,如果子类继承父类,子类重写方法抛出的异常也要和原父类方法抛出的异常相同或是其异常的子类,除非throws异常是RuntimeException。
throw 通常用于在程序出现某种逻辑错误时,由开发者主动抛出某种特定类型的异常,
说明:
如果方法抛出了异常,在调用该方法时,必须为捕捉的方法处理异常,当然,如果使用throws关键字将异常抛给上一级后,不想处理该异常,可以继续向上抛出,但最终要有能够处理该异常的代码。
其他异常处理具体举例代码我们可去进行代码测试研究