黑马程序员技术交流社区
标题: throw和throws有什么区别? try、catch、finally分别在什么情况下使用? [打印本页]
作者: 米大米 时间: 2014-4-14 01:38
标题: throw和throws有什么区别? try、catch、finally分别在什么情况下使用?
我只是单纯的知道
throws是获取异常
throw是抛出异常
具体不是很懂 求解
以及try catch finally 读程序是怎么样安排顺序
作者: 林梦 时间: 2014-4-14 01:46
java语言采用try、catch、finally结构的语句和throw抛出异常的方式对异常进行处理。
throws用来标明一个成员函数可能抛出的各种异常。
throw语句用来明确地抛出一个异常。
try需要检测的代码
catch异常处理的方式
finally不管有没有异常一定会执行的语句。
作者: 東少 时间: 2014-4-14 01:55
throws用于在方法上声明该方法不需要处理的异常类型,用在方法上后面跟异常类名 可以是多个异常类
throw用于抛出具体异常类的对象,用在方法内 后面跟异常对象只能是一个异常类型实体.
try块必须和catch块或和finally同在,不能单独存在,二者必须出现一个.
finally块总会执行,不论是否有错误出现.但是若try语句块或会执行的catch语句块使用了JVM系统退出语句,finally块就不会被执行了. 一般我们把关闭资源的代码放在finally里面 保证资源总是能关闭
作者: skyfly 时间: 2014-4-14 02:15
本帖最后由 skyfly 于 2014-4-14 02:22 编辑
throws是用来声明一个方法可能抛出的所有异常信息
throw则是指抛出的一个具体的异常类型。
通常在一个方法(类)的声明处通过throws声明方法(类)可能抛出的异常信息,而在方法(类)内部通过throw声明一个具体的异常信息。
throws通常不用显示的捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法;
throw则需要用户自己捕获相关的异常,而后在对其进行相关包装,最后在将包装后的异常信息抛.
throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。
throws语句用在方法声明后面,表示再抛出异常,由该方法的调用者来处理。
还有后面try catch finally.
Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。
用try来指定一块预防所有"异常"的程序。紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的"异常"的类型。
throw语句用来明确地抛出一个"异常"。
throws用来标明一个成员函数可能抛出的各种"异常"。
Finally为确保一段代码不管发生什么"异常"都被执行一段代码。(注意:当finall 前面有system.exit(0),那么finally就不执行了,因为程序已经结束了)
作者: wangkerui 时间: 2014-4-14 08:01
本帖最后由 wangkerui 于 2014-4-14 08:03 编辑
throw和throws有什么区别?
throws语句: throws总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常。对大多数Exception子类来说,Java 编译器会强迫你声明在一个
成员函数中抛出的异常的类型。如果异常的类型是Error或 RuntimeException, 或它们的子类,这个规则不起作用, 因为这在程序的正常部分中是不期待出现的。 如果你想明确地抛出一个RuntimeException,你必须用throws语句来声明它的类型。
throw语句: throw总是出现在函数体中,用来抛出一个异常。程序会在throw语句后立即终止,它后面的语句执行不到,然后在包含它的所有try块中(可能在上层调用函数中)从里向外寻找含有与其匹配的catch子句的try块。
区别: 1.两者位置不同.
2.对异常处理方式不同.throws对异常不处理,谁调用谁处理,throws的Exception的取值范围要大于方法内部异常的最大范围, 而 cathch的范围又要大于 throws的Exception的范围;throw 主动抛出自定义异常类对象.
3.throws抛出的是类,throw抛出的是对象.
try、catch、finally分别在什么情况下使用?
try语句 : try语句用大括号{}指定了一段代码,该段代码可能会抛弃一个或多个例外。
catch语句: catch语句的参数类似于方法的声明,包括一个例外类型和一个例外对象。例外类型必须为Throwable类的子类,它指明了catch语句所处理的例外类型,例外对象则由运行时系统在try所指定的代码块中生成并被捕获,大括号中包含对象的处理,其中可以调用对象的方法。
finally语句: try所限定的代码中,当抛弃一个例外时,其后的代码不会被执行。通过finally语句可以指定一块代码。无论try所指定的程序块中抛弃或不抛弃例外,也无论catch语句的例外类型是否与所抛弃的例外的类型一致,finally所指定的代码都要被执行,它提供了统一的出口。通常在finally语句中可以进行资源的清除工作。如关闭打开的文件等。
作者: 曹冬明 时间: 2014-4-14 09:34
throw和throws都是抛出异常,throw是在函数内抛出,throws是在函数上抛出。throw是执行某段代码的时候,对可能出现的问题利用throw抛出,提醒程序员修改代码!throws是你用到了某个接口或者类中的某个方法,它的方法定义中,会抛出异常,你要调用就要处理异常,你要不想处理或者处理不了也可以抛出,就在函数上用throws抛出!
至于try:把可能出现异常的代码写在try中,用catch捕获异常,可处理可抛出!finally就是无论异常发生与否都会执行的代码,通常是关闭资源用的,因为你的程序可能会操作到了系统的底层资源,因为产生异常程序终止,但是系统资源还在被调用,所以必须关掉!在IO中finally用的相对频繁一些!
作者: Linuxgg 时间: 2014-4-14 10:33
try{
1
}catch(){
2
}fainally{
3
}
如果程序正确,没错误,就是: 1, 3
如果程序有错误,就是:1,2,3
也就是,try里面,无异常的部分,是肯定先被执行的,catch里的,是出现异常才被执行的,finally,是最后收尾的,不管你出不出异常都要执行的。
作者: 沫然 时间: 2014-4-14 16:05
1.throws 用于抛出方法层次的异常,
并且直接由些方法调用异常处理类来处理该异常,
所以它常用在方法的后面。比如
public static void main(String[] args) throws SQLException
2.throw 用于方法块里面的代码,比throws的层次要低,比如try...catch....语句块,表示它抛出异常,
但它不会处理它,
而是由方法块的throws Exception来调用异常处理类来处理。
3.
一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。
用try来指定一块预防所有"异常"的程序。紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的"异常"的类型。
try
{
//执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容
}
catch
{
//除非try里面执行代码发生了异常,否则这里的代码不会执行
}
finally
{
//不管什么情况都会执行,包括trycatch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally
}
<1>.try+catch
程序的流程是:运行到try块中,如果有异常抛出,则转到catch块去处理。然后执行catch块后面的语句
<2>.try+catch+finally
程序的流程是:运行到try块中,如果有异常抛出,则转到catch块,catch块执行完毕后,执行finally块的代码,再执行finally块后面的代码。
如果没有异常抛出,执行完try块,也要去执行finally块的代码。然后执行finally块后面的语句
<3>.try+finally
程序的流程是:运行到try块中,如果有异常抛出的话,程序转向执行finally块的代码。那末finally块后面的代码还会被执行吗?不会!因为你没有处理异常,所以遇到异常后,执行完finally后,方法就已抛出异常的方式退出了。
这种方式中要注意的是,由于你没有捕获异常,所以要在方法后面声明抛出异常
共同点:
在catch块和finally块中仍然可以再抛出新的异常
例如 throw new Exception("illegal invoked");
如果对于新抛出的异常没有写try的话,则要在方法后面声明抛出异常
反之,如果给catch块或finally块里的异常再套上一层try,catch的话,方法后面就不必声明异常了。
注意点:
每次执行后输出结果的顺序可能都不太相同,这是因为采用不同的流打印的结果,不必太在意
作者: sheng6699 时间: 2014-4-14 22:26
1 try{ }catch(Excepiton e){ } finally{ } ,try里的代码出现异常就会跳到catch里面去执行并进行处理,如果没有异常就不会执行catch里的代码。finally 的代码一定会被执行。通常用于关闭资源。如 IO流。
2 throw 是抛出异常。一直往上抛,最终由虚拟机所处理。
3 throws 可以用来 new 对象。进行抛出异常。比如new RuntimeExciption。可以用来标示代码有“运行时异常”。
作者: 米大米 时间: 2014-4-15 11:33
就是说finally 是一定要执行的 而try catch 则需要条件 两者是不是执行其中一个啊?
作者: 米大米 时间: 2014-4-15 11:35
简单明了 哥们说的挺好的 不过会不会出现try catch 都不执行 只执行finally的情况啊
作者: 米大米 时间: 2014-4-15 11:37
好像在try中 用throw 方法中就应该用throws 抛出异常啊
作者: Linuxgg 时间: 2014-4-15 20:06
果然有想法。。。
不过你反过来想,你都不try一下,这个代码写了有啥用?写try的目的,就是为了出现异常就捕获的,所以,try是肯定要执行的。。。
作者: 彭飞 时间: 2014-4-15 23:47
try catch finally
try 你可以理解为,即将为下面的代码进行异常监视了,
一旦出现异常,这个时候就进入catch了,
而finally ,不论你异常也好,不异常也好,都会执行里面的代码,
就好比,上学 try 告诉你,今儿该上学了啊, 如果你没有去,catch就是签到记录,就给你记上一笔,而finally就是老师,他不管你来不来,反正他来,他领工资嘛。
作者: jsjchenlong 时间: 2014-4-20 23:21
throw用于抛出异常对象,后面跟的是异常对象;throw用在函数内。
throws用于抛出异常类,后面跟的异常类名,可以跟多个,用逗号隔开。throws用在函数上。
通常情况:函数内容如果有throw,抛出异常对象,并没有进行处理,那么函数上一定要声明,否则编译失败。但是也有特殊情况。
定义异常处理时,什么时候定义try,什么时候定义throws呢?
功能内部如果出现异常,如果内部可以处理,就用try;
如果功能内部处理不了,就必须声明出来,让调用者处理。
自定义异常:
当开发时,项目中出现了java中没有定义过的问题时,这时就需要我们按照java异常建立思想,将项目的中的特有问题也进行对象的封装。这个异常,称为自定义异常。
对于除法运算,0作为除数是不可以的。java中对这种问题用ArithmeticException类进行描述。对于这个功能,在我们项目中,除数除了不可以为0外,还不可以为负数。可是负数的部分java并没有针对描述。所以我们就需要自定义这个异常。
自定义异常的步骤:
1:定义一个子类继承Exception或RuntimeException,让该类具备可抛性。
2:通过throw 或者throws进行操作。
异常的转换思想:当出现的异常是调用者处理不了的,就需要将此异常转换为一个调用者可以处理的异常抛出。
try catch finally的几种结合方式:
1,
try
catch
finally
这种情况,如果出现异常,并不处理,但是资源一定关闭,所以try finally集合只为关闭资源。
记住:finally很有用,主要用户关闭资源。无论是否发生异常,资源都必须进行关闭。
System.exit(0); //退出jvm,只有这种情况finally不执行。
当异常出现后,在子父类进行覆盖时,有了一些新的特点:
1:当子类覆盖父类的方法时,如果父类的方法抛出了异常,那么子类的方法要么不抛出异常要么抛出父类异常或者该异常的子类,不能抛出其他异常。
2:如果父类抛出了多个异常,那么子类在覆盖时只能抛出父类的异常的子集。
注意:
如果父类或者接口中的方法没有抛出过异常,那么子类是不可以抛出异常的,如果子类的覆盖的方法中出现了异常,只能try不能throws。
如果这个异常子类无法处理,已经影响了子类方法的具体运算,这时可以在子类方法中,通过throw抛出RuntimeException异常或者其子类,这样,子类的方法上是不需要throws声明的。
常见异常:
1、脚标越界异常(IndexOutOfBoundsException)包括数组、字符串;
空指针异常(NullPointerException)
2、类型转换异常:ClassCastException
3、没有这个元素异常:NullPointerException
4、不支持操作异常;
异常要尽量避免,如果避免不了,需要预先给出处理方式。比如家庭备药,比如灭火器。
作者: 阿温 时间: 2014-8-18 15:57
throw你说反了吧
作者: 黑马_小漒 时间: 2014-8-20 00:54
看来黑马的大神~~~还真不少啊~~~要加油啊~~~
作者: 牛牛宝 时间: 2015-1-8 21:03
throw用在函数体内,抛出异常,通常采用new 异常类
而throws用于声明会引发的异常类,可以声明多类,用逗号隔开
作者: 白羊Mon 时间: 2015-3-14 21:51
谢楼上的亲们
作者: 落雪 时间: 2015-5-31 15:05
学习学习,
作者: 鹏飞 时间: 2015-8-12 08:53
努力了~
作者: xiao_D 时间: 2015-10-23 01:18
够细 谢谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |