我正在和一些使用Netbeans的朋友一起开发基于文本的RPG。它在Netbeans中都能正常工作,但当我将其导出到.jar文件时,出现此错误。
2019年1月28日2:27:15 PM Operator.DragonsHead startActionPerformed 严重:null java.io.FileNotFoundException:文件“ src \ Operator \ files \ Opening.mid”不存在!
这种情况发生在游戏开始时,因为我们在启动时会播放一个“主题”。 这首歌在Netbeans上播放,但在导出时不播放。
我是Java编程的新手,去年我参加了课程。
我曾尝试在网上寻找同样问题的人,但我无法完全将其与我的代码重复。
这是中产阶级:
import javax.sound.midi.*;
import java.io.File;
import java.io.IOException;
import java.io.FileNotFoundException;
public class MIDI {
private File file = null;
private Sequencer sequencer = null;
public MIDI (String midiFile) throws FileNotFoundException {
this.file = new File(midiFile);
if (!file.isFile()) {
throw new FileNotFoundException("File \"" + midiFile + "\" does not exist!");
}
try{
sequencer = MidiSystem.getSequencer();
if (sequencer == null){
System.err.println("Error: Sequencer not supported");
return;
}
sequencer.open();
Sequence sequence = MidiSystem.getSequence(file);
sequencer.setSequence(sequence);
}
catch (MidiUnavailableException | InvalidMidiDataException | IOException ex){
}
}
public void play(){
sequencer.start();
}
public void stop() {
sequencer.stop();
}
public void waitAndStop(int millis) {
Runnable song = () -> {
try {
Thread.sleep(millis);
}
catch (InterruptedException e) {
System.err.println("MIDI playback interrupted");
}
stop();
};
Thread t = new Thread(song);
t.start();
}
public long songLengthMicroseconds() {
return sequencer.getMicrosecondLength();
}
public Sequence getSequence(String resource) {
try {
return MidiSystem.getSequence(new File(resource));
}
catch (InvalidMidiDataException | IOException ex) {
return null;
}
}
}
以下是初始化它并调用歌曲播放的行:
MIDI midiTest;
midiTest = new MIDI("src\\Operator\\files\\Opening.mid");
midiTest.play();
答案 0 :(得分:1)
我不确定API的“ MIDI”是什么,但是除非您想通过编写安装程序的繁琐工作,否则无法对图标,图片,音乐和数据文件等资源使用直接文件访问。 / p>
请使用getResource / getResourceAsStream机制,该机制返回URL / InputStreams。编写良好的库会像处理文件一样处理这些问题。
基本格式:
try (InputStream resource = MyClassName.class.getResourceAsStream("Opening.mid")) {
// do something with resource here.
}
其中Opening.mid与MyClassName.class的位置完全相同(因此,如果您以jar形式运输,则它位于jar中,与myClassName.class处于相同的文件夹结构中。如果您希望使用罐子中的根目录“ music”,例如,您可以传递:/music/Opening.mid
,并带有反斜杠,以表示您要退出罐子根目录。
第二观察,如果您不知道如何处理异常,最好的解决方案是将无法处理的异常添加到方法的“ throws”行中。如果某种不可能,那么挡块的合适主体是:
throw new RuntimeException("unhandled checked exception", e);
因为现在如果发生错误,您的代码将默默地继续前进。如果这是您的意图(因为,嘿,我猜音乐是可选的),我仍然将其记录为 SOMEWHERE ,现在如果发生错误,您将一无所知。>