'局部变量XXX可能尚未初始化'错误 - 为什么它出现在我的代码中,而在这个例子中没有?

Sol*_*ace 0 java if-statement initialization local-variables

每当我在一个方法中声明一个局部变量然后在if/else块或try/catch等条件中为它赋值时,然后尝试返回变量,我得到编译器错误

The local variable XXX may not have been initialized
Run Code Online (Sandbox Code Playgroud)

我知道if/else或try/catch块可能不会在某些条件下执行,因此该变量将不会被初始化,从而导致错误.

但更多时候,我遇到的代码中,他们没有初始化变量,但仍然有效.对于例如,此页面上,看到下面的方法:

public int getItemViewType ( int position ) {
        int viewType;
        if ( groups.get ( position ).getImagePath () != null ) {
            viewType = TYPE_IMAGE;
        } else {
            viewType = TYPE_GROUP;
        }
        return viewType;
    }
Run Code Online (Sandbox Code Playgroud)

当我编写相同的方法时,我在return语句中得到了错误.我的方法与这个方法的唯一区别在于我只有ifelse-if块,没有else块.

人们是否通过对方法或其他东西的一些注释来抑制这个错误,我不这么认为.

那么为什么他们不会得到错误,而我呢?

Kar*_*hik 6

它起作用,因为当你到达return语句时,viewType保证有一个值.

    int viewType;
    if ( groups.get ( position ).getImagePath () != null ) {
        viewType = TYPE_IMAGE;
    } else {
        viewType = TYPE_GROUP;
    }
    return viewType;
Run Code Online (Sandbox Code Playgroud)

它会有TYPE_IMAGE或者TYPE_GROUP

在您的代码中,您可能会做一些事情:

     int viewType;
     try{
        // some code which can cause an exception.
        viewType=something;          

     } catch(Exception e){}

     return viewType;
Run Code Online (Sandbox Code Playgroud)

要么

       int viewType;
       if(some condition){
          viewType=something;          
       }
       return viewType;
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,您都无法保证viewType在到达return语句时会有值.

如果try块抛出任何异常或块中的条件失败if,viewType则不会有任何值.

这就是为什么你会得到错误.但是在您发布的代码中并非如此,代码保证具有一定的价值.