java踩雷日記–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元素的效果
for (int taskID = 0; taskID < NUMTASK; taskID++) {
for (int popindex = 0; popindex < ND_eachtask; popindex++) {
Solution newSolution = new Solution(problemSet_);
problemSet_.get(taskID).evaluate(newSolution);
problemSet_.get(taskID).evaluateConstraints(newSolution);
evaluations++;
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函數寫在循環的外部纔是正確的。
for (int taskID = 0; taskID < NUMTASK; taskID++) {
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++;
newSolution.setSkillFactor(taskID);
B_pop[taskID].add(newSolution);
}
}
- 這樣B_pop中有NUMTASK個維度,而每個維度中又有ND_eachtask個元素。
3.要注意new對象的生命週期
- 對於類型的屬性的來說,其生命週期存在於該類型變量的所有函數,但是局部變量只存在於變量域中。