Java 艰难的时间低估检查&;非强制
我已经阅读了所有关于这方面的资料,但我仍然不知道如何使用检查和未检查的异常。我想我还是不能理解这个概念。我已经读过StackOverflow,使用未检查的异常比使用已检查的异常更好,但是Eclipse强制我使用已检查的异常,如Java 艰难的时间低估检查&;非强制,java,exception,exception-handling,checked-exceptions,unchecked-exception,Java,Exception,Exception Handling,Checked Exceptions,Unchecked Exception,我已经阅读了所有关于这方面的资料,但我仍然不知道如何使用检查和未检查的异常。我想我还是不能理解这个概念。我已经读过StackOverflow,使用未检查的异常比使用已检查的异常更好,但是Eclipse强制我使用已检查的异常,如FileNotFoundException(好吧,如果Eclipse强制我插入一个try/catch块,它就是一个已检查的异常)。我想知道,有没有办法把checked转换成unchecked?这到底是怎么回事?我不明白处理异常是什么意思 我这里有一个例子,我很想知道如何处理
FileNotFoundException
(好吧,如果Eclipse强制我插入一个try/catch块,它就是一个已检查的异常)。我想知道,有没有办法把checked转换成unchecked?这到底是怎么回事?我不明白处理异常是什么意思
我这里有一个例子,我很想知道如何处理(?)这个问题。这是一个选中的异常,对吗
public void readFile() {
File foo = new File("./foo.bar");
try {
BufferedReader bufferedReader = new BufferedReader(new FileReader(foo));
} catch (FileNotFoundException e) {
// What should I do here?
}
getDataFromFile(bufferedReader);
}
我见过这里的人们做的各种事情。有些人打印堆栈跟踪,这是我通常做的,我看不出有什么问题。它提供了我需要调试的信息。有些人忽略了它们,我认为不应该这样做(我看到JNode OS引导程序忽略了一个异常)。有些人只是在签名中添加throws
声明。有些人在那个东西里面抛出更多的异常!(我想这可能就是使用unchecked而不是checked的意思?)
此外,如果您添加
throws
声明,您将被迫将try/catch块放在更高的位置,如果您有一个非常大的应用程序,这将很不方便。对不起,我简直是不知所措。完全是。我正在努力学习优秀优雅的设计,这让我很痛苦。未经检查的例外情况
是一个例外,因为一开始就不应该发生,因此无法预料。只有当程序有一个bug时,它才会处理出现的情况
它是RuntimeException
的子类(它是Exception
的子类),通常使用IllegalArgumentException
、NullPointerException
或IllegalStateException
实现
未经检查的运行时异常表示通常
也就是说,反映程序逻辑中的错误,并且不能
在运行时从中合理恢复
检查异常 是由于系统其他部分的不可预见的情况而可能发生的事情。它不在您的直接控制范围内,但不一定是一个bug,而是一个可能遇到的案例 它是
异常
的子类
以你为例,, 如果存在某些情况(磁盘已满),则需要处理文件不存在的情况,因为可能会发生这种情况,即使在生产代码中也是如此。这使它成为选中的异常
处理例外情况: 例外情况旨在提供更好的用户体验。所以 您应该向用户报告错误,并在以下情况下正常终止 你不能继续
首先,例外是你的朋友:)-不,真的。异常是一种非常强大和安全的错误处理方式 基本上,Java中检查和未检查异常之间的区别在于对异常的预期反应: 检查异常通常用于将某种“意外”的操作结果传达给调用方,调用方被认为希望显式处理该异常状态 未经检查的异常通常被认为或多或少无法从中恢复。它用于指示假定使整个操作无效的某些故障状况。与
NullPointerException
类似,这些异常在几乎所有操作中或多或少都是潜在的。对它们进行检查意味着呼叫方需要在错误处理方面进行一些严重的开销
在您的示例中,您可能会这样做:
public void readFile() {
File foo = new File("./foo.bar");
try {
BufferedReader bufferedReader = new BufferedReader(new FileReader(foo));
getDataFromFile(bufferedReader); // If the file could not be found above, this will never execute!
} catch (IOException e) {
// React, e.g.:
System.out.println("Data could not be read due to an IO error.");
}
}
重新抛出异常或将一个异常包装到另一个异常中并不少见。-例如,当一个IOException
触发时,您可能希望在将异常按原样或修改后的方式传递给调用方之前,进行一些清理、关闭一些打开的文件等操作,以便调用方能够以适当的方式处理异常
如何处理特定的异常几乎完全取决于您。根据运行代码打印的用户(例如您自己)和环境,stacktrace可能正常。或者,也许,您想在暂停后重试刚才所做的操作。或者,在给出的示例中,您可以向用户显示一条消息,并要求他重新输入文件名&c
另一方面,后者可以有效地使用不同类别的异常:FileNotFoundException
(它是IOException
的子类)可以通过用户交互从中恢复;裸IOException
很可能被认为是无法从恢复的,因为在最坏的情况下,它甚至可能表示某种硬件故障。让我们以您的示例(修改)本身为例进行解释
public void readFile() {
BufferedReader bufferedReader = null;
try {
File foo = new File("./foo.bar");
bufferedReader = new BufferedReader(new FileReader(foo));
} catch (FileNotFoundException e) {
// What should I do here?
}
getDataFromFile(bufferedReader);
}
当您获得FileNotFoundException
exception时,您的bufferedReader不会用文件流初始化。在这种情况下,您的下一个语句,即getDataFromFile(bufferedReader)代码>将失败,因为没有bufferedReader读取数据
因此,在catch
块中,您可以执行以下两种操作之一:
抛出新的自定义异常并从程序返回
请尝试再次更正获取文件句柄时出现的问题(例如
try {
// call to legacy API that still uses checked exceptions
} catch(CheckedException exception) {
throw new BullshitFree(exception);
}