【问题标题】:Java: How to @SuppressWarnings unreachable code?Java:如何@SuppressWarnings 无法访问的代码?
【发布时间】:2011-05-17 01:33:05
【问题描述】:

有时在调试时,您会遇到无法访问的代码片段。有没有办法抑制警告?

【问题讨论】:

  • 可能不会 - 无法访问的代码通常是错误编码方法的标志。你能把它贴出来吗?一定有办法重构它。
  • 听起来他添加了一个提前返回,或者可能是一个if (false) ...,用于调试。没有错。
  • 为什么在调试过程中不显示警告?该警告用于提醒您在完成调试后删除代码 - IMO 最好 not 禁止任何与调试相关的警告。对于生产代码中的已知和不需要的警告,抑制是有意义的。
  • @vaxquis 但有些代码永远不会用于生产。并不意味着您会编写糟糕的代码,但较少的警告会很好。
  • @vaxquis 我不能再同意了。

标签: java suppress-warnings unreachable-code


【解决方案1】:

Java 对这样的调试具有(原始)支持,因为布尔常量上的简单 if 不会生成此类警告(实际上,当评估为假时,编译器将删除整个条件块)。所以你可以这样做:

if(false) {
    // code you don't want to run
    }

同样,如果您临时插入提前终止以进行调试,您可以这样做:

if(true) { return blah; }

if(true) { throw new RuntimeException("Blow Up!"); }

请注意,Java 规范明确声明在编译时会删除不断为假的条件块,而 IIRC,不断为真的条件块会删除条件。这包括:

public class Debug
{
static public final boolean ON=false;
}

...

if(Debug.ON) {
    ...
    }

【讨论】:

  • javac 不会为 if (false) 生成警告,但 Eclipse 编译器会。
  • @Daniel:这很不幸;它不应该用于普通的 if(false) 或者当唯一的条件变量是 static final boolean 设置为 false 时。
  • 我喜欢这个警告,因为它提醒我回去对死代码做点什么,但 IIRC 在旧版本的 Eclipse 中默认为错误,所以我会求助于 if (Math.abs(0) == 0) 之类的东西.
  • +1 这不会在 Java 中导致任何“死代码”警告。关键是您的常量布尔标志必须是if 中的唯一表达式。如果您使用if (Debug.ON),这将起作用,但if (Debug.ON && anotherExpression) 将不起作用(生成警告)。顺便说一句,“死代码”警告不等同于“无法访问代码”错误
  • @Daniel:你的例子,if (Math.abs(0) == 0) 不是我所说的那种常量表达式;我所说的只是那些编译器内联到if(false)if(true)的。当在代码中使用常量final 变量时,编译器会内联它的值而不是引用。您需要阅读有关常量最终和非恒定最终(或从派生值分配)之间差异的规范。
【解决方案2】:

在任何编译器上执行此操作的唯一方法是@SuppressWarnings("all")

如果您使用的是 Eclipse,请尝试@SuppressWarnings("unused")

【讨论】:

  • 这根本不是唯一的方法。请参阅我的回答 (stackoverflow.com/a/6025389/8946)。
  • @SoftwareMonkey 您的方法仍然会在 Eclipse 和 IntelliJ 中引起警告。这是唯一适用于编译器和 IDE 的解决方案。
【解决方案3】:

作为Cletus tells us

这取决于您的 IDE 或编译器。

也就是说,至少对于 Eclipse,没有办法做到这一点。在我的 Eclipse 配置中,无法访问的代码会导致编译时错误,而不仅仅是警告。另请注意,这与“死代码”不同,例如

if (false)
{
    // dead code here
}

Eclipse(默认情况下)发出警告,而不是错误。

【讨论】:

  • 您可以通过在 return 或 throw 语句前使用“if (true)”将代码从“无法访问”更改为“死”。
【解决方案4】:

根据Java Language Specification

如果由于无法访问而无法执行语句,则这是编译时错误。

您有时可以将无法访问的代码变成死代码(例如,if (false) {...} 的主体)。但它是一个错误是语言定义的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多