黑马程序员--异常

来源:互联网 发布:黑龙江东北网络台 v 编辑:程序博客网 时间:2024/05/22 05:21


---------------------- ASP.Net+Android+IOS开发、.NET培训、期待与您交流! ----------------------

一、 异常的概念及java异常的体系结构

  1. 异常的概念:程序在运行时出现不正常的情况。Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。 

在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Error和异常Exception。 


Java异常体系结构呈树状


Thorwable类所有异常和错误的超类,有两个子类Error和Exception,分别表示错误和异常。
其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常,在java中,异常分为两种,一种是runtime异常(RunTimeException),也就是运行时异常,这种异常是不需要捕获的,由java虚拟机自动捕获,另外一种是非运行时异常,就是除了RunTimeException类和它的子类以外的所有异常类都是非运行时异常,这种非运行时异常都是需要手动捕获的,当然实际开发中,抛异常是不行的,所以得用try{}catch(){}finally{}这样的语句块来捕获异常.


运行时异常和非运行时异常

运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等,
这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,
程序应该从逻辑角度尽可能避免这类异常的发生。

非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。
从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。
如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。


二、异常的捕获和处理

java异常处理涉及到5个关键字,分别是try、catch、finally、throw、throws


1、异常处理的基本语法

在java中异常处理的完整代码


以上语法有三个代码块: 

try语句块,表示要尝试运行代码,try语句块中代码受异常监控,其中代码发生异常时,会抛出异常对象。
catch语句块会捕获try代码块中发生的异常并在其代码块中做异常处理,catch语句带一个Throwable类型的参数,
表示可捕获异常类型。当try中出现异常时,catch会捕获到发生的异常,并和自己的异常类型匹配,
若匹配,则执行catch块中代码,并将catch块参数指向所抛的异常对象。catch语句可以有多个,
用来匹配多个中的一个异常,一旦匹配上后,就不再尝试匹配别的catch块了。
通过异常对象可以获取异常发生时完整的JVM堆栈信息,以及异常信息和异常发生的原因等。

finally语句块是紧跟catch语句后的语句块,这个语句块总是会在方法返回前执行,
而不管是否try语句块是否发生异常。并且这个语句块总是在方法返回前执行。
目的是给程序一个补救的机会。这样做也体现了Java语言的健壮性。


2、三者之间的配对方式:
配对方式一:
try{
}catch(){
}
配对方法二:
try{
}catch(){
}finally{
}
配对方法三:
try{
}finally{
}
所以可用看出
catch和finally都不是必须的,try和catch不是必须配对的
但如果有try  就必须选一个配对 ,可以是catch 也可以是finally,或者两个都选
三者之间的执行顺序
1>  try语句没有错误的话,执行try语句,然后跳转到finally语句
2>  try语句有错误的话,执行catch中的语句,然后跳转到finally
3>  try语句没有错误的话,先执行try语句,如果try体中有return,则先跳转finally语句,然后再执行try中的return语句
就是说无论怎样,finally中的语句都会执行
例如:

执行结果: 除数不能为0!
Finally语句
6


3、throw、throws关键字 

throw关键字是用于方法体内部,用来抛出一个Throwable类型的异常。如果抛出了检查异常,
则还应该在方法头部声明方法可能抛出的异常类型。该方法的调用者也必须检查处理抛出的异常。
如果所有方法都层层上抛获取的异常,最终JVM会进行处理,处理也很简单,就是打印异常消息和堆栈信息。
如果抛出的是Error或RuntimeException,则该方法的调用者可选择处理该异常。有关异常的转译会在下面说明。

throws关键字用于方法体外部的方法声明部分,用来声明方法可能会抛出某些异常。仅当抛出了检查异常,
该方法的调用者才必须处理或者重新抛出该异常。当方法的调用者无力处理该异常的时候,应该继续抛出,
而不是囫囵吞枣一般在catch块中打印一下堆栈信息做个勉强处理。下面给出一个简单例子,
看看如何使用这两个关键字:


throws是用来声明一个方法可能抛出的所有异常信息throw则是指抛出的一个具体的异常类型。
通常在一个方法(类)的声明处通过throws声明方法(类)可能抛出的异常信息,
而在方法(类)内部通过throw声明一个具体的异常信息。
throws通常不用显示的捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法;
throw则需要用户自己捕获相关的异常,而后在对其进行相关包装,最后在将包装后的异常信息抛

程序1:

执行结果:c m n

程序2:

执行结果:b c d n



三、异常处理一般原则

1:尽可能的处理异常要尽可能的处理异常,如果条件确实不允许,无法在自己的代码中完成处理,就考虑声明异常。如果人为避免在代码中处理异常,仅作声明,则是一种错误和依赖的实践。

2:具体问题具体解决异常的部分优点在于能为不同类型的问题提供不同的处理操作。有效异常处理的关键是识别特定故障场景,并开发解决此场景的特定相应行为。为了充分利用异常处理能力,需要为特定类型的问题构建特定的处理器块。

3:记录可能影响应用程序运行的异常至少要采取一些永久的方式,记录下可能影响应用程序操作的异常。理想情况下,当然是在第一时间解决引发异常的基本问题。不过,无论采用哪种处理操作,一般总应记录下潜在的关键问题。别看这个操作很简单,但它可以帮助您用很少的时间来跟踪应用程序中复杂问题的起因。若要通知一个应用程序特有的问题,有必要将应用程序转换为不同形式。若用业务特定状态表示异常,则代码更易维护。从某种意义上讲,无论何时将异常传到不同上下文(即另一技术层),都应将异常转换为对新上下文有意义的形式。



---------------------- ASP.Net+Android+IOS开发、.NET培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net











0 0