Domanda

I know that this question had been answered too many times but I couldn't fix it no matter solution I tried.
I want to use a jpeg image as background but I can't resolve it no matter I tried.

Below is my final package structure :

images/  
-- bg.jpeg  
org/     
-- Main.java  (used for test)

Code

public class Main {
BufferedImage img;
public static void main(String[] args) {
    Main main = new Main();
    main.load();
}
public void load(){
    try {
            ClassLoader cl = this.getClass().getClassLoader();
            System.out.println("CL:"+cl);
            InputStream url = getClass().getClassLoader().getResourceAsStream("/images/bg.jpg");
            System.out.println("URL:"+url);
            this.img = ImageIO.read(url); // Null argument exception
    } catch (IOException ex) {
        Logger.getLogger(BoardView.class.getName()).log(Level.SEVERE, null, ex);
    }
}}  

Output

CL:sun.misc.Launcher$AppClassLoader@15663a2   
URL:null   
Exception in thread "main" java.lang.IllegalArgumentException: input == null!   
    at javax.imageio.ImageIO.read(ImageIO.java:1348)   
    at org.Main.load(Main.java:32)   
    at org.Main.main(Main.java:24)

I am using JDK7 and Maven project.

È stato utile?

Soluzione

You're image path is somewhat correct...

But...

When using getClassLoader(), you don't use the extra / in front of images.

getClass().getClassLoader().getResourceAsStream("images/bg.jpg");

enter image description here

import java.awt.image.BufferedImage;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.*;

public class Main {

    BufferedImage img;

    public static void main(String[] args) {
        Main main = new Main();
        main.load();
    }

    public void load() {
        try {
            ClassLoader cl = this.getClass().getClassLoader();
            System.out.println("CL:" + cl);
            InputStream url = getClass().getClassLoader().getResourceAsStream("resources/stackoverflow5.png");
            System.out.println("URL:" + url);
            this.img = ImageIO.read(url); // Null argument exception
            JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(img)), "No ClassLoader", JOptionPane.PLAIN_MESSAGE);
        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

If you _don't use the getClassLoader(), then you do need it

getClass().getResourceAsStream("/images/bg.jpg");

enter image description here

import java.awt.image.BufferedImage;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.*;

public class Main {

    BufferedImage img;

    public static void main(String[] args) {
        Main main = new Main();
        main.load();
    }

    public void load() {
        try {
            ClassLoader cl = this.getClass().getClassLoader();
            System.out.println("CL:" + cl);
            InputStream url = getClass().getClass().getResourceAsStream("/resources/stackoverflow5.png");
            System.out.println("URL:" + url);
            this.img = ImageIO.read(url); // Null argument exception
            JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(img)), "With ClassLoader", JOptionPane.PLAIN_MESSAGE);
        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Why?...

As simply as can possibly be state here

  • When you use .getClass().getResource(fileName) it considers the location of the fileName is the same location of the of the calling class.
  • When you use .getClass().getClassLoader().getResource(fileName) it considers the location of the fileName from the root

Note: My file structure is similar to your

ProjectRoot
         resources
                stackoverflow5.png
         mypackage
                Main.java

Altri suggerimenti

You can try this

 Image img = Toolkit.getDefaultToolkit().getImage(  
 YourClassName.class.getResource("/images/bg.jpg"));  

The inputstream of the image is null. Probably, you are looking in the wrong path of the image. Or there is no read access to it

First of all check the path of the images, and you can try without / it might solve your problem.

i come back to add an answer because after having resolved my problem the last time it showed again and i could'nt load the image anymore. I was frustrated but after searching a bit more i found another clear answer.
The idea is to find the resource in the target folder that gets created after building the project, from there you can find the path for the resource you want to load. This is the link for the answer:
How to correctly get image from 'Resources' folder in NetBeans

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top