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

时间:2016-11-17 16:57:30

标签: java android android-fragments stack-overflow

我收到此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);
}

3 个答案:

答案 0 :(得分:5)

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

if(DoesSavedNumberExist(Random)){
    return ReturnUniqueSavedNumber(mMAX);
} 

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

答案 1 :(得分:0)

我遇到同样的问题堆栈大小8MB。当我点击我的添加项api得到相同的错误。我认为这是在从编辑文本中获取值时发生的。这样我就可以改变方式,在服务电话

之前获取additem中的值
$(document).ready(function(){
  $(".additem").on("click", function(){
    var val = $("input").val();
    if(val!=="") {
      var elem = $("<li></li>").text(val);
      $(".list-item").append(elem);
      $("input").val("");     
    }
  });
  $(".removeitem").on("click", function() {
        $(".list-item li:last-child").remove();
  });
});

改装电话

inIT();

使用此我解决了我的堆栈大小8mb错误。

答案 2 :(得分:0)

当我尝试使用intent.putExtra()传递许多值时,我遇到了同样的问题。

我通过将所有数据保存在共享首选项中解决了这个问题。然后,您可以在以后的部分中访问应用程序中所需的任何片段或活动。

Refer this question to learn more about saving data using shared preferences.