[FXML]NullPointer suite à une lecture d'un .fxml

Résolu/Fermé
Skymer Messages postés 477 Date d'inscription vendredi 6 décembre 2013 Statut Membre Dernière intervention 1 novembre 2018 - Modifié par Skymer le 25/08/2016 à 17:53
Skymer Messages postés 477 Date d'inscription vendredi 6 décembre 2013 Statut Membre Dernière intervention 1 novembre 2018 - 11 sept. 2016 à 12:05
Bonjour, quand je cherche à initialiser mon .fxml qui se trouve au bon endroit, cela me renvoi une erreur de NullPointerException.
L'arborescence (si c'est comme cela que l'on dit) :
JavaFx
_____|-src
__________|-classes
_______________ |-Main.class
__________|-text.fxml
_____|-bin (idem)
Code :
public class Main extends Application {
 
 public static void main(String[] args) {
  launch(args);
 }

 @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(this.getClass().getResource("test.fxml"));
  
        Scene scene = new Scene(root, 300, 275);
    
        stage.setTitle("FXML Welcome");
        stage.setScene(scene);
        stage.show();
    }
}

L'erreur renvoyé :
Exception in Application start method
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException: Location is required.
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3207)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
at classes.Main.start(Main.java:19)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
... 1 more
Exception running application classes.Main


Skymer
"On à jamais rien, sans rien !"
"Ne jamais abandonnez"
A voir également:

2 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
25 août 2016 à 19:59
Bonjour,

Pourquoi tu as mis ton fichier .fxml dans "src" ?
Il devrait être dans "resources" pour que Eclipse le recopie dans le dossier "bin" sinon il n'y sera pas, à moins de l'y mettre toi même à chaque modif.

├───src
│ └───classes
│ Main.java
├───resources
│ test.fxml
└───bin
│ test.fxml

└───classes
Main.class

Remarque : "classes" c'est très moche comme nom de package...

Quant à ton problème, essayes avec
"/test.fxml"
pour avoir un chemin absolu, ou éventuellement
"../test.fxml"
si tu tiens absolument à avoir un chemin relatif à ta classe.

Autre alternative, tu gardes ton
"test.fxml"
en relatif, mais tu le déplaces dans un dossier qui a le même nom que ton package pour que le fichier .class et le fichier .fxml soient dans le même dossier.

Remarque : pour gérer la compatibilité avec les JAR je te conseilles de plutôt passer par un getResourceAsStream :

FXMLLoader.load(Main.class.getResourceAsStream("/test.fxml"));
1
Skymer Messages postés 477 Date d'inscription vendredi 6 décembre 2013 Statut Membre Dernière intervention 1 novembre 2018 75
25 août 2016 à 22:53
"Pourquoi tu as mis ton fichier .fxml dans "src" ? " Je ne connaissais pas l'existence de "resources" ...
En le mettant dans src, éclipse le recopie dans bin pourtant ...
"Remarque : "classes" c'est très moche comme nom de package... " Y a pas de quoi, mais je vais pleurer ... Tu connais le manque d'inspiration pour trouver un nom de package propre ?
Alors explique moi ... bin est sensé contenir SEULEMENT les classes (que l'on peut séparer par des packages) ou c'est tout aussi propre de mélanger classes et images / .fxml etc ... ?
".class et le fichier .fxml" c'est ce que j'avais à la base ...
"Remarque : pour gérer la compatibilité avec les JAR je te conseilles de plutôt passer par un getResourceAsStream : " J'essaye et merci :3
0
Skymer Messages postés 477 Date d'inscription vendredi 6 décembre 2013 Statut Membre Dernière intervention 1 novembre 2018 75
25 août 2016 à 23:08
Pour getResourceAsStream :
cannot make a static reference to the non static method load (InputStream) frome the type FXMLLoader
:'(
Et je suis sûr que cela ne vient pas d'un problème de répertoire ...
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
25 août 2016 à 23:25
"le manque d'inspiration pour trouver un nom de package propre"
Tu n'as pas un chat ? Mets le sur le clavier 10 secondes, "jsfdogho" c'est très bien comme nom de package :-)
Il faut juste éviter l'utilisation de noms réservés, en lisant ta question au début je n'ai pas compris que "classes" était ton nom de package, c'est contre-intuitif pour un développeur, il a fallu que j'aille regarder dans la stack d'erreur pour voir que le nom complet était "classes.Main" (au passage, "Main" n'est pas non plus un bon nom de classe)

"Je ne connaissais pas l'existence de "resources""
Maintenant, tu sauras.

"éclipse le recopie dans bin pourtant"
J'ai essayé chez moi, et il ne le fait pas, il faut peut-être une configuration particulière, c'est pour ça qu'il vaut mieux ne pas utiliser les projets Eclipse.
Si tu as une heure, regardes Débuter avec Maven pour avoir une structure de projet standard, agnostique de l'IDE (ce qui n'empêche pas de travailler avec Eclipse)

"bin est sensé contenir SEULEMENT les classes"
En fait, "bin" n'a aucune existence en Java, c'est Eclipse qui rajoutes ce dossier, et il s'en sert pour construire son classpath d'exécution. Donc non, il peut contenir d'autres choses, et typiquement il doit contenir ton fichier fxml puisque Eclipse va le copier de resources, de même qu'il y mettra les classes compilées. C'est d'ailleurs comme ça que serait construit un JAR, avec les classes et les resources dans la même archives, pour autant elles ne seront généralement pas mélangées car les classes seront rangées dans leurs packages, et les ressources rangées généralement par type (images, sounds, etc.)

"cannot make a static reference to the non static method load (InputStream) frome the type FXMLLoader"
Oups, j'ai mal lu la documentation... la méthode load(URL) que tu utilisais est static mais la méthode load(InputStream) n'est pas static, il faut donc construire un objet FXMLLoader pour y accéder.

new FXMLLoader().load(Main.class.getResourceAsStream("/test.fxml"));

Remarque : ton problème initial était surtout dans le "test.fxml" au lieu du "/test.fxml" puisqu'il s'agissait d'un chemin relatif au lieu du chemin absolu.
Si tu ranges tes ressources avec par exemple un répertoire "javafx" tu aurais "/javafx/test.fxml"

NB. Je n'ai jamais fait de JavaFX ça reste bien sûr à confirmer, je ne fais que répéter ce que j'ai vu sur Google ;-)
0
Skymer Messages postés 477 Date d'inscription vendredi 6 décembre 2013 Statut Membre Dernière intervention 1 novembre 2018 75
Modifié par Skymer le 26/08/2016 à 13:19
Pour le chat c'est ok, mais quand j'apprends la programmation, je m'embête pas à trouver des noms de package et de classes correcte / faire monter mon chat sur mon clavier :3
Même si c'est vrai que c'est une mauvaise habitude ... Comme ce cas ci ...

J'ai toujours eu dans mes projets java : src (qui contenait mes classes et mes images etc ... Que je séparais par des dossiers différent / bin (une fois le programme compilé) contenait la même chose ...
et .classpath, et .project ...
Donc je mets "resources" à la racine du projet ?

Ok pour "bin" mais si je mets mes images dans le dossier src / et donc dans bin ... A quoi sert "resources" ? Je les mets où ces images ? dans src / bin ou dans resources ?

Pour :
new FXMLLoader().load(Main.class.getResourceAsStream("/test.fxml"));

Marche toujours pas, et ce que j'ai fait c'est que j'ai mis le chemin absolu et pas relatif de mon fichier (si c'est comme ça que l'on dit), j'ai bien vérifier d'avoir marqué le bon chemin ... Marche toujours pas, ce qui change dans la console c'est :
Caused by: java.lang.NullPointerException: inputStream is null.


Si tu ranges tes ressources avec par exemple un répertoire "javafx" tu aurais "/javafx/test.fxml" Je le savais, mais merci

NB : J'ai était cherché sur google ... 5 secondes :3 (Sur stackoverflow.com)
J'avais déjà cherché par moi même plus d'une demi-heure ... Et les solutions qu'ils mettaient ne marcher pas .. C'est embêtant moi je voudrais bien finir d'apprendre javafx
0
Skymer Messages postés 477 Date d'inscription vendredi 6 décembre 2013 Statut Membre Dernière intervention 1 novembre 2018 75
Modifié par Skymer le 29/08/2016 à 16:45
Tu pourrais au moins me dire que tu ne sais pas pour ne pas me laisser dans la merde
><
0
Skymer Messages postés 477 Date d'inscription vendredi 6 décembre 2013 Statut Membre Dernière intervention 1 novembre 2018 75
31 août 2016 à 22:37
Merci :-) désolé d'avoir était aggressif, j'essayerai, mais avant (cela n'a aucun rapport, mais cela ne vaut le coup de créer un autre sujet) si je fais ça :
for (int i = 0; i != 10; i++) {
if (i = x) action();
}
System.out.println("i ne correspond pas à x");

Est-ce que ce println va être en attente d'être exécuté ou dès lors que je vais dans une autre méthode cela "casse" la première ?

Je sais ma question n'es pas très bien posé ...
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
31 août 2016 à 23:11
Déjà
if (i = x)
c'est faux, une comparaison se fait avec
==
(d'ailleurs puisque ce sont des int ça ne doit même pas compiler...)

Quant aux méthodes des PrintStream il faudrait vérifier ce que dit exactement la documentation pour le cas général mais dans le cas particulier de System.out/err tu as la garantie que :

1) Tout les messages seront écrits.
Jamais l'appel d'un print annulera un appel précédent, une fois la méthode exécuté l'affichage est fait.
À voir cependant le comportement de quelques caractères particuliers comme le retour-arrière qui "efface" peut être le caractère précédent.

2) Les messages seront écrit dans le même ordre que l'ordre d'appel des méthodes.
Si tu fais des print de "a" puis de "b" tu auras toujours un affichage de "ab", jamais "ba".

3) Les méthodes sont thread safe.
Si deux threads concurrents appelent la méthode d'affichage pour "aaa" et "bbb" en même temps le résultat sera "aaabbb" ou "bbbaaa" mais jamais l'un ne sera au milieu de l'autre (comme "abbbaa" par exemple)

Remarques :

4) Ce n'est pas parce que la méthode est terminée que l'affichage est effectivement fait.
En général un buffer est utilisé et l'affichage effectué une fois le buffer plein ou au bout d'un certain temps, il peut donc y avoir d'un seul coup l'affichage de plusieurs appels de méthodes print successives.

5) Si plusieurs flux affichent sur le même support, la concurrence des appels peut provoquer des mélanges.
C'est notamment le cas lorsque l'on utilise tantôt System.out et tantôt System.err et qu'ils affichent dans la même console. Le message du System.out est dans l'ordre, celui du System.err aussi, mais rien ne permet de dire si System.out sera affiché avant, après ou pendant l'affichage de System.err
0
Skymer Messages postés 477 Date d'inscription vendredi 6 décembre 2013 Statut Membre Dernière intervention 1 novembre 2018 75 > KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024
1 sept. 2016 à 09:27
Merci, bon pour i == x... Je crois que l'on peut passer ...

Mais j'ai trouvé moi même :
public static void main(String[] args) {
		if (true) {
			action();
		}
		System.out.println("ERREUR");
	}
	
	public static void action() {
		System.out.println("ceci est une action");
		action2();
	}
	public static void action2() {
		System.out.println("ceci est l'action numéro 2");
	}

Ce qui donne
ceci est une action
ceci est l'action numéro 2
ERREUR

J'ai fait ça car ce que tu as dis ne me parait que très peu clair ... :/

Je vais regarder pour system.err
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
1 sept. 2016 à 10:22
Si la réponse te "parait que très peu clair" c'est sûrement comme tu l'as dis que la "question n'es pas très bien posé", on ne parle peut être pas de la même chose...

Remarque : d'un point de vue communautaire il aurait été intéressant que cette question soit posée dans une discussion à part.
0
Skymer Messages postés 477 Date d'inscription vendredi 6 décembre 2013 Statut Membre Dernière intervention 1 novembre 2018 75 > KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024
2 sept. 2016 à 23:46
Oui mais d'un point de vue logique, tu y aurais répondu à mes questions pour la énième fois :-)
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
3 sept. 2016 à 00:11
<modérateur>"Le point de vue communautaire" dont je parle c'est de dire que si une personne tierce recherche sur Google des précisions sur le println il est plus logique qu'il tombe sur une discussion spécifique plutôt qu'un commentaire dans une question sur le JavaFX qui n'a rien à voir.

Alors effectivement, même si je verrais tôt ou tard ta question (comme toutes celles sur les forums Java), si tu poses une question à part, ça te permettra d'avoir d'autre réponses que les miennes, plus vite, avec des idées différentes. Alors qu'en restant sur cette discussion il y a très peu de chance qu'un nouvel interlocuteur vienne s'immiscer dans la discussion surtout s'il pense que c'est du JavaFX alors que ça n'en est pas...

Bref, plein de raisons qui font que pour toute nouvelle question on demande plutôt à créer une nouvelle discussion.</modérateur>
0