- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了org.sonar.plugins.java.api.tree.TryStatementTree
界面,同时查看 SonarQube 插件的一些代码。实现的规则之一会检查 try-with-resources block 中定义的变量。
查看 TryStatementTree#resourceList
,我可以看到它返回 ListTree<Tree>
。这可以通过多种方式进行迭代。在一种情况下,插件检查声明的变量的名称。发生这种情况时,Tree
被转换为 VariableTree
因为Tree
是一个更通用的接口(interface),不提供通过 IdentifierTree
对变量名称的访问.
这是我正在查看的代码中的强制转换的位置,一个扩展 BaseTreeVisitor
的类并实现JavaFileScanner
.
@Override
public void visitTryStatement(TryStatementTree tree) {
// ...
tree.resourceList().stream()
.filter(resource -> resource instanceof VariableTree) // Is it possible for this condition to evaluate to false?
.map(VariableTree.class::cast)
.map(resource -> resource.simpleName().name())
.forEach(SomeClass::handleThisCase);
// ...
}
查看Java Language Standard ,我无法想到 try
时的情况。语句将用一些不是标识符列表的东西来代替资源声明。
我认为这与表示不存在的资源定义或类似的东西的需要有关,所以我向它扔了一些单元测试用例。
try { // No resource declaration here
// ...
} catch (SomeException ex) {
// ...
}
但在这种情况下根本没有调用该方法,我猜这是由 BaseTreeVisitor
处理的.
我一直在尝试想出一些示例来使转换变得不可能,但我想出的所有内容要么无法编译,要么从不遵循此执行路径。
我是否缺少编写 try
的方法?使更通用的声明 Tree
更好的选择?或者这种选择是否源于库中接口(interface)的构造方式?它似乎没有由任何 super 接口(interface)强制执行( TryStatementTree
-> StatementTree
-> Tree
)。 resourceList
由 TryStatementTree
定义本身。
最佳答案
讽刺的是,我在 SonarQube documentation 中偶然发现了答案。发布问题后几分钟。
事实证明,有一种方法的工作原理完全符合我的预期,即 TryStatementTree#resource
,该方法已被弃用,然后被删除,取而代之的是 TryStatementTree# resourceList
,这正是我的代码所使用的。
Deprecated method
org.sonar.plugins.java.api.tree.TryStatementTree.resources()
has been removed, in favor oforg.sonar.plugins.java.api.tree.TryStatementTree.resourceList()
, as Java 9 allows other trees thanVariableTree
to be placed as resources intry-with-resources
statements.
这是一个例子:
SomeAutoCloseableClass myResource = obtainOneSomehow();
try (myResurce) { // No resource declaration here, just an identifier
// ...
} catch (SomeException ex) {
// ...
}
我的项目是在源代码级别设置为 Java 8 兼容性的情况下编译的,应该对其进行修改,并添加新的单元测试用例,以确保编写 try-with-resources
block 已处理。
关于java - Sonar 的 TryStatementTree#resourceList 什么时候返回不是 VariableTree 的 Tree?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61124346/
我遇到了org.sonar.plugins.java.api.tree.TryStatementTree界面,同时查看 SonarQube 插件的一些代码。实现的规则之一会检查 try-with-re
我是一名优秀的程序员,十分优秀!