在for循环内初始化变量

时间:2015-10-03 14:25:35

标签: java for-loop

我有一个for循环,我初始化该循环中的变量。 在它之后,我需要操纵那些变量,但是编译器说变量没有初始化

public class Solution {
    static void displayPathtoPrincess(int n, String[] grid) {
        String[][] visual = new String[n][n];
        for (int i = 0; i < n; i++) {
            char[] myGrid = grid[i].toCharArray();
            for (int j = 0; j < n; j++) {
                visual[i][j] = myGrid[j] + "";
            }
        }

        int pX;
        int pY;
        int bX;
        int bY;
        // rescue the princess
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (visual[i][j].equals("p")) {
                    pX = j;
                    pY = i;
                }
                if (visual[i][j].equals("m")) {
                    bX = j;
                    bY = i;
                }
            }
        }
        System.out.println(pY + "");
        System.out.println(pX + "");
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int m;
        m = in.nextInt();
        String grid[] = new String[m];
        for (int i = 0; i < m; i++) {
            grid[i] = in.next();
        }

        displayPathtoPrincess(m, grid);
    }
}
某些时候

if条件为true。事实上,如果我在if内部移动打印语句,它就会起作用 怎么能解决这个问题呢?

4 个答案:

答案 0 :(得分:1)

如果要在条件中初始化变量,则需要将它们设置为默认值:

int pX = 0;
int pY = 0;
int bX = 0;
int bY = 0;

这样,您的编译器将不再返回初始化问题。

修改

我做了一些修改,因为我无法使你的代码工作(从字符串转换为int,char初始化问题数组等)。你能试试吗:

public class Solution {
static void displayPathtoPrincess(String grid) {
    int n = grid.length();
    String[][] visual = new String[n][n];
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            visual[i][j] = String.valueOf(grid.charAt(j));
        }
    }

    int pX = 0;
    int pY = 0;
    int bX;
    int bY;
    // rescue the princess
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (visual[i][j].equals("p")) {
                pX = j;
                pY = i;
            }
            if (visual[i][j].equals("m")) {
                bX = j;
                bY = i;
            }
        }
    }
    System.out.println(pY + "");
    System.out.println(pX + "");
}

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String grid = in.next();

    displayPathtoPrincess(grid);
}

这可能不是你想要做的,但我对你的变量没有任何问题&#39;在条件中初始化的值。

答案 1 :(得分:0)

你可以试试这个

class Demo
{
static int pX;
static int pY;
static int bX;
static int bY;

public static void main(String a)
{
for (int i = 0; i < n; i++) {
    for(int j = 0; j < n; j++) {
        if (visual[i][j].equals("p")) {
            pX = j;
            pY = i;
        }
        if (visual[i][j].equals("m")) {
            bX = j;
            bY = i;
        }
    }
}
System.out.println(pY + "");
System.out.println(pX + ""); 
}

}

答案 2 :(得分:0)

摘自JLS §16 (Definite Assignment)

  

对于局部变量或空白最终字段x的每次访问,x必须为   在访问之前明确分配,或发生编译时错误。

如果在方法中的任何一点使用局部变量,并且编译器在实际运行程序时不确定是否会初始化局部变量,那么编译器将显示错误,请初始化局部变量。

在你的情况下,如果n为0,那么你的for (int i = 0; i < n; i++) {循环将永远不会运行,因此编译器无法确定此时System.out.println(pY + "");pY是否在初始化状态,所以抱怨。

对于解决方案:您必须在使用/读取之前初始化局部变量。

您可以打印pXpY,因为此时编译器肯定会初始化值,但请尝试下面,甚至在您的IF块中,您将看到存在编译错误,因为你会尝试在初始化之前读取局部变量,因此编译器会抱怨。

所以,底线 - 让编译器相信局部变量会在那时被初始化,所以在使用之前初始化局部变量。

if (visual[i][j].equals("p")) {
                    System.out.println(pY + "");  //Compilation error because compiler is not sure if LV would be in initialized state.
                    pX = j;
                    pY = i;
                    System.out.println(pY + "");  //Happy compiler becuse it is sure that LV are just initialized.
                }

答案 3 :(得分:0)

编译器需要看到变量已经明确赋值,而不管执行在运行时实际执行的循环中的哪条路径。

当程序执行时,它不知道是否会运行任何一个if分支。

最好始终为变量赋予初始值以避免出现这类问题。