好奇:为什么是;投掷<;某些特定的>;例外情况;Java本身需要语法吗?
我们都知道这是必要的 但是,当其他具有异常处理能力的类似语言不要求我们编写“抛出异常”时,为什么只在Java中需要它呢?有谁知道Java语言设计时发生了什么,以及他们为什么这样做?只是好奇 另外,这可能不是一个实际的或真正必要的问题——它可能对我正在进行的项目没有任何帮助。但某些语言特征激起了我的好奇心:D 编辑好奇:为什么是;投掷<;某些特定的>;例外情况;Java本身需要语法吗?,java,Java,我们都知道这是必要的 但是,当其他具有异常处理能力的类似语言不要求我们编写“抛出异常”时,为什么只在Java中需要它呢?有谁知道Java语言设计时发生了什么,以及他们为什么这样做?只是好奇 另外,这可能不是一个实际的或真正必要的问题——它可能对我正在进行的项目没有任何帮助。但某些语言特征激起了我的好奇心:D 编辑 看来我的问题很模糊!我想我把这个问题的措辞弄错了。在处理Java代码的编程过程中,我们需要在某些时候使用“抛出异常”语法。但是在C++或C++中,甚至是VB.NET和PHP中都不需要这
看来我的问题很模糊!我想我把这个问题的措辞弄错了。在处理Java代码的编程过程中,我们需要在某些时候使用“抛出异常”语法。但是在C++或C++中,甚至是VB.NET和PHP中都不需要这样的东西。那么,为什么只有Java坚持这一点呢?Java不要求您在函数声明上编写
抛出异常,所以一般来说它不是“需要的”。它要求您声明函数可能引发的异常,这些异常可能根本不是异常,也可能只是运行时异常。事实上,使用抛出异常
可能是惰性编码的一个标志,因为它充当了一个非信息性的包罗万象
编辑-现在您已经编辑了您的问题,您想要的答案(正如其他人所说)是Java有“检查”异常的概念。这只是一个设计决策,据说是为了提高代码质量。从长远来看,这可能没有多大帮助;你不能用语言技巧来修复一个糟糕的编码器。它声明该方法可以引发异常,并允许开发人员及其工具确保他们已经考虑了这种可能性
然而,这个问题并不精确。只有当异常为“已检查”异常时,才需要声明。然后,应该声明一种更具体的异常类型。抛出java.lang.Exception
是一种糟糕的风格
不需要声明运行时异常,即遇到特定错误时运行时引发的异常。如果可以通过更好的编程防止错误,并且不依赖于运行时的环境条件,则应引发运行时异常。有两种类型的异常
检查异常
未检查的异常
throws子句告诉方法抛出哪些选中的异常,以便调用方可以在代码中处理这些异常,或者他们必须添加throws子句,以便最终有人必须处理这些异常。Java是一种非常有组织的语言,在许多情况下可以防止没有经验的用户丢失相关的或重要的东西,至少可以在以后显示错误,并对遗漏的内容给出好的提示或解释。强制您在函数/方法声明中提及异常是一种符合这种政治的方式,同时也是一种允许您定义自己的特定异常并将其付诸使用的方式。正如这里的其他答案所指出的,抛出
子句仅在中需要,这是一个目前只存在于Java中的特性
关于Java检查异常的原因的官方答案是:
为什么设计师们决定强制
指定所有未捕获的对象的方法
检查可以引发的异常
在其范围内?有什么例外吗
可以由方法抛出的是
该方法的公共编程
接口。那些调用方法的人
必须了解
方法可以抛出,以便它们可以
决定如何处理它们。这些
例外情况也是其中的一部分
方法的编程接口作为其
参数和返回值
然而,即使在Java社区内,这一决定也是:
最近,有几家公司受到好评
专家,包括Bruce Eckel和Rod
约翰逊,他已经公开声明
虽然他们最初完全同意
在正统立场被检查的情况下
例外情况,他们得出结论
已检查异常的独占使用是必需的
这个主意没有在会议上看起来那么好
首先,检查异常
已经成为一个重要的资源
许多大型项目的问题。
埃克尔的观点更为极端,
建议所有例外情况都应
不受约束;约翰逊的观点更具说服力
保守,但仍然表明
正统的对支票的偏爱
例外情况太多了。(值得
注意到C#的建筑师
几乎可以肯定的是,我们有很多
有使用Java技术的经验,
选择从中忽略选中的异常
语言设计,使所有
异常未经检查的异常
然而,有没有留下一个空间来进行讨论
已检查异常的实现
稍后。)
就我个人而言,我发现选中的异常只在API习惯于捕获所有异常并将它们作为适合抽象层的东西重新抛出时才有用。例如,恰好使用磁盘或SQL后端缓存数据的内存中对象缓存不应该抛出IOException
或SQLException
——相反,它应该抛出(并声明)一些用户定义的异常,如CacheFailureException
或类似的异常
此外,您可能会发现Ned Batcheld的文章对这个问题很有启发。在Java中声明异常的目的是迫使程序员处理执行程序时可能出现的错误。然而,经验表明,在很多情况下,程序员对异常的“处理”并没有真正处理异常,而是忽略了它们:
void writeToFile() {
try {
...
} catch (IOException ex) {
// Nothing here
}
}
void writeToFile(){
试一试{
...
}捕获(IOEX异常){
//这里什么都没有
}
}
因此,在比Java更新的语言中,设计者不喜欢检查EXEP