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

あなたは初期化colrowflagいて、あなたのforブロックにいます。

forブロックの終了ステートメントは次のとおりです。

i<arr.length

一度反復しないとfalseになる可能性があり、その後colは初期化されません。

宣言するときに初期化するだけです。

于 2013-03-13T19:01:51.253 に答える
0

JLSによると:

各ローカル変数とすべての空白の最終フィールドには、その値へのアクセスが発生したときに、確実に値が割り当てられている必要があります。

そのため、コンパイラがcol初期化されていないことを検出し、実行時に初期化されていない可能性があることを確認し、後でメソッドで使用されていることを検出すると、これにエラーとしてフラグを立てます。

于 2013-03-13T19:06:02.590 に答える