我有一个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
内部移动打印语句,它就会起作用
怎么能解决这个问题呢?
答案 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
是否在初始化状态,所以抱怨。
对于解决方案:您必须在使用/读取之前初始化局部变量。
您可以打印pX
和pY
,因为此时编译器肯定会初始化值,但请尝试下面,甚至在您的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分支。
最好始终为变量赋予初始值以避免出现这类问题。