Java:如何@SuppressWarnings无法访问的代码?

Java:如何@SuppressWarnings无法访问的代码?,java,suppress-warnings,unreachable-code,Java,Suppress Warnings,Unreachable Code,有时在调试时,会出现无法访问的代码片段。是否仍有抑制警告的方法?在任何编译器上执行此操作的唯一方法是@SuppressWarnings(“all”) 如果您使用的是Eclipse,请尝试使用SuppressWarnings(“unused”)作为 这取决于您的IDE或编译器 也就是说,至少对于Eclipse来说,没有一种方法可以做到这一点。在我的Eclipse配置中,无法访问的代码会导致编译时错误,而不仅仅是警告。还要注意,这与“死代码”不同,例如 Eclipse(默认情况下)会发出警告,而不是

有时在调试时,会出现无法访问的代码片段。是否仍有抑制警告的方法?

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

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

作为

这取决于您的IDE或编译器

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

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

Java(原语)支持这样的调试,简单的
如果布尔常量上的
不会生成这样的警告(事实上,当计算为false时,编译器将删除整个条件块)。因此,您可以:

if(false) {
    // code you don't want to run
    }
同样,如果临时插入提前终止以进行调试,则可以这样做:

if(true) { return blah; }

请注意,Java规范明确声明在编译时删除持续错误的条件块,而IIRC、持续正确的条件块将删除该条件。这包括:

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

...

if(Debug.ON) {
    ...
    }
根据报告:

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


有时可以将无法访问的代码转换为死代码(例如,
if(false){…}
)的主体)。但这是一个错误,这是语言定义的一部分。

可能不是-无法访问的代码通常是编码错误的标志。。你能把它贴上去吗?一定是某种重构的方法。听起来他添加了一个早期返回,或者可能是一个
if(false).
,用于调试。这没什么问题。为什么在调试期间不显示警告?警告提醒您在完成调试后删除代码-IMO最好不要抑制任何与调试相关的警告。对于生产代码中已知的和不需要的警告,抑制是有意义的。@vaxquis,但有些代码永远不会到达生产代码。这并不意味着你会编写糟糕的代码,但减少警告就好了。@vaxquis我完全同意。这根本不是唯一的方法。请参阅我的答案()。@SoftwareMonkey您的方法仍然会在Eclipse和IntelliJ中引起警告。这是唯一可以跨编译器和IDE工作的解决方案。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&&anotexpression)
将不起作用(生成警告)。顺便说一下,“死代码”警告并不等同于“无法访问的代码”错误。@Daniel:您的示例中,
if(Math.abs(0)==0)
不是我所说的那种常量表达式;我所说的只是编译器内联到
if(false)
if(true)的那些
。当在代码中使用常量
final
变量时,编译器会内联该变量的值,而不是它的引用。您需要阅读有关常量final和非常量final(或从派生值赋值)之间差异的说明。您可以使用“if(true)”将代码从“不可访问”更改为“无效”在return或throw语句前面。
if(true) { throw new RuntimeException("Blow Up!"); }
public class Debug
{
static public final boolean ON=false;
}

...

if(Debug.ON) {
    ...
    }