这一次是个相当理论性的问题。所以我在Eclipse中使用这个函数:
CsvReader csv = new CsvReader("src/maindroite.csv");
因为“未处理的异常类型FileNotFoundException”而无法运行。好的,我知道我必须为文件不存在的情况添加一些东西,在这种情况下,我通常会添加几行来处理异常并丢弃它。但是我的问题是:为什么我需要捕获异常,即使文件确实存在?实际上,为什么我甚至对某些函数有这个例外的东西,而没有其他的呢?
例如,假设我试图运行:
ImageIcon icon1 = new ImageIcon("src/square.jpg");
ImageIcon icon2 = new ImageIcon("src/circle.jpg");
其中存在"square.jpg“,但不存在"circle.jpg”。该程序将创建icon1,但不会创建icon2,因为它不能。但是我不需要为图像不存在的情况添加ExceptionHandler。这两种功能有什么区别?
总结一下:
谢谢!
发布于 2012-01-05 18:47:17
当文件确实存在时,为什么我必须添加一个ExceptionHandler?
基本上必须添加它,因为您不能编写这样的条件代码,简而言之,编译器不可能在运行时之前知道该文件是否存在,因此编译器强制yo放置一个/catch块,因为FileNotFoundException是一个 已选中 异常。
为什么我必须为某些函数而不是其他函数添加一个ExceptionHandler?
**NOT*只需将try/catch块添加到抛出检查异常的任何内容,即**NOT*从RuntimeException
或Error
类继承的任何内容。Error
和RuntimeException
的子类不检查异常,您可以将try/catch放到编译器不关心的位置。由于ImageIcon
的构造函数不抛出任何类型的异常,如果图像不存在,则只返回null,因此不需要执行try/catch块。
发布于 2012-01-05 18:43:58
即使该文件现在存在,但在您的系统中,以后也可能不存在。或者,您可以将此代码提供给没有src/square.jpg
的人。或者可能会出现硬件故障,硬盘上的某些东西被损坏,不小心删除了src/src.src。也许用户甚至可以删除这些文件。
Java中的异常处理迫使您考虑在最坏的情况下,如果发生了一些非常糟糕的事情会发生什么(比如src/square.jpg
丢失了)。你会撞车吗?继续下去就像什么都没发生一样好吗?您将在catch子句中决定如何处理这些故障模式。
有些函数不要求您处理异常,因为在可以合理地期望您处理的函数中没有任何可能出错的地方。
发布于 2012-01-05 18:47:58
1)当文件存在时,为什么要添加ExceptionHandler?
因为Java编译器无法知道该文件在某些任意运行时是否实际存在。(假设在编译后但在运行程序之前删除了该文件?)基本上,您的代码必须始终具有处理条件所需的逻辑,这些条件是不希望发生的,但无论如何也可能发生。
2)为什么我必须为某些函数而不是其他函数添加一个ExceptionHandler?
可能有各种原因,但这是你可能看到的原因。每个方法都会抛出异常,但如果将异常向上传播,则每个try/catch块或每个方法都会被捕获。在您的示例中,您可以将对ImageIcon
构造函数的每个调用包装在自己的try/catch块中,或者将两者结合在一起,这取决于您想要做什么:
try {
icon1 = new ImageIcon("f1.jpg");
} catch (Exception e) { /* Handle the case for missing "f1.jpg". */ }
try {
icon2 = new ImageIcon("f2.jpg");
} catch (Exception e) { /* Handle the case for missing "f2.jpg". */ }
与之相比:
try {
icon1 = new ImageIcon("f1.jpg");
icon2 = new ImageIcon("f2.jpg");
} catch (Exception e) { /* Handle the case for missing "f1" or "f2". */ }
https://stackoverflow.com/questions/8747921
复制相似问题