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

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

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

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

5回答

657閲覧

エラーのキャッチができない

退会済みユーザー

退会済みユーザー

総合スコア0

JavaFX

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/01/11 03:47

編集2019/01/12 03:53

JavaFXでタイマーアプリを作成しています。

パソコンのオーディオ機器に問題がある場合、以下の例外が投げられます。

キャッチしたい例外

Exception in thread "Thread-4" com.sun.media.jfxmedia.MediaException: Could not create player! at javafx.media/com.sun.media.jfxmediaimpl.NativeMediaManager.getPlayer(NativeMediaManager.java:274) at javafx.media/com.sun.media.jfxmedia.MediaManager.getPlayer(MediaManager.java:118) at javafx.media/com.sun.media.jfxmediaimpl.NativeMediaAudioClipPlayer.play(NativeMediaAudioClipPlayer.java:319) at javafx.media/com.sun.media.jfxmediaimpl.NativeMediaAudioClipPlayer.clipScheduler(NativeMediaAudioClipPlayer.java:112) at javafx.media/com.sun.media.jfxmediaimpl.NativeMediaAudioClipPlayer.access$000(NativeMediaAudioClipPlayer.java:47) at javafx.media/com.sun.media.jfxmediaimpl.NativeMediaAudioClipPlayer$Enthreaderator.lambda$static$0(NativeMediaAudioClipPlayer.java:85) at java.base/java.lang.Thread.run(Thread.java:844)

以下のコードで例外処理を試みましたが、同じ例外が投げられます。

実行したコード

Java

1try{ 2 audio = new AudioClip(new File("Ding.mp3").toURI().toString()); 3 audio.play(); 4 Thread.sleep(1000); 5}catch(Exception e){ 6 System.out.println("音声が再生できませんでした。"); 7}

import文

import java.io.File; import javafx.application.*; import javafx.scene.*; import javafx.scene.layout.*; import javafx.scene.control.*; import javafx.scene.paint.*; import javafx.scene.image.*; import javafx.scene.effect.*; import javafx.scene.text.*; import javafx.scene.input.*; import javafx.scene.canvas.*; import javafx.scene.shape.*; import javafx.scene.media.*; import javafx.scene.media.AudioClip; import javafx.stage.*; import javafx.event.*; import javafx.geometry.*; import javafx.collections.*; import java.util.*; import java.net.MalformedURLException;

アドバイスをいただけますでしょうか。
よろしくお願い致します。

全体のコード
https://github.com/yamakataoka/Pomodoro/blob/master/Pomodoro.java

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

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

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

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

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

m.ts10806

2019/01/11 04:02

MediaException のcatch項を削除すれば良いだけではないのでしょうか。
退会済みユーザー

退会済みユーザー

2019/01/11 04:09

回答ありがとうございます。 すいません、質問の意図が間違っていました。 質問の内容を変更しました。
dice142

2019/01/11 04:25

MediaExceptionのimport文はどうなっていますか?
退会済みユーザー

退会済みユーザー

2019/01/11 04:40

質問ありがとうございます。 import文を質問部分に追加しました。
yukkuri

2019/01/11 06:00

タイトルと質問があっていないように感じられます。 エラーのキャッチができない、というような感じに変更してください。
退会済みユーザー

退会済みユーザー

2019/01/11 06:58

有難うございます。変更しました。
S_kawa

2019/01/11 07:22

例外発生しているのがtry-catchの内部ではないような?
退会済みユーザー

退会済みユーザー

2019/01/11 09:24

AudioClip 再生時に例外が出されるため、下のコード部分が妥当だと考えています。tryの部分を広げてみましたが、キャッチ出来ませんでした。 audio = new AudioClip(new File("Ding.mp3").toURI().toString()); audio.play(); Thread.sleep(1000);
退会済みユーザー

退会済みユーザー

2019/01/12 06:30

Thread.UncaughtExceptionHandler も試してみましたがダメでした。
guest

回答5

0

MediaExceptionが発生するコードを再現できなかったのでそれっぽいところを指摘します。

発生しているMediaExceptionがjavafxのものではなく、com.sun.media.jfxmedia.MediaExceptionであり、
import文を見るにimport javafx.scene.media.*;でjavafxのMediaExceptionがcatchで適用されている気がします。

import javafx.scene.media.*;を削除し、必要なものは個別でインポートしてみてください。
で、MediaExceptionに関してはimport com.sun.media.jfxmedia.MediaException;でインポートしてみてください。

投稿2019/01/11 05:17

dice142

総合スコア5158

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

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

退会済みユーザー

退会済みユーザー

2019/01/11 06:05 編集

回答ありがとうございます。 import javafx.scene.media.*; を削除し、import com.sun.media.jfxmedia.MediaException; を追加しましたが、以下のエラーが新しく出ました。 Pomodoro.java:22: error: package com.sun.media.jfxmedia is not visible import com.sun.media.jfxmedia.MediaException; ^ (package com.sun.media.jfxmedia is declared in module javafx.media, which does not export it to the unnamed module)
退会済みユーザー

退会済みユーザー

2019/01/11 05:44

エラーについてですが、パソコンのオーディオ機器に問題があると、発生するエラーのようです。
yukkuri

2019/01/11 05:59 編集

横から失礼します。 com.*.*...のようなパッケージは、本来使用するべきではなく、APIにも書いていないパッケージですので、使用するべきではありません。 また、dice142さんの言っている個別にインポートは、 import java.util.Scanner; import java.util.Random; のようにするか、または java.util.Random r = new java.util.Random(); のようにすることです。
退会済みユーザー

退会済みユーザー

2019/01/11 06:06

アドバイス有難うございます。 com.sun.media.jfxmedia.MediaException; をインポートしない場合は、どのようにこの例外を対処すべきでしょうか?
yukkuri

2019/01/11 06:16

雑にやると、catchの中の例外名をException eのようにすると、エラーが出なくなるのですが、あまりそれは推奨しないです。 エラーの下のコメントは、翻訳するとこうなります。 パッケージcom.sun.media.jfxmediaは、javafx.mediaモジュールで宣言されています。この場合、名前のないモジュールにはエクスポートされません。 ということだそうです。ただ、私はモジュールには弱いので、あまりコメントはできません。 また、エラー名で検索をかけたところ、バグ、という情報もありました。 https://bugs.openjdk.java.net/browse/JDK-8123790 ただ、java8ではモジュールはないはず、java9では修正されているはず、と矛盾してしまいます。 出来たら、環境(OS)を追記してもらえると嬉しいです。
dice142

2019/01/11 06:19

> Yamato_.様 そう出るとなると再現しない限り私の方ではお力添えは厳しそうです。 > yukkkuri様 補足ありがとうございます。 ドキュメントを見つけられなかったので私の検索力不足かなと思っていたのですが 普通に書いていないんですね。 (公式で使用しているのになぜ・・・)
dice142

2019/01/11 06:21

一応Exceptionでcatchしてinstanceofでクラス判定して行う方法もありますが、 すべての例外をキャッチしてしまうのでできる限り避けたいところではありますね。
退会済みユーザー

退会済みユーザー

2019/01/11 06:54

> yukkuri様 補足情報ありがとうございます。 環境ですが、 OS: Windows 10 Education バージョン: 1803 Java: jdk-10.0.2 > dice142 わざわざ回答いただき有難うございました。
退会済みユーザー

退会済みユーザー

2019/01/11 06:57

以下のコードでキャッチを試みましたが、キャッチ出来ませんでした。 try{ audio = new AudioClip(new File("Ding.mp3").toURI().toString()); audio.play(); Thread.sleep(1000); }catch(Exception e){ System.out.println("音声が再生できませんでした。"); }
guest

0

追記

いくつか試してもらいたいことがあります。
1.スレッド外で音声を再生してみる
極力外、例えば

public void start( Stage stage ) { // ここ timeleft = 5; }

(予想が正しければこうするとエラーがなくなる...と思う)

2.ファイルのパス指定について
こちらのサイトを参考にされたのかもしれませんが、Fileのパス指定を

( new File( "" ).getPath() )

としてみてください。

過去

dice142さんが答えておられますが、気になったことがあったので回答します。

どうでもいいですが、エラーの際は System.out.println()ではなく、System.err.println
を使うべきです。

また、タイトルを変更してほしいと修正依頼に書きましたが、このような回答が来ると思ったからです。
1.自作の例外クラスを作る

class HogeException extends Exception { public HogeException( String msg, Throwable e ) { super( msg, e ); } }

2.catchでインスタンス化

catch( Exception e ){ new HogeException( "音声が再生できませんでした。", e ); }

こうすると、

音声が再生されませんでした。 Exception in Thread ... HogeExcepion 省略 Caused by Exception in thread "Thread-4" com.sun.media.jfxmedia.MediaException: Could not create player! at javafx.media/com.sun.media.jfxmediaimpl.NativeMediaManager.getPlayer(NativeMediaManager.java:274) at javafx.media/com.sun.media.jfxmedia.MediaManager.getPlayer(MediaManager.java:118) at javafx.media/com.sun.media.jfxmediaimpl.NativeMediaAudioClipPlayer.play(NativeMediaAudioClipPlayer.java:319) at javafx.media/com.sun.media.jfxmediaimpl.NativeMediaAudioClipPlayer.clipScheduler(NativeMediaAudioClipPlayer.java:112) at javafx.media/com.sun.media.jfxmediaimpl.NativeMediaAudioClipPlayer.access$000(NativeMediaAudioClipPlayer.java:47) at javafx.media/com.sun.media.jfxmediaimpl.NativeMediaAudioClipPlayer$Enthreaderator.lambda$static$0(NativeMediaAudioClipPlayer.java:85) at java.base/java.lang.Thread.run(Thread.java:844)

みたいな感じになってしまいます。こうすると、タイトルで言っているような「例外の表示を変更したい」
というのができてしまいます。
(ちなみにですが、上のソースのようにした後、catchの中にcatchを書くと、実はどんなエラーでもHogeException でキャッチできてしまいます)

投稿2019/01/11 06:08

編集2019/01/11 13:15
yukkuri

総合スコア624

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

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

退会済みユーザー

退会済みユーザー

2019/01/11 07:00

アドバイス有難うございます。 以下のコードではキャッチ出来ませんでした。 catch(Exception e){ System.out.println("音声が再生できませんでした。"); }
yukkuri

2019/01/11 07:08

catch( Throwable e )ではだめでしょうか。
退会済みユーザー

退会済みユーザー

2019/01/11 10:10 編集

Throwable でもダメでした。
退会済みユーザー

退会済みユーザー

2019/01/11 10:55

子スレッドが原因で親スレッドが複数処理をすることは無いのですが
退会済みユーザー

退会済みユーザー

2019/01/12 04:00

コメント有難うございます。 スレッドの違いが原因かもしれません。
退会済みユーザー

退会済みユーザー

2019/01/12 04:01

追記有難うございます。 1.スレッド外で音声を再生してみる、ですが殆ど同じエラーが投げられました。 "Thread-4" → "Thread-3"となっていました。 Exception in thread "Thread-3" com.sun.media 2.ファイルのパス指定について ( new File( "" ).getPath() )としたところ、以下の例外が発生しました。 Exception in Application start method java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:564) at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:473) at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:372) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:564) at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:941) Caused by: java.lang.RuntimeException: Exception in Application start method at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:973) at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:198) at java.base/java.lang.Thread.run(Thread.java:844) Caused by: java.lang.IllegalArgumentException: uri.getScheme() == null! uri == 'Ding.mp3' at javafx.media/com.sun.media.jfxmedia.locator.Locator.<init>(Locator.java:218) at javafx.media/com.sun.media.jfxmediaimpl.NativeMediaAudioClip.<init>(NativeMediaAudioClip.java:53) at javafx.media/com.sun.media.jfxmediaimpl.NativeMediaAudioClip.load(NativeMediaAudioClip.java:63) at javafx.media/com.sun.media.jfxmediaimpl.AudioClipProvider.load(AudioClipProvider.java:66) at javafx.media/com.sun.media.jfxmedia.AudioClip.load(AudioClip.java:135) at javafx.media/javafx.scene.media.AudioClip.<init>(AudioClip.java:83) at Pomodoro.start(Pomodoro.java:47) at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:919) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$11(PlatformImpl.java:449) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$9(PlatformImpl.java:418) at java.base/java.security.AccessController.doPrivileged(Native Method) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:417) at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96) at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:175) ... 1 more Exception running application Pomodoro
yukkuri

2019/01/13 00:31 編集

ありがとうございます。 とりあえず、いくつかわかってきたので、追記させていただきます。 1.上で出ているInvocationTargetExceptionですが、目ゾッドやコンストラクタをラップする例外、ということでした。ただ、よく見ると下に原因として、 java.lang.IllegalArgumentException: uri.getScheme() == null! uri == 'Ding.mp3' や at Pomodoro.start(Pomodoro.java:47) とあることから、 (Githubでは空行でしたが) thread = new Thread(runnable); thread.start(); このあたりに原因があると思われます。
退会済みユーザー

退会済みユーザー

2019/01/13 00:26

コメント有難うございます。 参考にさせていただきたいと思います。
yukkuri

2019/01/13 00:30 編集

すいません。間違った情報を書いていました。 私の環境が特殊なせいですね。 ただ、JDKのパスの中のどこかにあると思います。 すいません、windowsでもjava10でもなくて... 追記:コメントから削除しました
退会済みユーザー

退会済みユーザー

2019/01/13 00:35

なるほど、追記有難うございます。
退会済みユーザー

退会済みユーザー

2019/01/13 00:36

githubですが、自己解決後のコードになっておりました、申し訳ありません。
guest

0

パソコンのオーディオ機器に問題がある場合の再現がむつかしいので実際にどうなるかはわかりませんが、AudioClipではなくMedia``MediaPlayerを使ったらどうなるでしょうか。Mediaには#setOnError()メソッドがあるので、そこで発生した例外を拾えるかもしれません。

java

1import javafx.application.Application; 2import javafx.scene.Scene; 3import javafx.scene.control.Button; 4import javafx.scene.layout.HBox; 5import javafx.scene.media.AudioClip; 6import javafx.scene.media.Media; 7import javafx.scene.media.MediaPlayer; 8import javafx.stage.Stage; 9 10import java.io.File; 11 12public class xxMedia { 13 public static void main(String[] args) throws Exception { 14 Application.launch(App.class, args); 15 } 16 17 public static class App extends Application { 18 @Override 19 public void start(Stage stage) throws Exception { 20 final String mp3 = new File("/tmp/Ding.mp3").toURI().toString(); 21 22 final Button useAudioClip = new Button("Use AudioClip"); 23 useAudioClip.setOnAction(ev -> { 24 AudioClip audioClip = new AudioClip(mp3); 25 audioClip.play(); 26 }); 27 28 final Button useMediaPlayer = new Button("Use MediaPlayer"); 29 useMediaPlayer.setOnAction(ev -> { 30 final Media media = new Media(mp3); 31 media.setOnError(() -> { 32 final Exception e = media.getError(); 33 e.printStackTrace(System.out); 34 }); 35 new MediaPlayer(media).play(); 36 }); 37 38 final Button exitButton = new Button("exit"); 39 exitButton.setOnAction(ev -> System.exit(0)); 40 41 stage.setScene(new Scene(new HBox(useAudioClip, useMediaPlayer, exitButton))); 42 stage.setTitle(this.toString()); 43 stage.show(); 44 } 45 } 46}

投稿2020/01/27 12:03

shiketa

総合スコア3971

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

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

0

例外のキャッチではなく、例外の回避を行なっています。

パソコンのオーディオ出力がない場合、以下の例外が投げられます。ということから自己解決に至りました。
例外の原因がこの部分であることから、

audio = new AudioClip(new File("Ding.mp3").toURI().toString()); audio.play();

getMixerInfo()を用いて例外の回避を行いました。

Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo(); if(mixerInfo.length > 0){ audio = new AudioClip(new File("Ding.mp3").toURI().toString()); audio.play(); }else{ System.out.println("再生できませんでした。オーディオデバイスの状態を確認してください。"); }

投稿2019/01/13 00:36

編集2019/01/13 00:41
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

Thread.UncaughtExceptionHandler h = new Thread.UncaughtExceptionHandler() { public void uncaughtException(Thread th, Throwable ex) { System.err.println("再生できませんでした。オーディオデバイスの状態を確認してください。"); } }; thread.setUncaughtExceptionHandler(h); thread.start();

上記のUncaughtExceptionHandlerを用いて、以下のように表示させることができました。

Exception in thread "Thread-4" com.sun.media.jfxmedia.MediaException: Could not create player! at javafx.media/com.sun.media.jfxmediaimpl.NativeMediaManager.getPlayer(NativeMediaManager.java:274) at javafx.media/com.sun.media.jfxmedia.MediaManager.getPlayer(MediaManager.java:118) at javafx.media/com.sun.media.jfxmediaimpl.NativeMediaAudioClipPlayer.play(NativeMediaAudioClipPlayer.java:319) at javafx.media/com.sun.media.jfxmediaimpl.NativeMediaAudioClipPlayer.clipScheduler(NativeMediaAudioClipPlayer.java:112) at javafx.media/com.sun.media.jfxmediaimpl.NativeMediaAudioClipPlayer.access$000(NativeMediaAudioClipPlayer.java:47) at javafx.media/com.sun.media.jfxmediaimpl.NativeMediaAudioClipPlayer$Enthreaderator.lambda$static$0(NativeMediaAudioClipPlayer.java:85) at java.base/java.lang.Thread.run(Thread.java:844) 再生できませんでした。オーディオデバイスの状態を確認してください。

投稿2019/01/12 04:13

編集2019/01/12 04:14
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問