如果Exception类可以捕获所有异常,那么为什么我们定义了如此多的异常?

时间:2014-06-17 12:04:59

标签: java exception

我是Java新手,在Exception主题上我有一些问题:

  1. 如果Exception类可以捕获所有异常,那么为什么我们有这么多例外 定义?
  2. Exception课程位于java.lang packageIOException位于java.io packageEmptyStackExceptionin java.util package。为什么他们在不同的包装?

4 个答案:

答案 0 :(得分:1)

  

如果Exception类可以捕获所有异常,那么为什么我们有这么多例外   定义

因此代码可以捕获特定的异常以执行特定的操作。像这样:

 try{
    ...
 } catch(FileNotFoundException e) {
    logger.log("No such file or permission denied {}",file);
 } catch(IOException e) {
    logger.log("I/O error while reading file {}",file);
 }
  

为什么他们在不同的包中

因为包将概念上相似的类组合在一起。由于Exception是一个广义概念,因此不同的异常类不需要彼此相似。所有异常类属于同一个包都是错误的。

答案 1 :(得分:0)

因为在大多数情况下;你需要确切地知道出了什么问题。 它是由错误的输入引起的,是您尝试提供的服务不可用吗?对于每种不同类型的异常,您可能希望实现不同的处理。

例如,如果用户提供了无效输入,则说明错误,您可能想要删除错误的信息。如果数据库不可访问,您可能希望将其写入内存,并在数据库变得可访问时重新尝试。

对于技术异常(数据库无法访问,....),您不希望处理与业务异常相同的处理(例如,用户提供的输入毫无意义)。

毕竟,对于第一种类型,你有责任。您需要对代码进行解密。 对于第二种类型,您的用户应该阅读用户手册,并学习如何使用该软件。

这些只是一些例子,其中有很多。

答案 2 :(得分:0)

Java实现的编程模型允许程序设计既可以检测和处理异常......也不仅仅是检测和提交程序自杀。而不是让程序必须对单个异常进行某种深入检查以找出出错的地方,不同的异常允许编写代码来轻松处理特定条件。

答案 3 :(得分:0)

因为您可能需要专门的例外。

对于isntance,IOException告诉您遇到的异常与IO有关。此外,在捕获异常时,您可能希望对IOException和ExecutionException采取不同的行为:

try{ 
    // ... 
} catch (IOException e) {
    // do something for IOException
} catch (ExecutionException e) {
    // do something for ExecutionException
}

此外,某些Exception可能具有特定属性:您可以在读取文件时创建一个Exception,使其具有int line属性,指示哪一行引发了异常。

在Java中,最好的方法是在包中创建一个对类本身最有意义的类,无论该类是否在其他包中实现了接口。