天天看點

java 踩雷日記--new1.數組元素中元素沒有 new 導緻數組為空2.要用的對象要一次性 new 完,最好不要在調用的過程中或者循環的工程中重複 new 出新的對象3.要注意 new 對象的生命周期

1.數組元素中元素沒有 new 導緻數組為空

SolutionSet[] Donminant_pop;
Donminant_pop = new SolutionSet[NUMTASK];
Solution newSolution = new Solution(problemSet_);
B_pop[taskID].add(newSolution);
           

複制

  • 錯在 B_pop[taskID]應該是一個 SolutionSet,但是我沒有 new,是以導緻數組中元素為空
B_pop[taskID] = new SolutionSet(ND_eachtask);
           

複制

2.要用的對象要一次性 new 完,最好不要在調用的過程中或者循環的工程中重複 new 出新的對象

  • new 一個對象時,傳給一個變量名時,其中的資料會初始化,是以原先的元素都不保留了。對于 List 類型的元素來說有 clear 元素的效果
// Create the initial solutionSet B0
       for (int taskID = 0; taskID < NUMTASK; taskID++) {
           //初始化所有pop
           for (int popindex = 0; popindex < ND_eachtask; popindex++) {
               Solution newSolution = new Solution(problemSet_);
               problemSet_.get(taskID).evaluate(newSolution);
               problemSet_.get(taskID).evaluateConstraints(newSolution);
               evaluations++;
               // 初始建立種群時,為每個個體随機配置設定一個合适的任務即SkillFactor
               newSolution.setSkillFactor(taskID);
               B_pop[taskID] = new SolutionSet(ND_eachtask);
               B_pop[taskID].add(newSolution);
           }
       }
           

複制

  • 例如此處就寫錯了,此處 B_pop 中隻有一個元素,即 B_pop[0],而且 B_pop[0]中隻有一個元素,就是 newSolution,因為内層循環時,每次都會更新 B_pop 中的元素,是以 B_pop 中的元素沒有保留。而且每次都在這個基礎上添加一個元素,然後又重置了。
  • 隻有将 B_pop 的 new 函數寫在循環的外部才是正确的。
// Create the initial solutionSet B0
       for (int taskID = 0; taskID < NUMTASK; taskID++) {
           //初始化所有pop
           B_pop[taskID] = new SolutionSet(ND_eachtask);
           for (int popindex = 0; popindex < ND_eachtask; popindex++) {
               Solution newSolution = new Solution(problemSet_);
               problemSet_.get(taskID).evaluate(newSolution);
               problemSet_.get(taskID).evaluateConstraints(newSolution);
               evaluations++;
               // 初始建立種群時,為每個個體随機配置設定一個合适的任務即SkillFactor
               newSolution.setSkillFactor(taskID);
               B_pop[taskID].add(newSolution);
           }
       }
           

複制

  • 這樣 B_pop 中有 NUMTASK 個次元,而每個次元中又有 ND_eachtask 個元素。

3.要注意 new 對象的生命周期

  • 對于類型的屬性的來說,其生命周期存在于該類型變量的所有函數,但是局部變量隻存在于變量域中。