Java 为什么Image.IO.read()在这种情况下返回null?

Java 为什么Image.IO.read()在这种情况下返回null?,java,Java,ImageLoader.java: public class ImageLoader { private static BufferedImage image; public ImageLoader() { } public BufferedImage loadImage(String filePath) throws IOException { image = ImageIO.read(this.getClass().getResourceA

ImageLoader.java:

public class ImageLoader {
    private static BufferedImage image;

    public ImageLoader() {
    }

    public BufferedImage loadImage(String filePath) throws IOException {
        image = ImageIO.read(this.getClass().getResourceAsStream(filePath));
        return image;
    }

    public static BufferedImage loadImage(Class classPath, String filePath) throws IOException {
        image = ImageIO.read(classPath.getResourceAsStream(filePath));
        return image;
    }
}
public class Library {
    public static final String ResourcePath = "./res/";
    public static final String ImagePath = ResourcePath + "Images/";
}
Library.java:

public class ImageLoader {
    private static BufferedImage image;

    public ImageLoader() {
    }

    public BufferedImage loadImage(String filePath) throws IOException {
        image = ImageIO.read(this.getClass().getResourceAsStream(filePath));
        return image;
    }

    public static BufferedImage loadImage(Class classPath, String filePath) throws IOException {
        image = ImageIO.read(classPath.getResourceAsStream(filePath));
        return image;
    }
}
public class Library {
    public static final String ResourcePath = "./res/";
    public static final String ImagePath = ResourcePath + "Images/";
}
以三种方式使用ImageLoader.java:

public class ImageLoader {
    private static BufferedImage image;

    public ImageLoader() {
    }

    public BufferedImage loadImage(String filePath) throws IOException {
        image = ImageIO.read(this.getClass().getResourceAsStream(filePath));
        return image;
    }

    public static BufferedImage loadImage(Class classPath, String filePath) throws IOException {
        image = ImageIO.read(classPath.getResourceAsStream(filePath));
        return image;
    }
}
public class Library {
    public static final String ResourcePath = "./res/";
    public static final String ImagePath = ResourcePath + "Images/";
}
  • BufferedImage test=newimageloader().loadImage(Library.ImagePath+“imageFile.png”)

  • BufferedImage test=newimageloader().loadImage(Main.class,Library.ImagePath+“imageFile.png”)

  • BufferedImage test=newimageloader().loadImage(“/Images/”+“imageFile.png”)

  • 为什么只有第三种情况有效,而第一种和第二种情况无效?我相信它与
    库.ImagePath
    静态变量有关


    如果有解决方法,请在下面描述

    这似乎与图像路径有关。展开变量时,值为

    ./res/Images
    
    但从第三个示例来看,图像似乎位于

    /Images/imageFile.png
    
    因此,请尝试将ImagePath更改为:

    public static final String ImagePath = "/Images/";
    
    这里的区别是(注意:从现在开始我只是猜测),在类路径中,图像似乎部署在images文件夹中。在文件系统中,在启动应用程序的根文件夹中似乎有一个“res”文件夹

    假设您的文件夹结构如下所示:

    myProject
    +--- res
    |    +---Images
    |    \---Texts
    \--- src
    
    当您在
    myProject
    中启动应用程序,并且
    res
    位于类路径上时,通过类路径或文件加载时,图像的路径将不同:

    new File("./res/Images/..."); //Relative to the working directory of the app!
    classPath.getResourceAsStream("/Images/..."); //Root is your classpath, i.e. "res"!
    

    你在使用哪个
    类/你的案例中
    库.ImagePath
    有什么价值?@DavidTanzer哦,好吧,让我把它添加到问题中!您确定需要在
    资源路径
    的开头使用
    /
    而不仅仅是
    /
    ?@ferrybig有趣的建议,但这不会改变Image.IO.read()返回null的事实。因为您有一个名为/Images的类路径条目,当然没有一个名为/res/Images。