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

Posted

技术标签:

【中文标题】在 for 循环中初始化 Clip 后 Clip 上的 NullPointer【英文标题】:NullPointer on Clip after Clip was initialized in for loop 【发布时间】:2015-02-15 03:52:47 【问题描述】:

我这里有一些代码,这让我很困惑;我试图弄清楚为什么会出现空指针异常。我设置了一个 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();

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

【问题讨论】:

【参考方案1】:

由于 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();

作为旁注,请避免将您的呼叫压缩到一条线上。聪明地使用空白是没有成本的,所以聪明地使用它来帮助你的代码的可读性(以及“调试能力”)。

【讨论】:

谢谢,我会试试这个!而且我知道很多人对我缺乏空白感到困难,但如果不是全部在一起,我就很难阅读。我很容易迷失方向,并且更喜欢简洁的代码,只要重要的东西都可以在屏幕上显示而无需左右滚动。 @user3376587:是的,但是如果您需要与任何人协作,或者如果您需要任何人(我们!)的帮助,您最好努力编写您的代码可以理解的。我再次敦促您“解压缩”您的代码。

以上是关于在 for 循环中初始化 Clip 后 Clip 上的 NullPointer的主要内容,如果未能解决你的问题,请参考以下文章

使用FOR循环(PHP)获取增量字符串

按钮循环actionscript 2.0

使用 javax.sound.sampled.Clip 在游戏中播放、循环和停止多个声音。意外错误

Java Sound Clip 在多次播放后无法播放

CLIP-Q:先剪枝后量化的压缩框架

CLIP-Q:先剪枝后量化的压缩框架