java--为什么在代码编辑器上可以运行的,打包成jar就不能了。

MyFrame类:

package main;

import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class MyFrame extends Frame{

    public MyFrame(String path,String Name) {

        // 默认的窗体名称
        this.setTitle(Name);

        // 获得面板的实例
        MyPanel panel = new MyPanel(path);
        this.add(panel);
        this.addWindowListener(new WindowAdapter() {
            //设置关闭
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        // 执行并构建窗体设定
        this.pack();
        this.setVisible(true);
    }

}

Mypenel类:


package main;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Panel;
import java.awt.image.BufferedImage;
import java.util.Objects;

import javax.swing.ImageIcon;



public class MyPanel extends Panel{

    private final Image screenImage = new BufferedImage(800, 600, 2);

    private final Graphics2D screenGraphic = (Graphics2D) screenImage
            .getGraphics();

    private Image backgroundImage;

    public MyPanel(String path) {
        loadImage(path);
        // 设定焦点在本窗体
        setFocusable(true);
        // 设定初始构造时面板大小,这里先采用图片的大小
        setPreferredSize(new Dimension(800,600));
        // 绘制背景
        drawView();
    }

    /**
     * 载入图像
     */
    private void loadImage(String path) {
        //获得当前类对应的相对位置image文件夹下的背景图像
        ImageIcon icon = new ImageIcon(Objects.requireNonNull(getClass().getResource(path)));
        //将图像实例赋给backgroundImage
        backgroundImage = icon.getImage();
    }

    private void drawView() {
        screenGraphic.drawImage(backgroundImage, 0, 0, null);
    }

    public void paint(Graphics g) {
        g.drawImage(screenImage, 0, 0, null);
    }

}

以上这两个类是为了能显示图片。
主类:


package main;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.IOException;
import java.util.Scanner;

public class games01 {
    //打开音乐
    public static void openFile(String filePath) {
        try {
            File file = new File(filePath); // 创建文件对象,路径为filePath
            Desktop.getDesktop().open(file); // 启动已在本机桌面上注册的关联应用程序,打开文件对象file。
        } catch (IOException | NullPointerException e) { // 异常处理
           e.printStackTrace();
        }
    }
    //显示带有颜色的窗口(400,400,200,200,颜色大写(Color.大写字母颜色))
    //红色窗口:new myFrame(500,100,400,400,Color.RED);
    static class myFrame extends Frame {
        static int id = 0;//可能存在多个窗口,我们需要一个计数器

        public myFrame(int x, int y, int w, int h, Color color) {
            super("myFrame" + (++id));
            setBackground(color);
            this.addWindowListener(new WindowAdapter() {
                //设置关闭
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
            setBounds(x, y, w, h);
            setVisible(true);
        }
    }
    public static void main(String[] args) {
//        Start();
        System.out.println("图片:");
        new MyFrame("../ImageWav/恐怖图片01.jpg","图片");
        System.out.println("音频:");
        openFile("./Games001/src/ImageWav/音乐01.wav");
        System.out.println("半成品");
    }
    public static void Start() throws Exception {
        System.out.println("欢迎来到此《谜》");
        Thread.sleep(1000);
        System.out.println(
                "[某一天,主角散步时,不小心有东西掉在马路上,他跑回去捡,却不小心被撞昏了过去。\n" +
                        "等他一醒来,便身处在这个鬼实验楼的房间里。]");
        Thread.sleep(1000);
        System.out.println(".......");
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入你的名字:");
        new MyFrame("../ImageWav/恐怖图片01.jpg","恐吓");
    }
}

文件结构:

img

在IDEA没报错。
在运行jar包中报错如下:
Exception in thread "main" java.lang.NullPointerException
at java.base/java.util.Objects.requireNonNull(Unknown Source)
at main.MyPanel.loadImage(MyPanel.java:39)
at main.MyPanel.(MyPanel.java:25)
at main.MyFrame.(MyFrame.java:15)
at main.games01.main(games01.java:41)

在IDEA可以显示出图片,也可以打开音频,不过打包成jar就必须了,但是可以显示三个字符:“图片:”