2016-06-08 2 views
-1
public class Alfabhto { 

int[][] pinakas = new int[3][6]; 
String[] gramata ={"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"}; 

public static void main(String[] args) { 
    Scanner s = new Scanner(System.in); 
    System.out.println("Enter an alphanumeric combination"); 
    String fail = s.nextLine(); 

    System.out.println(pinakas[i][j]); 

} 

    public int[][] Numbers() { 

    Random rand = new Random(); 
    for (int i=0;i<3;i++) 
    { 
     for (int j=0;j<6;j++) 
     { 
      pinakas[i][j] = rand.nextInt(38)-12; 
     } 
    } 
    return pinakas; 

} 
} 

Прежде всего, я новичок в java. Основная функция работает правильно, и пользователю предлагается ввести ввод. Некоторые элементы здесь не используются (например, массив граматов), поэтому игнорируйте их.Случайный 2-й массив не печатается

Проблема заключается в том, что номера методов должны заполнять массив pinakas случайными числами, а затем печатать их. Он ничего не делает, если это в методе. Снаружи он вызывает ошибки, потому что он не может получить массив «pinakas» или i и j. Есть идеи?

+4

Вы никогда не создать 'Numbers', так что конструктор не вызывается. – resueman

+3

... и если вы это сделали, вы получите 'NoSuchElementException', когда' j = 6'. Ваши циклы должны использовать '<', а не '<='. –

+2

... и не воссоздавайте объект 'Random' на каждой итерации внутреннего цикла. Создайте его * один раз * и повторно используйте его. –

ответ

3

Существует несколько проблем с этим кодом, см комментарии:

// Need to import Random 
import java.util.Random; 

public class Alfabhto { 

    String[] gramata ={"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"}; 
    // This neesd to be final for Numbers to access it 
    final int[][] pinakas = new int[3][6]; 

    // There's no reason for Numbers to be public, or to extend Alfabhto, or in 
    // fact to be a class at all. Recommend making it a static method within 
    // Alfabhto (in which case gramata and pinakas must also be static), or an 
    // instance method if appropriate (in which case pinaka does not need to be 
    // final anymore, though you might leave it that way if you never 
    // intend to replace the array with a different one. 
    // Also recommend making that method (static or instance) a private method. 
    public class Numbers extends Alfabhto { 
     public Numbers() { 
      // Create this once and reuse it 
      Random rand = new Random(); 

      // Note using <, not <=, on the loops 
      for (int i = 0; i < 3; i++) { 
       for (int j = 0; j < 6; j++) { 
        pinakas[i][j] = rand.nextInt(38) - 12; 
        System.out.println(pinakas[i][j]); 
       } 
      } 
     } 
    } 

    // Since Numbers is an inner class, we need to be able to create instances of Alfabhto 
    private Alfabhto() { 
    } 

    // We need something in Alfabhto to run the Numbers constructor  
    private void run() { 
     // Run the code in the Numbers constructor 
     new Numbers(); 
    } 

    public static void main(String[] args) { 
     /* None of this does anything, presumably you'll use it later... 
     Scanner s = new Scanner(System.in); 
     System.out.println("Enter an alphanumeric combination"); 
     String fail = s.nextLine(); 
     */ 
     // Run our run method, which will run the code in the Numbers constructor 
     new Alfabhto().run(); 
    } 
} 
+0

Рассмотрите вопрос о том, что' rand' 'static', и синхронизация на нем. «Случайный» не является потокобезопасным, и в его текущей форме он по-прежнему является статистически аномальным для отдельных экземпляров «Числа». – Bathsheba

+0

@Bathsheba: 'rand' является локальным внутри конструктора, не разделяемым между потоками или экземплярами. –

+0

Действительно, но отдельные экземпляры 'Numbers' будут скоррелированы, и это статистически неверно. – Bathsheba

-1

В вашей основной функции вы никогда не создаете экземпляр Numbers, чтобы все, что вы писали, там не вызывается. Когда вы создадите новый Numbers(), он должен что-то распечатать.

+1

Вы действительно не «вызываете» класс, вы создаете его экземпляр. Кроме того, синтаксис для создания объекта не похож на вызов функции ('Numbers()'), вам нужно использовать ключевое слово 'new' и do' new Numbers() ' –