我已经编写了一些代码来查找矩阵的鞍点(矩阵中的元素,它是其相应行的最大元素,同时是其列的最小值)的位置。但是,有一个错误说:
The local variable col may not have been initialized
at SaddlePoint.findSaddle(SaddlePoint.java:41)
at SaddlePoint.main(SaddlePoint.java:52)
我无法理解为什么这么说。任何帮助将非常感谢。下面我给出了我的代码:
public class SaddlePoint {
int arr[][]=new int[4][5];
public SaddlePoint(int x[][])
{
for(int i=0;i<arr.length;i++)
for(int j=0;j<arr[i].length;j++)
arr[i][j]=x[i][j];
}
public void display(int x[][])
{
System.out.println();
for(int i=0;i<arr.length;i++)
{for(int j=0;j<arr[i].length;j++)
System.out.print(arr[i][j]+"\t");
System.out.println();
}
}
public void findSaddle()
{
int row,col,flag;
for(int i=0;i<arr.length;i++)
{int max=arr[i][0];col=0;flag=0;
for(int j=1;j<arr[i].length;j++)
if(max<arr[i][j])
{max=arr[i][j];
col=j;
}
for(int k=0;k<arr.length;k++)
if(arr[k][col]<max)
{ flag=1;
break;
}
if(flag==0)
{row=i;
break;
}
}
if(flag==0)
System.out.println("The Position of the Saddle Point is at Row "+(row+1)+"& Column "+(col+1));
else
System.out.println("Not found.");
}
public static void main(String args[])
{
int array[][] ={{12,8,37,15,16},{2,12,21,14,13},{15,47,23,20,19},{65,57,43,21,47}};
SaddlePoint sadl=new SaddlePoint(array);
sadl.display(array);
sadl.findSaddle();
}
}
答案 0 :(得分:3)
编译器不知道是否会有for
循环的任何迭代
for(int i=0;i<arr.length;i++)
如果数组的长度为零,则不会出现。因此,有一种情况可能永远不会发生col=0;
,并且永远不会初始化变量。
在col
循环之前初始化for
。
答案 1 :(得分:1)
您正在for block中初始化col
,row
和flag
。
for block的终止声明是:
i<arr.length
如果没有迭代一次就可能是假的,那么col
将不会被初始化。
在声明它们时,只需初始化它们。
答案 2 :(得分:0)
根据JLS:
每个局部变量和每个空白的最终字段必须有一个明确的 在对其值进行任何访问时分配值。
因此,如果编译器发现col
未初始化且看到有可能在运行时保持未初始化并且还发现它稍后在方法中使用,则会将此标记为错误