Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3476269
  • 博文数量: 1450
  • 博客积分: 11163
  • 博客等级: 上将
  • 技术积分: 11101
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-25 14:40
文章分类

全部博文(1450)

文章存档

2017年(5)

2014年(2)

2013年(3)

2012年(35)

2011年(39)

2010年(88)

2009年(395)

2008年(382)

2007年(241)

2006年(246)

2005年(14)

分类: Java

2007-02-01 10:04:20

关于throws和throw和try{}catch(){}的区别和联系,书本上也说的迷迷糊糊,他们中的三种不知什么时候该使用!详细如下:


发布时间: 2006-12-15 ; 上次回复: 2006-12-15; 总计回复: 28人次



匿名 [等级:◆(初级)] (信誉值: 100) 回复于: 2005-7-20 10:20:06

其实很简单
异常有两种Error和Exception
我们一般说的异常指Exception,有两种--检查异常和未检查异常
在程序块中如果需要手动抛出一个"检查"异常用throw,
例如,throw new Exception("异常");
或者在一个try块中捕获了异常,但是在当前方法中还不想处理该异常,可以再次抛出可以用throw
throws是检查方法中的可能抛出的"未检查"异常,在写了throws的方法中可以不用去处理异常,但是在调用方法中,至少有一级是处理这种异常的.
例如
void a()throws Exception{
System.out.println(1/0);
}

void b(){
try{
a();
}catch(Exception e){
//处理异常的或者再次抛出
throw e;
}
}

void c(){
try {
b()
}catch(Exception e){
//如果在b()中再次抛出异常,可以在这里处理异常
}
}


醒客之路 [等级:◆◆◆◆◆(中级)] (信誉值: 91) 回复于: 2005-7-20 10:21:41

throws抛出一种异常,多写在方法定义后面!
try{}catch{}在方法体中具体捕获某种异常并进行处理。
throw是在方法体中抛出具体异常!这个异常可以是自定义的!


小刚 [等级:◆(初级)] (信誉值: 100) 回复于: 2005-7-20 10:28:15

throws用于在方法中抛出异常,throw用于在程序中某处抛出异常,try{}catch{}用于对某程序块如果发生异常时进行处理。事例如下:
1.
public void method throws Exception {
...
}
在该方法中只抛出异常但该不进行处理。
2.
public void method throws Exception {
...
throw RuntimeException;
}
在该方法中只抛出运行时异常但不进行处理。
3.
public void method throws Exception {
try {
throw RuntimeException;
} catch {
System.out.println("Error!");
}
}
在该方法中只抛出运行时异常而且进行处理。


匿名 [等级:◆◆(初级)] (信誉值: 100) 回复于: 2005-7-20 10:52:12



柳 [等级:◆(初级)] (信誉值: 100) 回复于: 2005-7-20 11:00:34

简单来说throws 是定义方法时定义预先设定的方法中可能抛出的异常,而try{}catch{}是在try程序块中捕捉可能出现的异常并在catch块中作处理,而throw一般是在程序体运行过程中一定的条件下抛出自定义或java定义的异常。


灰舌 [等级:◆◆◆◆◆(中级)] (信誉值: 98) 回复于: 2005-7-20 11:01:26

来晚了。
帮你顶


初学JAVA [等级:◆(初级)] (信誉值: 99) 回复于: 2005-7-20 11:10:50

现在楼主应该很清楚了, 呵呵,。。。
多给点分, 小弟穷!


虫虫 [等级:◆◆◆◆(中级)] (信誉值: 100) 回复于: 2005-7-20 11:14:16



39度 [等级:◆◆(初级)] (信誉值: 100) 回复于: 2005-7-20 11:25:30

信誉82 bs


中zhangsq [等级:◆◆(初级)] (信誉值: 82) 回复于: 2005-7-20 11:52:40

谢谢各位的回答:
能否给个具体实例分别对比来说明这三个不同的用法!
如果可以马上给分!!


匿名 [等级:◆(初级)] (信誉值: 100) 回复于: 2005-7-20 12:13:16

It's so easy


我的偶像--Bruce Eckel. [等级:◆◆(初级)] (信誉值: 100) 回复于: 2005-7-20 12:14:22

你可以尝试着注释掉throws或throw这一句看一下.就明白了!
class SimpleException extends Exception{}
public class SimpleExceptionDemo{
public void f() throws SimpleException{
System.out.println("Throw SimpleException from f()");
throw new SimpleException();
}
public static void main(String[] args){
SimpleExceptionDemo sed = new SimpleExceptionDemo();
try{
sed.f();
} catch(SimpleException e){
System.err.println("Caught it!");
}
}
}


我的偶像--Bruce Eckel. [等级:◆◆(初级)] (信誉值: 100) 回复于: 2005-7-20 12:16:58

没有throws 语句的话就表示这个方法不会抛出任何异常(^_^,但是除了RuntimeException它可以不用声明!)
如果没有throw 语句只有throws语句的话,你下面的 catch语句就无法捕捉到异常!
RuntimeException代表的是编程错误:
1.无法预料的错误
2.作为程序员,应该在代码中进行检查的错误.比如数组脚标越界 !


我的偶像--Bruce Eckel. [等级:◆◆(初级)] (信誉值: 100) 回复于: 2005-7-20 12:24:07

import java.io.*;
public class MainException{
public static void main(String[] args) throws Exception{
FileInputStream File = new FileInputStream("MainException.java");
File.close();
}
}
这样的话,就把异常传递给控制台,就不必些try-catch了.


呼呼 [等级:◆(初级)] (信誉值: 100) 回复于: 2005-7-20 12:59:43

帮忙顶了.............


纯粹理性 [等级:◆(初级)] (信誉值: 100) 回复于: 2005-7-20 13:27:14

throw丢
try catch是捡


纯粹理性 [等级:◆(初级)] (信誉值: 100) 回复于: 2005-7-20 13:34:48

比如你的程序中想打开一个文件,但是这个文件其实并不存在,系统会丢出一个错误,如果你没有用try把它捡起来,基本上你的程序是崩溃了,用了try之后可以在catch块中来处理这个错误,避免崩溃的恶果。

但是如果你编写的是一个组件,并不直接面向最终用户,中间还要经过另一个程序员,这样你来处理这个错误就不太好了,你不知别人最后想怎么处理(说不定他就是想崩溃呢),把你又把这个错误用throw丢出去



叶雨 [等级:◆◆(初级)] (信誉值: 100) 回复于: 2005-7-20 13:38:32

用throws仍出去的东西,你必须在使用的时候捕获它.

用throw仍出去的东西你在仍的时候就要捕获它.


匿名 [等级:◆(初级)] (信誉值: 100) 回复于: 2005-7-20 13:41:50

throws只是表名该方法可能会抛出的异常,这些异常是不用手动throw抛出的,更不是表名就是要抛出在列表中的异常!


夏乾坤 [等级:◆(初级)] (信誉值: 100) 回复于: 2005-7-20 13:54:54

throws XXXException 表示该方法会抛出异常由使用者处理(当然当前声明以后的地方就不用处理异常了),在调用该方法时必须被捕获

throw 表示手动抛出了一个异常,当然必须是Exception的派生类,并由catch捕获处理,注意只有try大括号句括的内容才能使用throw
try{} 表示该大括号名括的语句有可能抛出异常,如果捕捉到的异常,则由catch(...)进行识别并处理
catch(){} 识别try抛出的异常并进行处理
finally(){} 有无异常均会执行这里的语句,用于释放异常情况下未释放的资源操作等


雨点轻轻洒过 [等级:◆◆(初级)] (信誉值: 100) 回复于: 2005-7-20 20:13:14

方法名字后面是throws,
方法里面是throw


卡拉*杨 [等级:◆(初级)] (信誉值: 100) 回复于: 2005-7-20 20:40:41

谢谢各位,我也学习了。大家讲的都很清楚了。


小山 [等级:◆(初级)] (信誉值: 100) 回复于: 2005-7-20 21:06:43

huzzy() 的解说更深入了一层


气魄,格局 [等级:◆◆(初级)] (信誉值: 100) 回复于: 2005-7-20 22:09:07

异常处理关键字
Java的异常处理是通过5个关键字来实现的:try,catch,throw,throws,finally。JB的在线帮助中对这几个关键字是这样解释的:

Throws: Lists the exceptions a method could throw.

Throw: Transfers control of the method to the exception handler.

Try: Opening exception-handling statement.

Catch: Captures the exception.

Finally: Runs its code before terminating the program.

2.3.1 try语句 
try语句用大括号{}指定了一段代码,该段代码可能会抛弃一个或多个例外。

2.3.2 catch语句 
catch语句的参数类似于方法的声明,包括一个例外类型和一个例外对象。例外类型必须为Throwable类的子类,它指明了catch语句所处理的例外类型,例外对象则由运行时系统在try所指定的代码块中生成并被捕获,大括号中包含对象的处理,其中可以调用对象的方法。

catch语句可以有多个,分别处理不同类的例外。Java运行时系统从上到下分别对每个catch语句处理的例外类型进行检测,直到找到类型相匹配的catch语句为止。这里,类型匹配指catch所处理的例外类型与生成的例外对象的类型完全一致或者是它的父类,因此,catch语句的排列顺序应该是从特殊到一般。



也可以用一个catch语句处理多个例外类型,这时它的例外类型参数应该是这多个例外类型的父类,程序设计中要根据具体的情况来选择catch语句的例外处理类型。 

2.3.3 finally语句 
try所限定的代码中,当抛弃一个例外时,其后的代码不会被执行。通过finally语句可以指定一块代码。无论try所指定的程序块中抛弃或不抛弃例外,也无论catch语句的例外类型是否与所抛弃的例外的类型一致,finally所指定的代码都要被执行,它提供了统一的出口。通常在finally语句中可以进行资源的清除工作。如关闭打开的文件等。

2.3.4 throws语句 
throws总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常。对大多数Exception子类来说,Java 编译器会强迫你声明在一个成员函数中抛出的异常的类型。如果异常的类型是Error或 RuntimeException, 或它们的子类,这个规则不起作用, 因为这在程序的正常部分中是不期待出现的。 如果你想明确地抛出一个RuntimeException,你必须用throws语句来声明它的类型。

2.3.5 throw语句 
throw总是出现在函数体中,用来抛出一个异常。程序会在throw语句后立即终止,它后面的语句执行不到,然后在包含它的所有try块中(可能在上层调用函数中)从里向外寻找含有与其匹配的catch子句的try块。

阅读(1168) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~