声明抛出IOException的Java方法未向上传播异常问题排查
疑问:已声明throws IOException,为何异常看似停在方法内未向上传播?
相关方法代码
(388) protected String getExtension(BufferedInputStream stream) throws IOException, MimeTypeException { (389) TikaConfig config = TikaConfig.getDefaultConfig(); (390) MediaType mediaType = config.getMimeRepository().detect(stream, new Metadata()); (391) MimeType mimeType = config.getMimeRepository().forName(mediaType.toString()); (392) String extension = mimeType.getExtension(); (393) return extension; (394) }
调用堆栈信息
java.io.IOException: The process cannot access the file because another process has locked a portion of the file The process cannot access the file because another process has locked a portion of the file at java.base/java.io.FileInputStream.readBytes(Native Method) at java.base/java.io.FileInputStream.read(FileInputStream.java:328) at java.base/java.io.BufferedInputStream.fill(BufferedInputStream.java:291) at java.base/java.io.BufferedInputStream.read1(BufferedInputStream.java:347) at java.base/java.io.BufferedInputStream.implRead(BufferedInputStream.java:420) at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:399) at java.base/java.io.FilterInputStream.read(FilterInputStream.java:95) at org.apache.tika.mime.MimeTypes.readMagicHeader(MimeTypes.java:325) at org.apache.tika.mime.MimeTypes.detect(MimeTypes.java:527) at com.mbm.mediaorganizer.RelocateFileVisitor.getExtension(RelocateFileVisitor.java:390) at com.mbm.mediaorganizer.RelocateFileVisitor.relocateFile(RelocateFileVisitor.java:163) at com.mbm.mediaorganizer.RelocateFileVisitor.visitFile(RelocateFileVisitor.java:79) at com.mbm.mediaorganizer.RelocateFileVisitor.visitFile(RelocateFileVisitor.java:1) at java.base/java.nio.file.Files.walkFileTree(Files.java:2810) at java.base/java.nio.file.Files.walkFileTree(Files.java:2881) at com.mbm.mediaorganizer.MediaOrganizer.run(MediaOrganizer.java:214) at com.mbm.mediaorganizer.MediaOrganizer.main(MediaOrganizer.java:63)
问题解答
这个异常已经向上传播了,你是对调用堆栈的含义产生了误解:
- 堆栈中的
com.mbm.mediaorganizer.RelocateFileVisitor.getExtension(RelocateFileVisitor.java:390)这一行,仅表示异常是在执行这一行调用的第三方detect方法时触发的,并非异常卡在此处未继续传递。 - 你的
getExtension方法已声明throws IOException,所以会直接将第三方方法抛出的IOException向上传递,无需额外捕获处理,这完全符合Java异常处理规则。 - 从完整堆栈可清晰看到传播路径:异常从
MimeTypes.detect抛出后,经getExtension依次传递到relocateFile、visitFile,再进入JDK的Files.walkFileTree方法,最终传到MediaOrganizer.main方法。
内容的提问来源于stack exchange,提问作者mbmast
相关产品推荐
相关产品推荐

