2016-04-05 3 views
0

Я надеюсь, что кто-то может помочь мне с этими двумя значениями, которые заставили меня застрять в проекте. У меня есть два класса, и этот первый генерирует 2D-массив со случайными значениями.Реализация параметров объекта в других классах

import java.util.concurrent.ThreadLocalRandom; 

public class Guitar { 

private int strings; 
private int chords; 

public Guitar(int mstrings, int mchords) { 
    this.strings = mstrings; 
    this.chords = mchords; 
} 

private double[][] song = new double[strings][chords]; 

public void generateSong() { 
    for (int i = 0; i < song.length; i++) { 
     for (int j = 0; j < song[i].length; j++) { 
      song[i][j] = ThreadLocalRandom.current().nextDouble(27.5, 4186); 
      System.out.printf(" %.2f",song[i][j]); 
     } 
     System.out.println(); 
    } 
} 

} 

Количество строк и столбцов определяется аргументами командной строки. args [0] - количество строк, args [1] - количество столбцов. Я обратил их в целое переменные в главном классе метода

public class Songwriter { 

public static void main(String[] args) { 

    System.out.println("Guitar(): Generated new guitar with " + args[0] + " strings. Song length is " + args[1] + " chords."); 

    String args0 = args[0]; 
    int strings = Integer.parseInt(args0); 
    String args1 = args[1]; 
    int chords = Integer.parseInt(args1); 

    Guitar guitarObj1 = new Guitar(strings, chords); 
    guitarObj1.generateSong(); 

} 

} 

Моя проблема заключается в прохождении Int переменных аргументов командной строки, чтобы сделать 2D массив соответствующего размера. Я знаю, что мой код не совсем ошибочен b/c, когда я устанавливаю переменные строк и аккордов равными 3 и 4 или что-то еще в самом классе Guitar, таблица отлично печатается.

Извините, если я, кажется, невежественный. Мой класс просто рассмотрел первую главу о объектно-ориентированном программировании, и я еще не понял основные принципы.

+2

Так что на самом деле происходит? Есть ли какая-то проблема с выходом? Это крушение? – Makoto

+0

Какая ошибка вы столкнулись – Alok

+0

Это не сбой, но единственным выходом является system.out.print в первой строке основного. Я считаю, что это потому, что переменные строк и аккордов по умолчанию равны 0, делая массив 0x0, и я не могу изменить их значения. – seventeenhundred

ответ

1

Это проблематично линия:
private double[][] song = new double[strings][chords];

При создании нового объекта вашего класса гитары, то song массив инициализируется с любыми значениями strings и chords являются в то время, что бы (большинство вероятно) будет 0.

Изменить его к этому:

private double[][] song; 

public Guitar(int mstrings, int mchords) { 
    this.strings = mstrings; 
    this.chords = mchords; 

    song = new double[mstrings][mchords]; 
} 

EDIT: OP вы просто ответили на свой вопрос :)

Это не врезаться, но только выход является System.out.print в первой линии главного. Я считаю, что это потому, что строки и аккорды переменных по умолчанию 0, что делает 0x0 массив, и я не в состоянии изменения их значение

+1

Это правильно. Инициализаторы переменных экземпляра всегда запускаются до конструкторов, даже если они появляются текстовым образом ниже конструктора. Поэтому 'song' является' double [0] [0] 'в коде OP, потому что' int' по умолчанию инициализируется 0. – Radiodef

+1

Спасибо, тонна, теперь это работает. Я знал, что это 0x0, но я был в тупике, исправляя это. Спасибо друг. – seventeenhundred

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