我是Java新手,我读到只有在编译时才会引发检查异常,即如果存在未处理或抛出的检查异常,程序将无法成功编译。如果有什么东西阻止编译器编译代码,那么我们可以删除它或用另一种方式重新编码它,这样问题就不存在了。
例如,如果我们试图打开系统中不存在的文件,我们不应该只打开它。那么为什么需要处理/抛出这些异常呢?
这里的概念问题是,您将编译时发生的事情和运行时发生的情况混为一谈;即当程序由程序员编译时以及当程序由用户运行时。
在编译时,编译器分析程序以确定哪些异常可以被抛出。例如
public static void main(String[] args) {
FileInputStream fis = new FileInputStream(args[0]); // HERE
}
FileInputStream(String)
构造函数被声明为throws IOException
。(查一下。)所以编译器知道HERE
处的语句可能会抛出IOException
。IOException
是一个已检查的异常。(查一下。)
它不知道会。它不可能知道会。。。因为它不知道CCD_ 6将包含什么。这只在运行时才知道;即当程序运行并且用户提供一些命令行参数时。
Q:检查异常在这里是什么意思?
这意味着main
方法要么必须声明为(例如)throws IOException
,要么必须在try-catch语句中捕获它。
Q: 那么,为什么被选中异常呢?
因为它是这样宣布的!
Q: 为什么会这样宣布?
要强制程序员处理打开的文件不存在、不可读等可能性。当程序(最终)运行时。
编译器正在说";对可能发生的事情做点什么&";。
只是重申一下。编译器无法检查文件是否存在,因为它不知道用户将要提供的路径名。即使它确实知道,并且它检查了1该文件在编译时存在,它也不能知道该文件是否在运行时仍存在,可能在不同网络上的完全不同的机器上。。。未来许多年。
1-这是假设。它不起作用。这将毫无意义
您不应该将异常处理视为一个问题,而应该将其视为一种功能。
假设不存在异常。
var file = new File("test.txt");
if (!file.exists()) {
file.createNewFile();
}
var writer = new FileWriter(file);
// ...
可能出了什么问题?
- 在检查文件是否存在和打开读取器之间,文件可能已被另一个线程/进程删除。所以,即使你创造了它,它也不见了->你需要以某种方式锁定文件
- 您的内存已满,因此无法创建文件->您需要检查
createNewFile
的结果 - 该文件存在,但它是一个目录
- 文件被锁定,因为另一个进程正在向其写入->你需要检查它是否被写入
这样就可以了(仍然假设没有例外):
var file = new File("test.txt");
if (!file.exists()) {
if(file.createNewFile()) {
if (!file.isDirectory()) {
if (!isUsed(file)) {
var writer = new FileWriter(file);
// ...
}
}
}
}
这是大量的代码,仍然无法处理第一个问题。
而
var file = new File("test.txt");
try {
var writer = new Filewriter(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
更短、更清晰、更容易理解。
此外,通常情况下,更可能的是,一切都像假设的那样工作,而不是出现任何这些问题。因此,与其假设所有最坏的情况,并事先进行多次检查,不如假设最好的情况,如果出现问题,你就会寻找原因。
这也会影响运行时。如果您运行无异常代码1000次,那么所有这些检查都将运行1000次,无论它们是否失败。对于异常代码,情况并非如此,可能永远不会运行。
必须处理Java中的Checked异常,这就是为什么编译器会抱怨并没有编译代码。
但异常本身要到运行时才会引发,以防发生。
当您编写代码时,您应该只正确处理所有已检查的异常,因此您必须编写一个try catch
块,或者只从方法返回异常。
如果您使用某个引发已检查异常的库,您可以使用我已经解释过的两种方法之一进行处理。
但是在您的代码中,您可以选择使用未检查的异常。
这些类型的异常可以忽略,编译器也会很好。当然,如果在执行过程中引发了其中一个未检查的异常并且没有被捕获,您的应用程序将崩溃。
但在某些情况下,这可能是可取的,因为没有正确的方法来处理Exception,而且它通常是Error
的子类。
无论如何,您不应该考虑如何处理代码中的错误情况,而应该只考虑异常情况。
更多:异常类,错误类