检查异常非常强大,因为它们允许您强制使用点处理异常情况。如果使用点不处理异常情况(或公开宣布不处理),则代码将无法编译。
但是,这是编译时。运行时怎么样?
运行时检查异常和未检查异常之间是否存在任何有意义的区别?
我唯一能想到的是未经检查的异常扩展RuntimeException
,但我没有看到任何RuntimeException
允许它在运行时被区别对待的属性。
检查异常非常强大,因为它们允许您强制使用点处理异常情况。如果使用点不处理异常情况(或公开宣布不处理),则代码将无法编译。
但是,这是编译时。运行时怎么样?
运行时检查异常和未检查异常之间是否存在任何有意义的区别?
我唯一能想到的是未经检查的异常扩展RuntimeException
,但我没有看到任何RuntimeException
允许它在运行时被区别对待的属性。
我有以下项目结构。
ProjectName
|
|---src
|
|---main
|
|---java
| |
| |---ModuleName
| |
| |---module-info.java
| |
| |---PackageName
| |
| |---Main.java
|
|---resources
|
|---ResourceParentFolder
|
|---ResourceSubFolderA
| |
| |---Resource1A.png
| |---Resource2A.png
| |---Resource3A.png
|
|---ResourceSubFolderB
|
|---Resource1B.png
|---Resource2B.png
|---Resource3B.png
我有一个 shell 脚本来编译代码,然后运行该代码。
javac \
--module-source-path="src/main/java" \
--module=ModuleName \
-d classes
java \
--module-path="classes;src/main/resources" \
--module=ModuleName/PackageName.Main
我还有一个 shell 脚本,可以将编译后的代码转换为模块化 jar,然后运行该 jar。
jar \
--verbose \
--create \
--file run/executable/jar/ProjectName.jar \
--main-class PackageName.Main \
-C classes/ModuleName . \
-C src/main/resources .
java \
--module-path="run/executable/jar" \
--module=ModuleName/PackageName.Main
在我的 main 方法中,我调用了java.lang.module.ModuleReader
,特别是它的list()方法,它允许我遍历我的模块及其内容。
如果我获取 jar 文件并尝试运行它,我就可以看到 my 的内容ResourceParentFolder
,但调用仅在我仅运行编译的代码时list()
返回文件。.class
这是因为我的模块配置错误吗?或者这只是不受支持的功能?
再次,ModuleReader.list()
当作为 jar 运行时,返回源代码和资源文件夹内容的递归列表,但它仅在作为编译代码运行时返回源代码。如何让编译后的代码也填充ModuleReader.list()
?或者这只是不支持的功能,除非它在罐子或其他东西中?
需要明确的是,我很清楚有一百万种和其他一种获取资源的方法。但我想知道是否可以按照我上面要求的方式做到这一点。如果不是,那又是为什么呢?
编辑——详细说明我的一些失败的尝试。
我尝试将src/main/resources
目录复制到classes
模块的位置,然后将其变成 jar 。不幸的是,它什么也没捡到。
我也尝试这样做--patch-modules
,但也失败了,但出现错误。
error: no source files
这是我使用的命令。
javac --patch-module ModuleName=src/main/resources