个人认为:此处可以去掉throws Throwable!
解决方案 »
- 在netbeans中如何连接access数据库?(不配置数据源)
- Java 下如何依次读取一个目录下的所有文件
- oracle的jvm与我安装的jdk冲突,导致tomcat不能启动
- Java的平台无关性说的是在操作系统级,还是在硬件级,或者两者都有?
- 求救,看看这个程序那错了。。。
- 基础问题,怎样覆盖重写一个文本文档中的某一段文字
- 这个小程序为什么一运行电脑就死机啊
- 一个问题与大家探讨,各位请进,来者有分!!!
- 请各位高手帮帮忙,本人在此先谢过了!请…………帮帮忙!!!
- 請教: JB6 如何使用 crystal report ?
- 如何得到某年某个月的天数?eg:2003年2月,参数为2003和2
- #applet 大家用的多吗?据说 IE 将不再支持内嵌java vm?
Throwable有两个子类Error&Exception!
用Throwable可以表示抛出的任何异常和错误!
Throwable有两个子类Error&Exception!
用Throwable可以表示抛出的任何异常和错误!
一、异常的种类
java异常可以分成两大类:Exception和RuntimeException(虽然RuntimeException是从Exception继承的)。exception异常代表“无法避免的异常” 如io异常 往往这类异常是由于外部原因造成的,程序本身无法保证他们不发生,所以这类异常必须捕获。如果在函数内部无法处理这个异常必须再次抛出(在函数后面用throws语句),如果什么都不做就出现编译错误。
runtimexception是指“可以避免的异常”,如 null引用异常,这类异常都是由程序内部原因造成的,是可以避免的。对于这类异常可以忽略他们,但一旦发生程序就会异常终止。这类异常对debug非常有帮助,当然,如果需要也可以catch。
另外,有些地方即使不会有exception,但是从商业逻辑上是错误的、非预期的,也可以抛出user exception。例如,用户输入非法,bank account非法透支等等。
二、主要原则
处理意外的一个重要原则,就是要么处理,要么接着抛,决不能吃掉(You either handle it, or throw it. You don’t eat it.)这就是说,当你捕获一个异常之后,必须决定是否立即处理这个异常,或者继续抛出这个异常(或者另一个自定义异常),以便由调用的客户端捕获之。当客户端捕获到以后,又会继续进行类似的判断。
一般来说,GUI端是要处理异常的,比如JSP捕获到异常之后,需要先是给用户一个友好的出错信息,而不要给出系统的出错信息。系统的出错信息一方面不太友好,另一方面提供了太多的系统信息,容易被恶意用户用来攻击系统。
换句话说,所有的异常最终必须有一个终极的处理者,这就是GUI。至于中间的环节,比如在服务器端运行的JavaBean是否要处理捕获到的异常,还是继续抛出所捕获的异常,需要视具体情况处理。
除非你想把异常处理的责任交给调用者,一般不用throws。 比如你要读入一些文件,如果你想通知调用者,让调用者决定如何处理这个异常,你就把这个异常throws给调用者;如果你知道应该如何处理这个异常,或者你想把异常马上解决,你可以就地catch她。
这完全取决于你想把异常自己立即处理还是想把处理责任返回给调用者。取决于你的程序的结构和要求。
需要注意的有:
1、如果无法处理某个异常,那就不要捕获它。
2、如果捕获了一个异常,请不要胡乱处理它。
3、尽量在靠近异常被抛出的地方捕获异常。
4、在捕获异常的地方将它记录到日志中,除非您打算将它重新抛出。
5、按照您的异常处理必须多精细来构造您的方法。
6、需要用几种类型的异常就用几种,尤其是对于应用程序异常。
三、异常嵌套和捕获适当的异常
按照Java语言的定义,所谓异常(Exception)指的就是向调用方法(calling method)表示发生非正常情况的习惯方式。下面讨论两种在处理异常时可兹利用的技术:异常嵌套和捕获适当的异常。
异常嵌套
你在试图捕获异常并打算扔出异常时该采取什么措施呢?同时,你希望原始的异常信息可用吗?
要回答以上的问题你不妨尝试一下NestedException类。具体的编程并不难,唯一要做的无非是利用构造器并且重载printStackTrace()以便显示出正确的数据。
此外,你还应当考虑封装Throwable而非Exception类来创建更具有重用性的组件。之后,你可以创建NestedRuntimeException变量封装Throwable但无需对其进行声明。清单A显示了完整的示例。
捕获适当的异常
正确地处理异常并不是一项轻松的任务,这是因为异常的处理有时会导致程序出现其他不明行为。不过,以下三条规则可以帮助你避免错误处理异常所可能遭遇的风险。
规则 #1: 总是捕获扔出异常的类型而不要理睬异常的超类。 清单B中的代码片断以示例的方式从错误编码和正确编码两个角度进行了说明。
为了遵守通常的代码习惯,你可以采用Exception类的大写字母作为变量名,如下所示:
catch(FileNotFoundException fnfe)
以及
catch(SQLException sqle)
规则 # 2: 决不让catch块留空。在很多情况下虽然确实编写了try/catch块但在代码的catch部分却什么都没有做。或者,如果采用了日志API(Logging API),那么请编写代码把异常写到日志中。
清单C 显示了以上编码的错误方式和正确方式。
规则 # 3: 决不扔出Exception基类的实例。开发人员应当总是扔出自己创建的异常类。
扔出异常的API很难处理。在声明方法扔出java.lang.Exception的情况下,清单A中所有的问题都会强加在API用户的头上,这样他们就无法以一种专业的编程方式来处理异常。通过为扔出API声明Exception类的子类这一举措,API开发人员就可以减轻用户的负担。
以上提到的两种技术在处理异常时还可能用得更好、更适当。嵌套技术令异常扔到另一异常的内部,而捕获适当的异常令程序调试大大简化。
这完全取决于你想把异常自己立即处理还是想把处理责任返回给调用者。取决于你的程序的结构和要求。
语法上是行的通的
既然Throwable是所有Error和Exception的父类
那这句的意思从字面上看
应该是抛出所有方法中不catch的Exception吧期待有人给个明白的解释
告诉调用者着个MAIN 会抛才抛出ExceptionName这个异常
private static void doTest() throws ArithmeticException{
try{
int[] a ={1,2,3,4,5};
a[10] = 56;
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("数组越界");
}
int i = 5/0;
};
public static void main(String[] args)
{
try{
doTest();
}catch(Exception e){
System.out.println("被除数不能为零");
}注意:如果在doTest中用try..catch..捕获ArithmeticException,则ArithmeticException就无法抛出了,只是一个简单的例子,没有任何意义。还是建议楼主稍微看一下我以上的回复
是这样的:
在java程序中,异常传递到main方法后,就截至了,因为没有哪个方法会调用main方法的,
这样写,编译虽然能够通过,但异常一旦发生,却没有被处理,程序就会飞正常中止,即使你能确信程序中不会发生某种异常,这种方法也能够简化程序的编写,但完全违背了java设计异常的初衷,不建议在正规的程序中使用,用这种方法写点试验性的代码,到是无可厚非.~~~~
听懂了么??书上并没有写错,只是告诉你一格特殊的情况,在这种情况下,异常没有被处理,写和不写是一样的,但建议楼主还是不要写得好,因为java在设计时,估计好像并没有考虑到这种情况,我市这么想的,或者是考虑到了,并没有修正,因为加和不加都是一样的,那为什么要改那么复杂呢~~~~~~~
:)不知道楼主听明白没有~~~~
就是将可能抛出的异常事先声明一下,好让别人用的时候知道该捕捉哪种异常------------------------------------------------------------------------
仅仅是声明吗?如果是这样的话我结贴了,谢谢!
回复人: yunxiang(*****) ( ) 信誉:98 2004-08-30 21:28:00 得分: 0
在main中写throws
-------------------------------------------------------------------
并没有在mian中加throws,至少我这一例是这样的,我问的是在函数名后加throws ExceptionName
是什么意义。不只是mian。也许main是一种特例。但我觉得了解本质比较重要。回复人: gyang(我是谁?) ( ) 信誉:98 2004-08-30 21:28:00 得分: 0
throws就是声明你要抛出的异常,以给调用者某种提示,让他们有准备处理此类异常。你的方法如果有异常但不处理异常而抛出他,则你必须声明它。但是RuntimeException或Error类或其子类的异常对象除外——你可以不声明,当然也可以声明。
--------------------------------------------------------------------
这个说得我明白了。同blueflypigeon,谢谢!还想问一下如果我声明了throws ExceptionName但是在函数体内并没有抛出这个异常(throw new ExceptionName()),这意味着什么呢?回复人: skystar2001(波塞冬) ( ) 信誉:100 2004-08-31 01:08:00 得分: 0
楼主这个我知道~~~
是这样的:
在java程序中,异常传递到main方法后,就截至了,因为没有哪个方法会调用main方法的,
这样写,编译虽然能够通过,但异常一旦发生,却没有被处理,程序就会飞正常中止,即使你能确信程序中不会发生某种异常,这种方法也能够简化程序的编写,但完全违背了java设计异常的初衷,不建议在正规的程序中使用,用这种方法写点试验性的代码,到是无可厚非.~~~~
听懂了么??书上并没有写错,只是告诉你一格特殊的情况,在这种情况下,异常没有被处理,写和不写是一样的,但建议楼主还是不要写得好,因为java在设计时,估计好像并没有考虑到这种情况,我市这么想的,或者是考虑到了,并没有修正,因为加和不加都是一样的,那为什么要改那么复杂呢~~~~~~~
:)不知道楼主听明白没有~~~~
--------------------------------------------------------------------------------
楼上的……你说得我都认真去理解了,不过我太愚笨,不明白这和我问的问题有什么关系 :(。不过还是谢谢!
×××××××××××××××××××××××××××××××××××
原则:
1。thorw出去的异常最终要得到处理,
2。要么就自己处理,不要再throw出去了。
void XXXX()
{
try{}
catch(){}
finially{}
}
3。要么就throw给这个函数的调用者来处理它
void XXXX() throws Exception
{
// 这里可能出错
}4。自定义异常
void XXXX()
{
try{}
catch(){
throw new MyException(...);
}
finially{}
}×××××××××××××××××××××××××××××××××××