Java递归函数中缺少返回语句



我试图在Java中生成一个包含25个不重复随机数的列表,但我一直收到Missing Return Statement错误。可以看出,我尝试在调用方法之前先放return。不确定缺少什么。它也不适用于return (rando)

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)

我建议您使用一个更简单的方法,使用Java8流。例如,要创建一个由0和100之间的26个不同随机整数组成的数组:

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

为了更详细地解释,这句话可以解释为:创建一个随机数生成器,使用它生成0到100之间的无尽随机数流,删除任何重复,获取流中的前26个数字,并将它们转换为int数组。

流非常强大。一旦生成器处于这种形式,添加sorted运算符或filter,或者将它们收集到ListMap中都是很简单的。

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);
  }
}

初始化addRandom方法中的方法局部变量b,并在for循环中重新分配它,最终返回变量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;
}

您的方法

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语句。方法签名声明您必须返回一个整数。编译器直到运行时才知道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();

顺便说一句,它是java中将类命名为CamelCased的标准。即ArrayList。尽管如此,您可能需要将其重命名为其他名称,这样就不会将您的类与java.util.ArrayList(一个流行的java类)

混淆

如果要使用递归,则不需要循环。例如:

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);
        }
    }
}

最新更新