2016-11-17 203 views
-1

我得到这个计算器的错误,我完全理解,但问题是我不是处理大数据,因此,如何能产生这个错误?堆栈= java.lang.StackOverflowError的:堆栈大小8MB

我有一个活性,的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); 
} 
+0

...有一个机会,新的随机()。nextInt()将产生永生相同数量的...只是建立你需要整数的列表,将它洗http://ideone.com/ XJRRba – Selvin

+0

从代码中,我可以看到它是一个替代方法,用于在无重复的范围内生成随机数,对吧?请记住,这种方法(生成随机数)被称为每个片段的重新创建,所以每次被调用时,只会产生一个随机数。 – Jaeger

+0

但在这里,您只需立即生成所有数字序列,然后选择下一个,就可以始终保存序列 – Selvin

回答

6

如果你碰巧随机你已经保存了相同数量的这条线被递归:

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

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

+0

我想过了,为了获取可能的左边数字,很难随机生成它们,因为我可能需要放置,例如“返回5”以及Switch功能。 – Jaeger

+0

考虑剩余数字的数组,然后随机选择一个介于0和数组长度之间的数字,并从数组中返回该值 –

+0

要做这样的事情,首先我需要创建一个新的Int列表,并用'最大'数量,然后找到像这样的例子剩下的东西:http://stackoverflow.com/questions/13286008/find-out-the-elements-of-an-arraylist-which-is-not-present-in-another -arraylist,并随机化它,但问题是,要创建一个int数组,我需要循环,那个循环会使它成为一个坏习惯吗? – Jaeger

0

我遇到同样的问题堆栈大小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错误。