“如何关闭”;java:变量可能尚未初始化";

“如何关闭”;java:变量可能尚未初始化";,java,Java,我有以下代码: public static void main( String[ ] args ){ int begin, end; try{ begin = Integer.valueOf( args[ 1 ] ); end = Integer.valueOf( args[ 2 ] ); }catch( NumberFormatException conversion_error ){ System.out.printl

我有以下代码:

public static void main( String[  ] args ){
    int begin, end;
    try{
        begin = Integer.valueOf( args[ 1 ] );
        end = Integer.valueOf( args[ 2 ] );
    }catch( NumberFormatException conversion_error ){
        System.out.println( "Not A Number." );
        System.exit( 1 );
    }
    if( begin >= end ){
        System.out.println( "Wrong arguments. (" + begin + " >= " + end + ")" );
        System.exit(1);
    }
    System.out.print( "OK." );
    System.exit(0);
}
当我试图编译它时,我得到了这个错误

错误:(13,13)java:变量begin可能尚未初始化 错误:(13,22)java:变量端可能尚未初始化

我理解为什么编译器会警告我,但我的代码的真正目的是处理这样的情况:当变量未初始化时,我关闭我的程序。在这种情况下,我从不使用它们

我认为答案相当简单:在“try”块外初始化“begin”和“end”,例如,立即为它们赋值零

int begin = 0, end = 0;

但我能强迫编译器忽略这个问题吗?有没有办法关闭对我代码的这种好奇的检查?除了变量的可能错误值之外,我的程序没有任何技术问题。

就像其他人说的那样,你没有禁用错误,而是修复代码中的错误。我建议这项工作

public static void main( String[  ] args ){
    int begin, end;
    try{
        begin = Integer.valueOf( args[ 1 ] );
        end = Integer.valueOf( args[ 2 ] );

        if( begin >= end ){
            System.out.println( "Wrong arguments. (" + begin + " >= " + end + ")" );
            System.exit(1);
        }
        System.out.print( "OK." );
        System.exit(0);
    }catch( NumberFormatException conversion_error ){
        System.out.println( "Not A Number." );
        System.exit( 1 );
    }
}

系统的javadoc中退出

终止当前运行的Java虚拟机

您的编译器不会预先判断jvm是否会关闭,程序是否会退出

如果更改
系统,则退出(1)
返回,编译器将认识到此时,您将把控制流返回给调用方法。
由于您在程序的
main
类的
main
方法中,它也将终止程序。直到现在,编译器才知道这一点

您可以使用以下代码,但请注意,在这种情况下,您不会向操作系统发送
状态代码1

public static void main( String[  ] args ) {

try{
    final int begin = Integer.valueOf( args[ 1 ] );
    final int end = Integer.valueOf( args[ 2 ] );

    if( begin >= end ) {
        System.out.println( "Wrong arguments. (" + begin + " >= " + end + ")" );
        System.exit(1);
    }

} catch( NumberFormatException conversion_error ) {
    System.out.println( "Not A Number." );
    return;
}

System.out.print( "OK." );
System.exit(0);
}

不,你不能把它关掉。编译器坚持不使用未初始化的变量。这是一个好主意


你需要修复你的代码。具体来说,取决于先前
try
块中代码成功与否的代码应该在
try
块中。

可以说有合理的原因,您可能希望忽略/抑制变量,但可能未初始化警告。。。例如,在测试中初始化@Before方法中的变量时。在这种情况下,您可以使用:
@SuppressWarnings(“InstanceVariableMayNotBeInitialized”)

注意:我会添加一个结尾注释来解释原因


@SuppressWarnings(“InstanceVariableMayNotBeInitialized”)//在@Before中初始化

  • 您希望在静态方法中使用变量
  • 您有类似于循环或开关的构造,因此由于块范围和花括号,您无法确定在何处初始化
  • 答案是:
    • 1将变量声明为静态变量
    • 2创建具有在类级别定义的属性的类实例。
      • 然后对该类实例调用一个方法
      • 所以你会得到这样的结果:
  • 您还可以不引入类级属性,也可以通过重构,将内容分解为返回类型的方法,并且所有类型都在同一作用域块中

的可能重复作为一般经验法则,编译器试图帮助您避免代码可能产生的问题。您可以将值初始化为默认的已知值…请查看“默认值”部分<代码>开始
结束
将不会被分配默认值。这会导致问题,因为您正在
if
语句中使用它们。你别无选择,只能初始化它们。你问的问题不对。您不想关闭它:您想修复代码,使其能够编译。修复它的正确方法是将所有使用
begin
end
的代码放在
try
块中,它应该放在第一位。问题是关于错误,而不是警告,这是由局部变量引起的,不是实例变量。
public class Solution {
    private int i;
    private double d;
    private String s;
    private Solution() {
        i = 0;
        d = 0.0;
        s = null;
    }
    private void processInput() {
       /* using i in here now, instead of i in main
        * since that's the equivalent of this.i now instead
        * ... unless you defined int i in the method!
        */
    }
    public static void main(String[] args) {
        Solution s = new Solution();
        s.processInput();
    }
}