java异常处理笔记 - 编程入门网
错误信息,相信 Java 程序员肯定见过(可能还是屡见不鲜!),而且,这也是许多从 C++ 程序员刚刚转来写 Java 程序不久(还没有真正入行)时,最感到迷糊和不解的地方,“俺代码明明没什么问题吗?可为什么编译有问题呢”!
呵呵!阿愚相信老练一些的 Java 程序员一定非常清楚上述编译出错的原因。那就是如错误信息中(“ must be caught ”)描述的那样,在 Java 的异常处理模型中,要求所有被抛出的异常都必须要有对应的“异常处理模块” 。也即是说,如果你在程序中 throw 出一个异常,那么在你的程序中(函数中)就必须要 catch 这个异常(处理这个异常)。例如上面的例子中,你在第 20 行代码处,抛出了一个 Exception 类型的异常,但是在该函数中,却没有 catch 并处理掉此异常的地方。因此,这样的程序即便是能够编译通过,那么运行时也是致命的(可能导致程序的崩溃),所以,Java 语言干脆在编译时就尽可能地检查(并卡住)这种本不应该出现的错误,这无疑对提高程序的可靠性大有帮助。相反,C++ 中则不是这样,它把更多的事情和责任交给 C++ 程序员去完成,它总相信 C++ 程序员是最优秀的,会自己处理好这一切的所有事情。如果程序中真的出现了未被捕获的异常,系统它(实际上是 C++ 运行库中)就认为这是出现了一个致命的、不可恢复的错误,接着调用 terminate 函数终止该进程( NT 系统中稍微负责任一些,还弹出个“系统错误”对华框,并且 report 出一些与异常相关的错误信息)。 从上面的分析可以看出,Java 异常处理模型的确比 C++ 异常处理模型更严谨和更安全。实际上,这还体现在更多的方面,例如,在 C++ 异常处理模型中,异常的声明已经可以成为声明函数接口的一部分,但这并非语言所强求的。虽然许多优秀的库系统在设计时,都把这当成了一种必须的约定,甚至是编程规范,例如 MFC 中,就有许多可能抛出异常的函数,都显式地做了声明,如 CFile::Read 函数,声明如下: virtual UINT Read( void* lpBuf , UINT nCount ); throw( CFileException ); 但是,在 Java 语言中,这就是必须的。 如果一个函数中,它运行时可能会向上层调用者函数抛出一个异常,那么,它就必须在该函数的声明中显式的注明(采用 throws 关键字,语法与 C++ 类似) 。还记得刚才那条编译错误信息吗?“ must be caught or declared to be thrown ”,其中“ must be caught ”上面已经解释了,而后半部分呢?“ declared to be thrown ”是指何意呢?其实指的就是“必须显式地声明某个函数可能会向外部抛出一个异常”,也即是说,如果一个函数内部,它可能抛出了一种类型的异常,但该函数内部并不想(或不宜) catch 并处理这种类型的异常,此时,它就必须( 注意,这是必须的!强求的!而 C++ 中则不是必须的 )使用 throws 关键字来声明该函数可能会向外部抛出一个异常,以便于该函数的调用者知晓并能够及时处理这种类型的异常。下面列出了这几种情况的比较,代码如下:
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |