什么是运行时异常以及什么是已检查/未检查异常以及错误/异常之间的区别。为什么这么多类型?相反,Java可能只是遵循一个简单的设计(只是尝试/捕获所有类型)来处理程序中的异常情况?
答案 0 :(得分:29)
Throwable是所有例外的最高点。 在Throwable下面你有错误和异常。 在Exception下面你有RuntimeException。
Java有两种类型的例外 - 已选中和未选中。检查的异常由编译器强制执行(您必须在throws子句中声明它们并最终捕获它们)。对于在throws子句中捕获或声明,不会强制执行未经检查的异常。
(答案中有争议的部分)
存在Throwable,因此所有异常类型都有父级。你永远不应该声明你扔掉了Throwable并且永远不会抓住它(除非你真的真的知道你在做什么)。
存在错误,表示运行时环境存在问题,程序可能无法从中恢复,例如格式错误的类文件或内存不足的VM。除非你真的知道自己在做什么,否则不应该发现错误。
异常作为所有非程序员错误的根存在(请参阅RuntimeException以了解“异常”),例如由于磁盘已满而无法创建文件。你不应该抛出,抛出或捕获异常。如果你必须捕捉异常,请确保你知道你在做什么。
存在RuntimeException以指示所有程序员错误,例如超过数组末尾或调用null对象上的方法。这些是你应该修复的东西,这样它们就不会抛出异常 - 这表明你,程序员,搞砸了代码。除非你知道自己在做什么,否则你不应该抓住这些。
答案 1 :(得分:28)
由于我是一名新的Java开发人员,因此在区分和处理不同类型的异常时也遇到了一些困难。这就是为什么我在这个主题上做了一个简短的说明,每当我感到困惑时,我都会经历它。这里是Throwable
类层次结构的图像:
[图片由JavaTpoint提供]。
此处需要记住三个关键类:Throwable
,Exception
和Error
。在这些类Exception
中,可以分为两种类型:" Checked Exception"和"未经检查的例外"。
已检查例外:
Throwable
和RuntimeException
之外,这些是扩展Error
的类。 try/catch
处理它们或在函数签名中指出它throws
它们和强制我们在来电者处理他们。IOException
,SQLException
等未选中的例外:
RuntimeException
的类称为未经检查的例外。ArithmeticException
,NullPointerException
,ArrayIndexOutOfBoundsException
等。ArithmeticException
,可以通过对除数的简单检查来避免。同样,我们可以通过简单地检查引用来避免NullPointerException
:if (object != null)
或甚至使用better techniques。错误:强>
Error
指的是try/catch
未处理的无法恢复的情况。OutOfMemoryError
,VirtualMachineError
,AssertionError
等。为什么这么多类型?
除Stephen C的答案外,我想说:
异常处理是Java中相对昂贵的操作。 我们不应该将所有特殊情况放在try/catch
块中。过度使用try/catch
可能会妨碍计划效果。
总之,Exception
应尽可能以编程方式处理。另一方面,我们无法处理Error
,因此这些可能是为什么存在多种类型的异常的一些逻辑原因。
答案 2 :(得分:3)
TofuBeer's answer清楚地解释了异常类的含义。
为什么这么多类型?相反,Java可能只是遵循一个简单的设计(只是尝试/捕获所有类型)来处理程序中的异常情况?
为什么呢?因为他们是必要的!如果没有这4个类,那么按广义类别处理异常将是不切实际的。
Error
类,你会如何捕获“所有致命的JVM错误?”Exception
类,您如何捕获“不是JVM致命错误的所有异常”?RuntimeException
类,您将如何捕获“所有未经检查的异常”?答案 3 :(得分:0)
运行时异常为您提供了避免捕获和声明异常的灵活性。
答案 4 :(得分:0)
答案 5 :(得分:0)
已检查和未检查的异常之间的区别:
检查异常和未检查异常之间有很多差异,但是所有差异都源于一次基本的考虑,即异常是否可由编译器解决。
要记住的要点是:
[1]已检查的异常表示编译器已检查的异常。这意味着编译器要求通过try-catch块或throws关键字处理此类异常。
[2]未检查的异常是编译器没有提供任何授权的异常,因为开发人员可以通过编码/编程来解决它们,因为控制流是可控制的,如ArithmeticException,NullPointerException ArrayIndexOutOfBoundsException ,IllegalArgumentException等。
我将其称为“ Exception-Identity-Test” ,您可以在其中从Java文档中获取任何随机异常,然后只问一个问题。 “例外!可以通过编程方式解决吗?”
如果异常说是,则它是未经检查的异常,因为可以通过代码更改或解决某些计算错误等方式来解决。
另一方面,如果“异常”显示为“ 否”,则这是“已检查的异常”,如已检查的异常控制流超出了我们的代码,例如有人更改了数据库密码或有人拔出了网络电缆,连接超时(ConnectException),找不到某些资源(FileNotFoundException,ClassNotFound),SQLException,InvocatonTargetException等。这些不能通过编程来解决
答案 6 :(得分:-1)
此article以简洁明了的方式总结了 Checked 和 Unchecked 异常。
已检查的异常 :已检查的异常是可以在编译时检测,识别和检查的异常。如果代码块引发了检查的异常,则该方法必须处理该异常,或者必须使用throws
关键字指定该异常。
示例:
public void testDB() throws ClassNotFoundException, SQLException
{
Class.forName("com.mysql.jdbc.Driver");
System.out.println("Driver Loaded");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/selenium","root","root");
System.out.println("Connected to MySQL DB");
}
我们要么需要使用throws指定异常列表,要么需要使用try-catch{}
块。我已经在下面的程序中演示了throws
的用法。
未经检查的异常 :未经检查的异常在编译时不进行检查。 Error
和RuntimeException
类下的Java异常是未经检查的异常,而 throwable 下的其他所有事物都经过检查。
摘要:如果可以合理预期客户端会从异常中恢复,请将其设置为已检查的异常。如果客户端无法采取任何措施来从异常中恢复,请将其设置为未经检查的异常。
答案 7 :(得分:-1)
Exceptions are two types in java:
1. **Checked Exception: The exceptions which are checked by compiler.
例如:我们正在对文件执行操作,然后编译器将要求您通过try-catch块或throws关键字处理IOException。
2. Unchecked Exception: The exceptions which are not checked by compiler at run time.
例如:如果您正在对一个对象执行操作而不创建它;在这种情况下,您将获得NullPointerException。