我是Java新手,在Exception
主题上我有一些问题:
Exception
类可以捕获所有异常,那么为什么我们有这么多例外
定义?Exception
课程位于java.lang package
,IOException
位于java.io package
和
EmptyStackException
是in java.util package
。为什么他们在不同的包装?答案 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中,最好的方法是在包中创建一个对类本身最有意义的类,无论该类是否在其他包中实现了接口。