2016-12-18 3 views
0

Похоже, что мои основные переменные n и m Невозможно изменить с помощью измерений метода. Консоль говорит, что существует проблема при методе , создайте в этой строке a [i] [j] = unos.nextInt(); но если я меняю эту строку private int [] [] a = new int [n] [m]; и введите любое число, подобное [3] [4], программа работает, но с [n] [m] это не так, может помочь мне, ребята, что с этим кодом. КОНСОЛЬ: а [1] [1] = Исключение в потоке "основного" java.lang.ArrayIndexOutOfBoundsException: 0 Заранее спасибо ..двухмерный массив, методы и переменные

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]; 

в настоящее время выполняется перед выполнением кода в конструкторе. То есть new выполняется, когда n и m не были установлены, и на этом этапе они были инициализированы до 0 по умолчанию. Поэтому он выделяет массив без строк или столбцов.

Чтобы это исправить, изменить выше

private int[][] a; 

и инициализировать его в конструкторе, после n и m были установлены:

a = new int[n][m]; 

Для получения дополнительной информации о порядке, в котором вещи выполняются при создании экземпляра, см. this section of the JLS.

0

Как @ajb сказал инициализировать массив после переменных n & m получили там значение с использованием Scanner. Вы можете сделать это в методе 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 - полностью объектно-ориентированный язык, и когда вы запускаете код, независимо от того, где вы создали переменные уровня класса (будь то первые несколько строк кода в вашем классе или последние), переменные будут созданы до фактического кода исполнение происходит. –

Смежные вопросы