teratail header banner
teratail header banner
質問するログイン新規登録

質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Q&A

解決済

1回答

762閲覧

JavaFXのAudioClipのファイルの指定でgetClass().getResource()がnullになってしまいエラーになる

yamato55

総合スコア2

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

0グッド

0クリップ

投稿2023/07/11 06:16

0

0

実現したいこと

JavaFXでAudioClipを使用して音楽を鳴らしたい。

前提

JavaFxでアプリケーションを作成しています。
音楽(mp3)が流れるようにしたいのですが、AudioClipでエラーになります。
19行目のgetClass().getResource()では null が出力されます。
mp3ファイルはMain.javaと同じフォルダに保存してあります。
getResouce()の問題のような気がしているのですが、どの辺を調べたら良いのか教えていただけないでしょうか?

発生している問題・エラーメッセージ

java.lang.NullPointerException: Cannot invoke "java.net.URL.toString()" because the return value of "java.lang.Class.getResource(String)" is null at tetris/application.Main.start(Main.java:21) at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:847) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:484) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456) at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)

該当のソースコード

JavaFX

1package application; 2 3import javafx.application.Application; 4import javafx.stage.*; 5import javafx.scene.layout.*; 6import javafx.scene.Scene; 7import javafx.scene.media.AudioClip; 8 9 10public class Main extends Application{ 11 12 public static void main(String[] args) { 13 launch(args); 14 } 15 16 @Override 17 public void start(Stage pstage) { 18 try { 19 System.out.println(getClass().getResource("tetoris.mp3")); 20 21 AudioClip audio = new AudioClip(getClass().getResource("tetoris.mp3").toString()); 22 //audio.setCycleCount(AudioClip.INDEFINITE); 23 audio.play(); 24 25 BorderPane root = new BorderPane(); 26 Scene scene = new Scene(root,400,400); 27 pstage.setScene(scene); 28 pstage.show(); 29 }catch (Exception e) { 30 e.printStackTrace(); 31 } 32 } 33} 34

試したこと

mp3ファイルの絶対パスの文字列を
String path = "/Users/username/eclipse-workspace/tetris/bin/application";
new AudioClip(getClass().getResource(path));
のように指定してもダメでした。

補足情報(FW/ツールのバージョンなど)

MacOS 13.4.1
java version "17.0.7" 2023-04-18 LTS
javafx-sdk-17.0.7
Eclipse IDE Version: 2023-06 (4.28.0)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

19行目のgetClass().getResource()では null が出力されます。
mp3ファイルはMain.javaと同じフォルダに保存してあります。

「Main.javaと同じフォルダ」ではなく、コンパイルされた結果のMain.classファイルと同じディレクトリにtetoris.mp3ファイルを配置する必要がある。
「Main.javaと同じフォルダ」はソースファイルのディレクトリであって、実行時に参照するclasspathには含まれない。だから、getClass().getResource("tetoris.mp3")はnullを返す。

指定された名前のリソースを探します。指定されたクラスに関連したリソースを検索するルールは、クラスのクラス・ローダーを定義して実装されます。
戻り値: ...この名前のリソースが見つからない場合はnull

投稿2023/07/11 07:01

shiketa

総合スコア4133

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamato55

2023/07/11 07:17

ご回答ありがとうございます。 bin/application/tetoris.mp3に保存したところ音楽が鳴るようになりました!! getClass()なのでクラスファイル・・・なんですね。 ありがとうございました。助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問