A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

1. 异常(Exception)。
2. Java中的异常分为两大类:
a) Checked exception  (非  Runtime Exception) 非运行时异常
b) Unchecked exception(Runtime Exception) 运行时异常
3. Java中所有的异常类都会直接或间接地继承自Exception。
4. RuntimeException类也是直接继承自Exception类,它叫做运行时异常,Java中所有
的运行时异常都会直接或间接地继承自RuntimeException。
5. Java 中凡是继承自Exception而不是继承自RuntimeException的类都是非运行时异
常。 如附件图:运行—非运行异常区分.jpg

6.异常处理的一般结构是:
try
{
}
catch(Exception e)
{
}
finally
{
}
无论程序是否出现异常,finally 块中的代码都是会被执行的。
7. 对于非运行时异常(checked  exception),必须要对其进行处理,处理方式有两种:
第一种是使用try.. catch…finally 进行捕获;第二种是在调用该会产生异常的方法所在
的方法声明throws Exception 继续往外抛。
8. 对于运行时异常(runtime  exception),我们可以不对其进行处理,也可以对其进行处理。推荐不对其进行处理。
9. NullPointerException是空指针异常,出现该异常的原因在于某个引用为null,但你却调用了它的某个方法。这时就会出现该异常。

10.Error和Exception之间关系:程序可能会发生错误Error,可能会出现异常Exception。异常是我们可以处理的情况,但是如果程序发生了错误,我们就不能处理了。错误的危险级别比异常更高。一般情况下如果我们在代码上不做任何处理的话,程序发生了异常,那么异常代码后面的代码就不会再去执行了,但是如果我们对异常代码提前做了相应的处理(比如抛出或捕获),那么当异常发生的时候,代码还是能够继续往下执行的;而对于错误Error,我们无能为力,没有办法做任何处理,也没有任何办法让错误代码下面的代码继续执行。
系统对于运行时异常和非运行时异常的处理方式是完全不一样的。

Java里面每一个异常都是一个类,当程序执行到某一行如果出现异常的话,它会在可能产生异常的这一行代码的位置处产生一个针对于这个异常的一个异常对象(至于是哪个异常类型的对象,它会根据实际的异常情况自己去选择),这个对象是由它运行的时候来去动态的去生成的。如下代码:
Int c = 0;
Try {
Int a = 3;
Int b = 0;
C = a / b;
} catch (ArithmeticException e) {
e.printStrackTrace();
}
如果出现异常,会生成一个异常类对象,这个对象直接赋给引用变量e。

注意:在try块里面,如果某行代码出现异常了,那么流程会直接从这行代码转到catch块里面,try块里面此行代码后面的代码不会再去执行了。Catch块完了之后再往后正常去执行catch块后面的代码。

可能发生异常的代码放到try里面。一定要执行的代码放到finally里面。

程序光有try和finally,没有catch也是可以的。也是可以正常编译通过的。这样就相当于没有对异常进行处理,和不加try、catch是一个效果,后面的代码不会再去执行。
一个try后面不论跟着多少个catch,最多只会有一个catch被执行。


      在一个方法里面我们可以自己手工的去抛出异常,用关键字throw,抛出的是异常对象(异常出现的时候产生的也是异常对象)。如下代码作解释:

所有的异常实际上都是对象。

异常的第一种方式是try  catch捕获,第二种方式是抛出异常,抛出异常是由调用这个方法的那个方法对这个异常进行处理,它的处理方式也是有两种,要么捕获,要么继续抛出,继续抛给调用它的方法,就这样一层一层的网上抛。最后,main方法是我们的最后一个方法,如果main方法我们也声明为抛出的方式,那么最后异常就会抛给Java虚拟机了,由虚拟机自己去处理。

真正抛出异常对象的地方都是在程序代码里面,比如某行代码出异常了,程序会自动的生成一个相应的异常对象然后抛出,也可能是我们在代码里面某些地方自己手动的抛出异常对象,这个也是先new出来一个相应的异常对象,然后抛出(throw);而在方法声明的时候写的比如throws Exception,它不是真正的抛出异常对象,而只是做出一个声明,声明我的这个方法有可能会抛出异常,同样的也告诉调用这个方法的调用端我的这个方法有可能会抛出异常,调用端你也同样的需要做好抛出异常的准备(调用端方法声明中声明throws Exception)。就这样你调用我,他调用你,你把我这里抛出的异常继续往上抛,他把你这里出来的异常也继续往上抛,就这样一层层的,一直往上抛,最后把异常抛给了Throwable,由它来处理。


下面讲解自定义异常:

      所谓自定义异常,通常就是定义了一个继承自Exception类的子类,那么这个类就是一个自定义异常类。通常情况下,我们都会直接继承自Exception类,一般不会继承某个运行时的异常类。

自定义异常本身非常简单,不难,但是在实际开发里面几乎每个项目或多或少都会用到自定义异常,比如说你做了一件事情,比如用户在登录或是什么时候,用户名或密码错了之类的,遇到这些情况一方面是可以通过判断(if...else…),另外一方面也可以通过抛异常的方式处理。
      自定义异常类都需要继承Exception类。
      异常2中处理方式的比较:采用抛出的方式,程序一旦出现异常就一定不会再往下继续执行了;而采用try…catch…方式,程序一旦出现异常还是可以继续往下执行。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马