2016-12-18 9 views
0

私の主な変数と同じように見えるnmはメソッドの次元で変更できません。コンソールには、方法に問題があると表示されますこの行にを作成します[i] [j] = unos.nextInt();しかし、 私はこの行を変更した場合私用int [] [] a =新しいint [n] [m];と[3] [4]のような数字を入れて、プログラムは動作しますが、[n] [m]とは関係ありません。 CONSOLE:[1] [1] "メイン" java.lang.ArrayIndexOutOfBoundsExceptionスレッドの例外=:予め0 おかげで..2次元配列、メソッド、変数

import java.util.Scanner; 

public class Matrica { 
private int n, m; 
private Scanner unos = new Scanner(System.in); 

public void dimensions() { 
    System.out.print("n: "); 
    n = unos.nextInt(); 
    System.out.print("m: "); 
    m = unos.nextInt(); 

} 

private int[][] a = new int[n][m]; // if i put [2][2] or any other number, instead [n][n], program works 

public void create() { 
    for (int i = 0; i < n; i++) 
     for (int j = 0; j < m; j++) { 
      System.out.print("a[" + (i + 1) + "][" + (j + 1) + "]="); 
      a[i][j] = unos.nextInt(); // console points that this is the problem 
     } 
} 

public void print() { 
    for (int i = 0; i < n; i++) { 
     for (int j = 0; j < m; j++) { 
      System.out.printf("%d\t", a[i][j]); 
     } 
     System.out.println(); 
    } 
} 
} 
+1

@Thrasherなぜこのすべての不要なスペースを追加するために編集しましたか?これは典型的なJavaスタイルではなく、奇妙に見えます。 – ajb

+1

@Thrasher今後これを行うことはお勧めしません。あなたの個人的なスタイルはあなたのビジネスですが、Javaのスペーシングのためのかなり確立された標準があります(それらのすべてではありませんが、私はそれらと一緒に暮らしています)。読者数が多いサイトでは、 。 – ajb

答えて

1

問題が

private int[][] a = new int[n][m]; 

が実行されることですコンストラクタ内のコードが実行される前につまり、は、nmが設定されていないときに実行されています。この時点で、デフォルトでは0に初期化されています。したがって、行または列のない配列を割り当てることになります。物事順序の詳細については

a = new int[n][m]; 

を:、これを修正

private int[][] a; 

に上記を変更し、nmが設定された後に、コンストラクタでそれを初期化するために

インスタンスの作成時に実行されます。this section of the JLSを参照してください。 @ajb同様

0

変数n & mScannerを使用してそこに値を取得した後、配列を初期化する、と述べました。これはdimensions()メソッドで行うことができます。

public void dimensions() { 
    System.out.print("n: "); 
    n = unos.nextInt(); 
    System.out.print("m: "); 
    m = unos.nextInt(); 
    a = new int[n][m]; //Add the following line. 
} 
+0

ええと、私はそのすべてのことを秩序と思っていましたが、そのような優先度について知りませんでした。何か新しいことを学びました。 – kjkszpj

+0

あなたのコードを書いている順序は必ずしもそうではありません。 Javaは完全にオブジェクト指向の言語であり、コードを実行すると、クラスレベルの変数(クラス内の最初の数行のコードであっても最後のコードであっても)が実際のコードの前に作成されます実行が行われます。 –