当前位置: 首页 > 面试题库 >

“ java.lang.IllegalArgumentException:uri.getScheme()== null!使用JavaFX播放音频时发生错误”

温嘉玉
2023-03-14
问题内容

我正在尝试在Java和其中一种格式上播放mp3音频。我相信是JavaFX,一切正常,直到尝试播放音频为止。

这是代码:

import javax.sound.sampled.AudioPermission;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.stage.Stage;


public class fx_main extends Application {

    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello World!");


                Media m = new Media("/04.mp3");
                MediaPlayer mp = new MediaPlayer(m);

                mp.play();

            }
        });

        StackPane root = new StackPane();
        root.getChildren().add(btn);

         Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

  public static void main(String[] args) {
        launch(args);
    }
 }

当我按下按钮并尝试加载声音文件时,出现此异常:

   Hello World!
    Glass detected outstanding Java exception at -[GlassViewDelegate sendJavaMouseEvent:]:src/com/sun/mat/ui/GlassViewDelegate.m:543
    Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: uri.getScheme() == null!
        at com.sun.media.jfxmedia.locator.Locator.<init>(Locator.java:217)
        at javafx.scene.media.Media.<init>(Media.java:369)
        at fx_man$1.handle(fx_man.java:27)
        at fx_man$1.handle(fx_man.java:1)
        at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:69)
        at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217)
        at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170)
        at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
        at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53)
        at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:28)
        at javafx.event.Event.fireEvent(Event.java:171)
        at javafx.scene.Node.fireEvent(Node.java:6866)
        at javafx.scene.control.Button.fire(Button.java:179)
        at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:193)
        at com.sun.javafx.scene.control.skin.SkinBase$4.handle(SkinBase.java:336)
        at com.sun.javafx.scene.control.skin.SkinBase$4.handle(SkinBase.java:329)
        at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:64)
        at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217)
        at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170)
        at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
        at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53)
        at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:33)
        at javafx.event.Event.fireEvent(Event.java:171)
        at javafx.scene.Scene$MouseHandler.process(Scene.java:3369)
        at javafx.scene.Scene$MouseHandler.process(Scene.java:3209)
        at javafx.scene.Scene$MouseHandler.access$1900(Scene.java:3164)
        at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1582)
        at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2267)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:250)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:173)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:292)
        at com.sun.glass.ui.View.handleMouseEvent(View.java:530)
        at com.sun.glass.ui.View.notifyMouse(View.

java:924)

如何解决错误?单击后是否要播放音频文件?


问题答案:

Media的构造函数需要一个URL,因此您需要以http://或file://开头的内容

btn.setOnAction(e -> {
  Media m = new Media(Paths.get("04.mp3").toUri().toString());
  new MediaPlayer(m).play();
});`

参见http://docs.oracle.com/javase/8/javafx/media-
tutorial/simpleplayer.htm

它还有助于将Path和File对象都转换为URL。



 类似资料:
  • 问题内容: 我正在用HTML5和Javascript制作游戏。 如何通过Javascript播放游戏音频? 问题答案: 如果您不想弄乱HTML元素: 这使用了接口,该接口播放音频的方式与element相同。 如果需要更多功能,我使用了howler.js库,发现它简单实用。

  • 媒体播放器类很好。然而,我无法播放存储在另一个类中的mp3文件(当鼠标单击时)。有人能检查我的密码吗? 这是我尝试用来播放音频文件的类: 当我运行程序时(在下面勾选的鼠标上),我得到了以下两个错误:错误1:线程“AWT-EventQueue-0”java.lang中的异常。不支持的操作异常:尚未实现错误2:线程“thread-3”java.llang中的例外。IllegalStateExcepti

  • 音频的加载方式请参考:声音资源 使用 AudioSource 组件播放 在 层级管理器 上创建一个空节点 选中空节点,在 属性检查器 最下方点击 添加组件 -> 其他组件 -> AudioSource 来添加 AudioSource 组件 将 资源管理器 中所需的音频资源拖拽到 AudioSource 组件的 Clip 中,如下所示: 然后根据需要对 AudioSource 组件的其他参数项进行设

  • 我试图在我的JavaFX应用程序中播放音频文件,代码对我来说很好,但我遇到了错误 我认为问题出在第28行: "原因:java.lang.NullPointerExctive:无法调用"java.net.URL. toString()",因为"资源"在示例中为空。Main.start(Main.java:28)" 为什么资源为空?在我的文件结构中,我得到了资源包,但不管音频文件在哪里,错误都是一样的

  • 安装Flutter包时遇到错误= 我使用的是颤振4.2.2; 错误: kotlin. Unit类使用不兼容的静态编程语言版本编译。其元数据的二进制版本为1.5.1,预期版本为1.1.15。 在连续3天试图找到解决方案后,我现在遇到了这个错误。 错误2: Android Studio在运行Gradle时使用以下JDK位置://C:\Program Files\Android\Android Stud

  • 我希望能够播放mp3文件中的声音,我看到了推荐使用JavaFX的帖子。我实现了MediaPlayer并初始化了JFXPanel,在eclipse中,一切都很好。 然而,当我导出到一个可运行的jar,并尝试运行该程序时,我得到以下错误消息:java.lang.NoClassDefFoundError: javafx/场景/媒体/MediaExcture。 我认为这是因为在较新的JRE版本中排除了Ja