Java之throw和throws的区别及java中的异常处理

  异常在Java中是以一个对象来看待,并且所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,但是一般情况下 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行。

  用户程序自定义的异常和应用程序特定的异常,必须借助于 throws 和 throw 语句来定义抛出异常。

一、区别

1、throws用于方法头,表示的只是异常的申明,而throw用于方法内部,抛出的是异常对象。

  throws 用在方法声明后,跟在后面的是异常类名 (Execution ),throw 用在方法体内,跟的是异常的对象名 (new Execution)

2、throws可以一次性抛出多个异常,而throw只能一个

  throws 后可以跟多个异常类名,用逗号隔开;而 throw 只能抛出一个异常对象名

3、throws抛出异常时,它的上级(调用者)也要申明抛出异常或者捕获,不然编译报错。而throw的话,可以不申明或不捕获(这是非常不负责任的方式)但编译器不会报错。

4、throws 表示抛出的异常由该方法调用者处理,throw表示抛出的异常由自己处理(定义方法体内)

5、throws 表示会出现异常的一种可能性,不一定会发生该异常;throw 要是执行了则一定抛出了某种异常且后面的代码都不执行。

6、throw 是语句抛出一个异常。语法:throw (异常对象);

7、throws 是方法可能抛出异常的声明。(用在声明方法时,表示该方法可能要抛出异常)。语法:public void doA(int a) throws Exception1,Exception3{......}

throws E1,E2,E3 只是告诉程序这个方法可能会抛出这些异常,方法的调用者可能要处理这些异常,而这些异常E1,E2,E3可能是该函数体产生的。

throw 则是明确了这个地方要抛出这个异常。

二、实例分析

void doA(int a) throws IOException,{
  try{
    ......
  }catch(Exception1 e){
    throw e;
  }catch(Exception2 e){
    System.out.println("出错了!");
  }
  if(a!=b)
    throw new Exception3("自定义异常");
}

1、代码分析:

  代码块中可能会产生3个异常:Exception1,Exception2,Exception3。

  如果产生Exception1异常,则捕获之后再抛出,由该方法的调用者去处理。

  如果产生Exception2异常,则该方法自己处理了(即System.out.println("出错了!");)。所以该方法就不会再向外抛出Exception2异常了,void doA() throws Exception1,Exception3 里面的Exception2也就不用写了。

  而Exception3异常是该方法的某段逻辑出错,程序员自己做了处理,在该段逻辑错误的情况下抛出异常Exception3,则该方法的调用者也要处理此异常。

2、异常理解:

(1)throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。

  throws语句用在方法声明后面,表示再抛出异常,由该方法的调用者来处理。

(2)throws主要是声明这个方法会抛出这种类型的异常,使它的调用者知道要捕获这个异常。

  throw是具体向外抛异常的动作,所以它是抛出一个异常实例。

(3)throws说明你有那个可能,倾向。

  throw的话,那就是你把那个倾向变成真实的了。

(4)同时:

  throws出现在方法函数头;而throw出现在函数体。

  throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常。

  两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。

三、java中的异常处理

  Java中异常处理是通过:try、catch、finally、throw和throws这5个关键词来实现的

1、简单介绍一下:try、catch、finally 3个关键词,java处理异常中,把可能出现的异常代码放入到try块中,由catch来进行捕获异常,而将必须输出的信息,放到的final语句中,因为是否发生异常final中的语句都会输出,除非在catch中使用System.exit(1)。

  注:执行System.exit(1),将推出jvm虚拟机

2、声明异常——throws

  Java中通过关键词throws声明某个方法可能抛出的各种异常类,可以同时声明多个异常类,但需用逗号隔开。

  有两种方式进行处理throws:

(1)使用try-catch捕获异常

(2)使用throws继续声明,如果调用者不打算处理此异常,可以继续通过throws声明异常,让上一级调用者处理异常。

  main()方法声明的异常将由Java虚拟机来处理。

3、抛出异常——throw

  Java中也可以使用throw关键词,来进行自行抛出异常,来处理系统无法自动发现并解决的问题,将它由调用者来进行决解

4、异常的分类:

  Throwable类:所有异常类型都是Throwable类的子类,它有两个派生类,分别是Error和Exception

  Error类:表示仅靠程序本身无法恢复的严重错误,如内存溢出、虚拟机错误。应用程序不应该抛出这种类型的对象(一般由虚拟机抛出)

  Exception类:由java应用程序抛出和处理的非重要错误,如数组下标越界、类型转换等。它的不同的子类分别对应不用类型的异样

posted @ 2017-08-12 17:12  古兰精  阅读(509)  评论(0编辑  收藏  举报