在下面的拍摄方法中,对于for循环中的两个变量'hmm'和'sequence',它总是显示错误,它们无法作为变量求解,但显然我已经在'if'体中声明了它们在这个方法的上半部分。为什么不识别'嗯'和'序列'?
public Action shoot(GameState pState, Deadline pDue) {
int totalBirdsOfThisRound=pState.getNumBirds();
boolean HMMinitialized=false;
if (!HMMinitialized){
HMM[] hmm=new HMM[totalBirdsOfThisRound];
initializeHMM(pState,hmm);
HMMinitialized=true;
Vector<Integer>[] sequences=(Vector<Integer>[]) new Object[totalBirdsOfThisRound];
}
for(int i=0;i<totalBirdsOfThisRound;i++){
Bird aBird=pState.getBird(i);
for(int j=sequences[i].getLength();j<aBird.getSeqLength();j++)
sequences[i][j]=aBird.getObservation(j);
hmm[i].estimateModel(sequences[i]);
int lastMove=aBird.getLastObservation();
double[] currentStateDistribution=new double[10];
Arrays.fill(currentStateDistribution, 0);
currentStateDistribution[lastMove]=1;
}
return cDontShoot;
}
答案 0 :(得分:1)
Java具有块范围。您只能访问声明它的块中的变量。通常,块以{
开头,以}
结尾。但是如果/ while / for没有括号和下面的行也可以组成一个块。因此,要使hmm
在for
循环中可用,您需要在包含for
循环的块中声明它。
以下是代码中块的分层视图:
shoot
hmm // Accessible in for-loop if it's declared here
if-statement
hmm // Not accessible if it's declared here
for-loop i
for-loop j
答案 1 :(得分:0)
您正在if条件中初始化HMM[] hmm
,如果控件未到达内部,则不会初始化。所以如果条件如下,请把它放在外面。
HMM[] hmm = null;
答案 2 :(得分:0)
HMM阵列超出范围。在if块之外声明HMM数组或将for循环移动到if块以解决此问题。