2015-11-12 2 views
-2

Я пытаюсь создать список из 25 неповторяющихся случайных чисел в Java, и я продолжаю получать ошибку Missing Return Statement. Как можно видеть, я попытался поставить return перед вызовом метода внутри себя. Не уверен, чего не хватает. Он также не работает только с return (rando)Отсутствует заявление о возврате в рекурсивной функции Java

import java.util.*; 
public class arrayList{ 

     ArrayList<Integer> checkRandom; 
     ArrayList<Integer> array4; 
     ArrayList<Integer> array2; 
     ArrayList<Integer> array3; 

    public int addRandom(){ 
     Random rnd = new Random(); 
     int b=0; 
     for (int i=0; i<26; i++){ 
      int rando = rnd.nextInt(101); 
      if (checkRandom.indexOf(rando) != -1){ 
       return addRandom(); 
      } 
      else{ 
       checkRandom.add(rando); 
       array4.add(rando); 
       return (rando); 
      } 
     } 
     for (int j=0;j<26;j++){ 
      int right; 
      right = checkRandom.get(j); 
      System.out.println(right); 
      } 
     return -1; 
    } 





    public static void main(String args[]){ 
     arrayList randomGen = new arrayList(); 
     randomGen.addRandom(); 
    } 
} 


Exception in thread "main" java.lang.NullPointerException 
at arrayList.addRandom(arrayList.java:14) 
at arrayList.main(arrayList.java:37) 
+0

Почему 'для (INT I = 0; г <26; я ++) {' 'в addRandom'? ** Подсказка ** удалите петлю. Кроме того, *** пожалуйста *** не воссоздавайте 'Random' в' addRandom'. Это действительно плохая идея. –

ответ

0
public static void main(String[] args) { 
    ArrayList<Integer> list = new ArrayList<>(); 
    Random rand = new Random(); 

    while (list.size() < 25) { 
     int index = rand.nextInt(101); 

     if (!list.contains(index)) { 
      list.add(index); 
     } 
    } 
    System.out.println(list); 
    } 
} 
0

Вашего методом

public int addRandom(){ 
    Random rnd = new Random(); 

    for (int i=0; i<26; i++){ 
     int rando = rnd.nextInt(101); 
     if (checkRandom.indexOf(rando) != -1){ 
      return addRandom(); 
     } 
     else{ 
      checkRandom.add(rando); 
      array4.add(rando); 
      return (rando); 
     } 
    } 
} 

не оператор возврата в конце. В сигнатуре метода указано, что вы должны вернуть целое число. Компилятор не знает, что оператор for будет выполняться до выполнения. Таким образом, вы должны обрабатывать случай, когда цикл for не выполняется. Поскольку вы можете сказать, что он будет выполняться каждый раз, добавив return -1; до конца метода решит вашу проблему.

т.е.

public int addRandom(){ 
    Random rnd = new Random(); 

    for (int i=0; i<26; i++){ 
     int rando = rnd.nextInt(101); 
     if (checkRandom.indexOf(rando) != -1){ 
      return addRandom(); 
     } 
     else{ 
      checkRandom.add(rando); 
      array4.add(rando); 
      return (rando); 
     } 
    } 
    return -1; 
} 

Вы можете вызвать метод путем создания экземпляра класса, т.е.

arrayList randomGen = new arrayList(); 
randomGen.addRandom(); 

Btw, его стандарт в Java, чтобы назвать классы CamelCased. т.е. ArrayList. Хотя, вы можете переименовать его что-то еще, так что вы не путайте ваш класс с java.util.ArrayList (популярный класс Java)

+0

Как мне вызвать метод из основного или любого другого? Я получаю сообщение об ошибке, что нестатическая переменная не может быть указана из статического контекста. –

0

Инициализировать метод локальной переменной б внутри метода addRandom и переназначить его в ваш for loop окончательно возвращает переменную b.

public int addRandom(){ 
    Random rnd = new Random(); 
    int b=0; 

    for (int i=0; i<26; i++){ 
     int rando = rnd.nextInt(101); 
     if (checkRandom.indexOf(rando) != -1){ 
      b= addRandom(); 
     } 
     else{ 
      checkRandom.add(rando); 
      array4.add(rando); 
      b=rando; 
     } 
    } 
    return b; 
} 
2

Я бы предложил использовать гораздо более простой метод с использованием потоков Java 8. Например, для создания массива из 26 различных случайных чисел betweeen 0 и 100:

int[] randomArray = new Random().ints(0, 101).distinct().limit(26).toArray(); 

Для того, чтобы объяснить немного более подробно, это утверждение можно интерпретировать как: создать генератор случайных чисел, использовать его, чтобы генерировать бесконечный поток случайных чисел от 0 до 100, удалите любые дубликаты, получите первые 26 чисел в потоке и преобразуйте их в массив int.

Потоки невероятно мощные. Как только ваш генератор находится в этой форме, тривиально добавить оператора sorted или filter или собрать их в List или Map.

+0

Это довольно круто. Не могли бы вы объяснить это подробно? В частности, '...' в конце. –

+0

@MichaelQuatrani the ... был просто сокращением для 'и так далее'. Я уточню кое-что более конкретное и добавлю объяснение. – sprinter

0

Если вы хотите использовать рекурсию, вам не нужны циклы. например:

import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 

public class Test { 
    List<Integer> randomList = new ArrayList<Integer>(); 

    Random rnd = new Random(); // do not create new Random object in each function call. 

    final static int LIST_SIZE = 25; 

    public void addRandom(List someList) { 
     if (randomList.size() < LIST_SIZE) { 
      int random = rnd.nextInt(101); // LIST_SIZE must be lesser than 101 otherwise you will got infinite recursion. 
      if (!randomList.contains(random)) { 
       randomList.add(random); 
       someList.add(random); 
      } 
      addRandom(someList); 
     } 
    } 

    public static void main(String args[]) { 
     Test test = new Test(); 
     List<Integer> array4 = new ArrayList<Integer>(); 
     test.addRandom(array4); 
     for (Integer value : array4) { 
      System.out.println(value); 
     } 
    } 
} 
Смежные вопросы