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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

用try...catch和throw抛出异常的本质区别是什么?

5 个回复

倒序浏览
throw只是单纯的将错误抛出,一旦方法抛出了异常,这个方法就不可能回到调用者,也就是说你不必为返回的默认值或者错误代码担忧,throw需要用户自己捕获相关的异常,而后在对其进行相关包装,最后再将包装后的异常信息抛出,throw必须有一个捕获该异常的try/catch语句,也可以catch住一个exception后立刻又把他throw 出去,什么处理也不做,还可以catch住后throw new 一个你自己定义的exception ....
try/catch是捕获异常,有些代码必须捕获异常,对于图形界面程序来说,在用try/catch捕获异常之后也会打印出堆栈的信息,但程序将返回到用户界面的处理逻辑之中(在调试关于图形界面的程序时,最好保证控制台窗口课件,并且没有被最小化),如果有finally子句的话程序将继续执行finally中的代码;
二者之间真没有什么本质区别,他们一般是结合使用的,throw和throws是有本质区别的的。
public void method() throws Exception {
try {
      具体程序
} catch(FileNotFoundException ex) {
    throw......
}
}

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
throw 是语句抛出一个异常;throws 是方法抛出一个异常;

throw语法:throw <异常对象>

在方法声明中,添加throws子句表示该方法将抛出异常。如果一个方法会有异常,但你并不想处理这个异常,就在方法名后面用throws,这样这个异常就会抛出,谁调用了这个方法谁就要处理这个异常,或者继续抛出.

throws语法:[<修饰符>]<返回值类型><方法名>([<参数列表>])[throws<异常类>]

其中:异常类可以声明多个,用逗号分割。

区别二:throw要么和try-catch-finally语句配套使用,要么与throws配套使用。但throws可以单独使用,然后再由处理异常的方法捕获。

联系一:try .... catch 就是用catch 捕获 try 中的异常,并处理;catch是捕获异常。也就是说某一个操作有可能会抛出什么异常。throw 就是不处理异常,直接抛出异常


调用一个会throws exception的方法(在方法定义的时候可以用throws实现)时,需要把这个方法放在try里,然后用catch破获这个exception,做相应的处理。

throw new exception()是抛出一个exception,由别的method来破获它。


也就是说try....catch是为破获别人的exception用的,而throw是自己抛出exception让别人去破获的。


public void input() throws Exception

{ }

public void outputException()

{

try {

input();

}

catch(Exception e)

{

System.out.println("Exception");

}

}


简单的说,如果一个方法中用了throws,那么这个方法会向上抛出一个异常,那么在调用这个方法的时候必须把这个调用放在try...catch块里处理这个异常。


对于异常有两种处理方法

1、要么声明异常,也就是在方法名后面加上throws exceptionname,..., 方法本身只是抛出异常,由函数调用者来捕获异常。若产生异常,异常会沿着调用栈下移,一直找到与之匹配的处理方法,若到达调用栈底仍未找到,程序终止。

2、要么捕获异常。通过try catch方法,catch子句中放置处理异常的语句。


联系二:对于会觉得会有异常抛出的程序块,用try{}包住,然后用catch来抓住这个异常,在catch中对异常做处理, 在try中如果有异常的话,程序会转到catch而不会中断,通常这两个是配合使用的,如果你不想因为程序有错,而抛出一大堆异常的话,你就把该程序try起来,try和catch只能获取程序运行时引发的异常,而throw语句可以引发明确的异常,程序到了throw语句这后就立即停止,不会执行后面的程序,


大家也许在编程的过程中,会意识到这里出错,但不知道会抛出什么异常,也是一件头疼的事,现将这部分总结如下:

算术异常类:ArithmeticExecption
空指针异常类:NullPointerException
类型强制转换异常:ClassCastException
数组负下标异常:NegativeArrayException
数组下标越界异常:ArrayIndexOutOfBoundsException
违背安全原则异常:SecturityException
文件已结束异常:EOFException
文件未找到异常:FileNotFoundException
字符串转换为数字异常:NumberFormatException
操作数据库异常:SQLException
输入输出异常:IOException
方法未找到异常:NoSuchMethodException

点评

讲的很详细很好  发表于 2016-7-16 12:11

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
try{}catch(){}他的处理模式是当try中出现异常时,就直接跳转到catch中进行处理,而不是向客户端直接报错,这样就增强了java语言的健壮性。而在catch中我们可以进行异常类型转型,再抛出去。让他的调用者处理,这就需要使用throw语句了。他可以抛出一个编译时异常,也可以抛出一个运行时异常。也可以在catch中对异常进行处理,处理完后在继续运行以后的代码,而不是直接中断。
回复 使用道具 举报
有些程序中编译是没有问题的.但它存在着逻辑的异常.比如说零做除数.当有这样的情况时,你可以通过IF来处理,你也可以能过异常,也就是说如果零做除数你就用throw new Exception()抛出一个异常.!然后能过try-catch来处理.如果说你抛出的异常写在的是方法里,并且你没有用try-catch来处理,那么你就需要在方法的()后面用throws来向上一层抛出异常.当你调用这个方法的时候再进行try-catch处理
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马