【问题标题】:stack=java.lang.StackOverflowError: stack size 8MBstack=java.lang.StackOverflowError: 堆栈大小 8MB
【发布时间】:2017-04-01 08:11:54
【问题描述】:

我收到了这个 StackOverFlow 错误,我完全理解,但问题是我没有处理大数据,那么这个错误是如何产生的呢?

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

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

这是生成代码,关于“增强”它的任何想法?我不知道这段代码对于使用内存来说是不是一种不好的做法。

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

【问题讨论】:

  • ... new Random().nextInt() 有可能为永生生成相同的数字...只需构建您需要的整数列表并将其随机排列ideone.com/XJRRba
  • 从代码中,我可以将其视为在不重复的范围内生成随机数的替代方法,对吧?请记住,这个方法(生成随机数)在每一次重新创建片段时都会调用一次,所以每次调用时,只会生成一个随机数。
  • 但是这里你只是一次生成所有数字序列然后选择下一个,你可以随时保存序列
  • ideone.com/WPSwhR , 2, 3, 1, 0, 线程“主” java.lang.IndexOutOfBoundsException 中的异常:索引:4,大小:4
  • 糟糕,我错了,我应该休息一下:D

标签: java android android-fragments stack-overflow


【解决方案1】:

如果您碰巧随机选择了已保存的相同数字,则此行是递归的:

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

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

【讨论】:

  • 我想过,为了取可能的左数,很难随机生成它们,因为我可能需要放,例如“return 5”和一个 Switch 函数。
  • 考虑剩余数字的数组,然后在 0 和数组长度之间随机一个数字,并从数组中返回该值
  • 要做这样的事情,首先我需要创建一个新的 Int List,并用max 数字填充它,然后像这个例子一样找到剩下的:stackoverflow.com/questions/13286008/…,并随机化它,但问题是,要创建一个 int 数组,我需要循环,该循环是否也会使其成为一种不好的做法?
【解决方案2】:

我遇到同样的问题堆栈大小 8MB。当我点击我的添加项目 api 得到同样的错误。我认为这是在从编辑文本中获取值时发生的。这样我就可以在服务调用之前改变我的方式并在我的inIT(); 中获取值

inIT()  
sys = input_Systolic.getText().toString();
                dys = input_Diastolic.getText().toString();
                _date = dateView.getText().toString();
                tim = time.getText().toString();

改装电话

 HashMap<String, Object> pMap = new HashMap<>();
         pMap.put("user_id",loginStatusModal.getUser_id());
         pMap.put("relative_id",rel_id);
         pMap.put("systolic",sys);
         pMap.put("diastolic",dys);
         pMap.put("report_date",_date);
         pMap.put("report_time",tim);

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-04
      • 2016-09-01
      相关资源
      最近更新 更多