3

我编写了一些代码来查找矩阵的鞍点(矩阵中的一个元素,它是其相应行的最大元素,同时是其列的最小值)的位置。但是,有一个错误说:

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();
    }
}
4

3 回答 3

3

for编译器不知道循环是否会有任何迭代

for(int i=0;i<arr.length;i++)

如果数组的长度为零,则不会存在。所以有一种可能的情况是col=0;永远不会发生并且变量永远不会被初始化。

在循环col之前初始化。for

于 2013-03-13T19:01:46.713 回答
1

您正在初始化col,rowflag在您的 for 块中。

您对 for 块的终止语句是:

i<arr.length

如果不迭代一次,它可能是假的,然后col将不会被初始化。

只需在声明它们时初始化它们。

于 2013-03-13T19:01:51.253 回答
0

根据JLS

当发生对其值的任何访问时,每个局部变量和每个空白最终字段都必须具有明确分配的值。

因此,如果编译器发现col未初始化,并且发现它可能在运行时保持未初始化,并且还发现它稍后在方法中被使用,它会将其标记为错误。

于 2013-03-13T19:06:02.590 回答