stack = java.lang.StackOverflowError:堆栈大小为8MB

Jae*_*ger -1 java stack-overflow android android-fragments

我得到这个StackOverFlow错误,我完全理解它,但问题是我不处理大数据,那么如何产生这个错误呢?

我有一个活动,Framelayout,一个片段,3个选项.

在片段中,当你单击其中一个选项时,它会重新创建片段并放置随机数,MAX是15,所以它不是那么大,当用户点击这么快的选项导致这个溢出时会发生这个错误.

这是生成的代码,有关"增强"它的任何想法吗?我不知道这个代码对于momery使用是否是一种不好的做法.

private static List<Integer> SavedNumbers;

public static void SetupSavedNumbersLIst(){
    SavedNumbers = new ArrayList<>();
}


static List<Integer> range;
private static void AddDiff(int mMAX){
    range = new ArrayList<>();
    for(int i = 0 ; i < mMAX ; i++){
        range.add(i);
    }

    range.removeAll(SavedNumbers);
}

private static int ReturnIfDuplic(int mMAX){
    AddDiff(mMAX);
    return new Random().nextInt(range.size());
}


public static int ReturnUniqueSavedNumber(int mMAX){
    int Random = ReturnRandom(mMAX);
    if(SavedNumbers != null && SavedNumbers.size() > 0) {
        if(DoesSavedNumberExist(Random)){
            return ReturnIfDuplic(mMAX);
        } else {
            SavedNumbers.add(Random);
            return Random;
        }
    } else if (SavedNumbers != null && SavedNumbers.size() == 0){
        SavedNumbers.add(Random);
        return Random;
    } else if( SavedNumbers == null){
        SetupSavedNumbersLIst();
        return ReturnUniqueSavedNumber(mMAX);
    } else {
        return 1;
    }
}

private static boolean DoesSavedNumberExist(int Number){
    for(int s: SavedNumbers){
        if(Number == s)
            return true;
    }
    return false;
}

private static int ReturnRandom(int mMAX){
    return new Random().nextInt(mMAX);
}
Run Code Online (Sandbox Code Playgroud)

Kev*_*lia 5

如果您碰巧随机使用已保存的相同数字,则此行会递归:

if(DoesSavedNumberExist(Random)){
    return ReturnUniqueSavedNumber(mMAX);
} 
Run Code Online (Sandbox Code Playgroud)

如果你已经保存了1-15,并且你的最大值是15,这将保证堆栈溢出,因为它永远不会满足if语句.这通常也是"随机数不好,只是再试一次"的坏方法,因为随着您添加越来越多的数字,您将添加越来越多的递归.更好的方法可能是将随机数用作可供选择的可能数字的索引.