【问题标题】:Why does sonar think this scala code is unreachable为什么声纳认为这个scala代码无法访问
【发布时间】:2018-08-22 21:01:47
【问题描述】:

我有一个 Scala 方法,SonarLint(IntelliJ 插件版本 3.2.1.2406)将返回语句标记为“无法访问的代码”。出于本示例的目的,我删除了实际逻辑并替换为 printlns,但它产生了相同的问题。请注意,调试 this 表明 return 语句实际上是可访问的。

def someMethod(): String = {
    try {
        println("Do something here")
    } finally {
        try {
            println("Do something else")
        } catch {
            case e: Exception => {
                println("Exception: " + e.getMessage)
            }
        }
    }
    return "Finished" // Sonarlint 'Unreachable code'
}

此外,删除 catch 块会导致无法访问的代码问题消失。

这是 SonarLint 中的错误吗?还是我错过了什么

【问题讨论】:

  • 如果是那段代码就好了。

标签: scala sonarlint unreachable-code


【解决方案1】:

您需要将“已完成”表达式放在 finally 块中。您的代码将在 Try 或 Catch 中返回。

例子:

    def someMethod(): String = {
    try {
        println("Do something here")
    } finally {
        try {
            println("Do something else")
            "Finished"
        } catch {
            case e: Exception => {
                "Exception: " + e.getMessage
            }
        }
      }
    }

它将返回“已完成”或异常。

在 Scala 中使用 Return 也是多余的 - 只需使用 String 结束即可。

【讨论】:

  • 感谢您的回复 - 是的,我现在已将“完成”放入实际代码中的尝试中。但是我仍然不明白为什么它被认为是不可达的,因为 try 和 catch 都没有返回任何东西。此外,在调试时,我可以看到它实际上返回“完成”。关于 return 关键字,是的,我意识到这不是必需的 - 为了清楚起见,我将其包括在内,否则 sonarlint 问题会更改为略有不同的东西 - 无效的操作或记忆中的类似内容。
  • "您的代码将在 Try 或 Catch 中返回。"如果 OP 是正确的,则不是“调试它表明 return 语句实际上是可访问的。”
猜你喜欢
  • 2018-09-23
  • 2020-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-29
相关资源
最近更新 更多