C'est une question qui a été posée une centaine de fois sur ce site, mais je les ai toutes examinées et, même si elles étaient toutes résolues, aucune des solutions ne fonctionnait pour moi.
Voici à quoi ressemble mon code:
public Button1(Client client, String imgName) {
this.client = client;
try {
this.icon = ImageIO.read(this.getClass().getResourceAsStream("/resources/" + imgName));
} catch (IOException e) {
e.printStackTrace();
}
Lorsque le code est exécuté, l'erreur suivante est générée:
Exception in thread "main" Java.lang.IllegalArgumentException: input == null!
at javax.imageio.ImageIO.read(Unknown Source)
La chaîne imgName est transmise au constructeur à partir d'une classe enfant et correspond au nom d'une image (par exemple, image.png). Je me suis également assuré que mon dossier de ressources se trouvait à la racine du dossier de projet et qu'il était inclus en tant que dossier source dans le projet Eclipse. Je me suis également assuré que System.getProperty("user.dir")
pointe vers le bon emplacement. J'ai également essayé d'utiliser getResource () au lieu de getResourceAsStream (), mais cela ne fonctionne toujours pas.
Essayez d'utiliser ceci: -
this.icon = ImageIO.read(new FileInputStream("res/test.txt"));
où le dossier res
est présent au même niveau que votre dossier src
. De plus, si vous remarquez, la barre oblique /
avant le nom du dossier res
a été supprimée.
Cela peut venir comme un "Non, Duh!" pour beaucoup sur ce site, mais il est toujours important de souligner le langage littéral de Java. La sensibilité à la casse est essentielle, surtout si vous avez un fichier .jar.
Si votre programme fonctionne bien avec la compilation puis l'exécution, mais que ce problème se pose soudainement lorsque vous .jar vos fichiers. Assurez-vous de vérifier votre cas sur vos dossiers/fichiers et vos références dans votre code. (Ainsi que vous assurer qu'ils sont dans votre .jar)
J'espère que cela aidera tous ceux qui se retrouveront ici à examiner le même problème.
Le chemin transmis en tant qu'argument à getResourceAsStream () doit être relatif au chemin de classe défini. Donc essayez de changer ceci
this.icon = ImageIO.read(this.getClass().getResourceAsStream("/resources/" + imgName));
à
this.icon = ImageIO.read(this.getClass().getResourceAsStream("resources/" + imgName));
Vous pouvez essayer ceci:
image = ImageIO.read(getClass().getResource("/resources/" + imgName));
Essaye ça:
this.icon = ImageIO.read(this.getClass().getResource("/resources/" + imgName));
Essayez d'utiliser ce qui suit
this.icon = ImageIO.read(this.getClass().getResourceAsStream("../resources/" + imgName));
J'ai eu exactement le même problème. J'ai utilisé le chemin "my_image.png" au début, mais cela n'a pas fonctionné. J'ai donc cherché partout et essayé les autres solutions publiées sur ce site, mais aucune d'entre elles n'a fonctionné. J'ai résolu le mien en changeant mon code de ce
image = ImageIO.read(SpriteSheet.class.getResourceAsStream("res/image.png"));
pour ça
image = ImageIO.read(SpriteSheet.class.getResourceAsStream("/image.png"));
J'espère que cela aide, même si cette question a été postée il y a 5 ans.
Le dossier de ressources est-il un dossier de classe dans Eclipse? Faites un clic droit sur le projet -> Propriétés -> Chemin de construction Java -> Bibliothèques -> Ajouter un dossier de classe ... -> (sélectionnez le dossier res) et ajoutez-le en tant que dossier de classe.