在 for 循环中初始化 Clip 后 Clip 上的 NullPointer

NullPointer on Clip after Clip was initialized in for loop

我这里有一些代码,这让我很困惑;我想弄清楚为什么会出现空指针异常。我设置了一个 for-each-loop 来初始化每个剪辑。如果我自己初始化每一个,它就可以正常工作,并且可以播放剪辑。

  musicArr[0]=menuMusic;
  soundArr[0]=shotSound;
  try
  {
     for(Clip c:musicArr)c=AudioSystem.getClip();
     for(Clip c:soundArr)c=AudioSystem.getClip();
     menuMusic.open(AudioSystem.getAudioInputStream(new File("menuMusic.wav")));
     shotSound.open(AudioSystem.getAudioInputStream(new File("shot.wav")));
  }catch(LineUnavailableException|UnsupportedAudioFileException|IOException ex){ex.printStackTrace();}

稍后当我向程序中添加更多的声音片段和音乐片段时,这会造成麻烦。有人知道这是什么原因吗?

由于 for-each 循环的构造方式,您无法在循环内为正在循环的项目分配引用。您可以更改对象的状态,是的,但是您不能将新对象分配给循环项。解决方案是将 for-each 循环更改为传统的 for 循环。

例如,更改:

for(Clip c:musicArr)c=AudioSystem.getClip();

// if musicArr is an array and not an ArrayList
for (int i = 0; i < musicArr.length; i++) {
    musicArr[i] = AudioSystem.getClip();
}

附带说明一下,避免在进行时将呼叫压缩到一条线上。巧妙地使用白色 space 是免费的,因此巧妙地使用它来帮助提高代码的可读性(因此 "debug-ability")。