黑马程序员技术交流社区

标题: java中throw和throws的区别 [打印本页]

作者: 罗全涛    时间: 2011-12-31 11:24
标题: java中throw和throws的区别
本帖最后由 罗全涛 于 2012-1-1 09:49 编辑

看视频的时候,总是一个少写s,一个多写s,冤枉报了很多不必要的错,
throw和throws的区别是什么?
作者: 李爱霞    时间: 2011-12-31 11:28
1. throws出现在方法函数头,可以单独使用;而throw出现在函数体,不可以单独使用,throw要么和try-catch-finally语句配套使用,要么与throws配套使用。

     2.throws主要是声明这个方法会抛出这种类型的异常,使其他地方调用它时知道要捕获这个异常。 throw是具体向外抛异常的动作,所以它是抛出一个异常实例。

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

     4. 程序会在throw语句后立即终止,它后面的语句执行不到,然后在包含它的所有try块中(可能在上层调用函数中)从里向外寻找含有与其匹配的catch子句的try块。


作者: 颜宗茂    时间: 2011-12-31 11:37
throws出现在方法函数头,可以单独使用;而throw出现在函数体,不可以单独使用,throw要么和try-catch-finally语句配套使用,要么与throws配套使用。
主要的一点是Throws是声明异常,说我这里有可能会发生异常,你要捕获,或者再往上抛,Throw是抛出一个实实在在的异常对象。

作者: 于海生    时间: 2011-12-31 15:00
throws是用来声明一个方法可能抛出的所有异常信息 throw则是指抛出的一个具体的异常类型。通常在一个方法(类)的声明处通过throws声明方法(类)可能抛出的异常信息,而在方法(类)内部通过throw声明一个具体的异常信息。 throws通常不用显示的捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法; throw则需要用户自己捕获相关的异常,而后在对其进行相关包装,最后再将包装后的异常信息抛出。对异常处理方式不同.throws对异常不处理,谁调用谁处理,throws的Exception的取值范围要大于方法内部异常的最大范围,而cathch的范围又要大于throws的Exception的范围;throw 主动抛出自定义异常类对象. throws抛出的是类,throw抛出的是对象.
作者: 常兆鹏    时间: 2011-12-31 15:20
hrow定义在函数内,用于抛出异常对象。
throws定义在函数上,用于抛出异常类,可以抛出多个,中间用逗号隔开。
当函数内容有throw抛出异常对象,并未进行try处理,必须要在函数上声明,否则编译失败。
注意:RuntimeException除外,函数内如果抛出的RuntimeException异常,函数上可以不用声明。
如果函数声明了异常,调用者需要进行处理,处理方法可以throw可以try。
作者: 付星    时间: 2011-12-31 17:41
throw用于手动抛出一个异常,用在代码块中
try
{
  throw new myException("抛出异常");//myException是自定义异常
}catch(Exception e)
{
      
}
throws用于把程序自动可能抛出的异常向外抛给调用端,最可以抛给JVM,但建议在使用这个抛出代码进行捕获,throws写在方法后面
public Class getClass() throws Exception
{
      Class.forName("java.lang.String");//这行要处理异常,但由throws抛出了
}
作者: 陈丹阳    时间: 2011-12-31 21:25
->毕向东Java基础视频教程-day09-10-面向对象(throw和throws的区别).avi   00:01:18
作者: 马新乐    时间: 2011-12-31 23:38
throws是用来声明一个方法可能抛出的所有异常信息
throw则是指抛出的一个具体的异常类型。
通常在一个方法(类)的声明处通过throws声明方法(类)可能抛出的异常信息,而在方法(类)内部通过throw声明一个具体的异常信息。
throws通常不用显示的捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法;
throw则需要用户自己捕获相关的异常,而后在对其进行相关包装,最后在将包装后的异常信息抛出。


如果在方法中会有异常被抛出而你又不希望在这个方法体内对此异常进行处理,可以使用throws在声明方法的时候同时声明他可能会跑出的异常。比如:
public void go() throws SQLException
{
...
Connection conn = ds.getConnection();
...
}
本来ds.getConnection()将可能会抛出SQLException,但现在使用throws 在方法名处声明了,所以在方法体中就不需要 try/catch 块来处理SQLException 了

throws语句
throws用来标明一个成员函数可能抛出的各种"异常"。对大多数Exception子类来说,Java编译器会强迫你声明在一个成员函数中抛出的"异常"的类型。如果"异常"的类型是Error或RuntimeException,或它们的子类,这个规则不起作用,因为这copy;在程序 的正常部分中是不期待出现的。如果你想明确地抛出一个RuntimeException,你必须用throws语句来声明它的类型。这就重新定义了成员函数的定义语法:type method-name(arg-list) throws exception-list { }下面是一段程序,它抛出了一个"异常", 但既没有捕捉它,也没有用throws来声明。这在编译时将不会通过。

class ThrowsDemo1

{

        static void procedure( ) {

      System.out.println("inside procedure");

        throw new IllegalAccessException("demo");

       }

  public static void main(String args[])

  {

   procedure( );

  }

}

为了让这个例子编译过去,我们需要声明成员函数procedure抛出了IllegalAccessException,并且在调用它的成员函数main里捕捉它。下面是正确的例 子:

class ThrowsDemo

{

static void procedure( ) throws IllegalAccessException

         {

      System.out.println("inside procedure");

        throw new IllegalAccessException("demo");

      }

  public static void main(String args[])

  {

try { procedure( ); }

   catch (IllegalAccessException e) {

     System.out.println("caught " + e);

     }

  }

}

下面是输出结果: C:\>java ThrowsDemo inside procedure caught java.lang.IllegalAccessException: demo

1.两者位置不同.

2.对异常处理方式不同.throws对异常不处理,谁调用谁处理,throws的Exception的取值范围要大于方法内部异常的最大范围,而cathch的范围又要大于throws的Exception的范围;throw 主动抛出自定义异常类对象.

3.throws抛出的是类,throw抛出的是对象.


作者: 罗全涛    时间: 2012-1-1 09:49
谢谢大家
作者: 徐传任    时间: 2012-10-7 17:42
看看。。。。。。。。。。。。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2