public class PropHolder {
public static Properties prop;
static {
//code for loading properties from file
}
}
// Referencing the class somewhere else:
Properties prop = PropHolder.prop;
class PropHolder
est une classe à moi. La classe réside dans le même fichier JAR de la classe principale. Cela ne devrait donc pas car aucun JAR est absent du chemin de classe.
Lorsque je regarde le fichier JAR par jar tf myjarfile
, je peux voir la PropHolder.class
liste.
Btw: le code fonctionne bien sur ma machine locale. Mais je ne pouvais pas fonctionner lorsque je le déployais avec un script sur un serveur Linux. Je pense donc que ce n'est pas le problème du code. Mais pour une raison quelconque. le processus de déploiement est très difficile à suivre.
Quel pourrait être le problème?
Réponses:
Mon meilleur pari est qu'il y a un problème ici:
Il semblerait qu'une exception non interceptée s'est produite et s'est propagée jusqu'au ClassLoader qui tente de charger la classe. Nous aurions besoin d'un stacktrace pour confirmer cela.
Soit cela, soit cela s'est produit lors de la création d'
PropHolder.prop
une variable statique.la source
static
problème. Que faut-il faire pour résoudre le problème?static
bloc. Pour le déboguer, mettez untry/catch(Exception e)
autour du bloc entier et enregistrez l'exception. Vous devrez corriger cette exception. En règle générale, l'exception sera enregistrée mais peut être difficile à trouver car elle est enregistrée pendant le chargement de classe, ce qui peut arriver très tôttry catch
bloc et c'est ditFailed to initialize ClassA
. Je pense que c'est le problème deJVM
. J'ai redémarré mon système et tout a bien fonctionné. Comment résoudre ce problème à l'avenir sans redémarrer mon système et résoudre le problème avec une solution simple.cause
si disponible. ANoClassDefFoundError
est toujours associé à une autre erreur, vous devrez le rechercher dans les journaux ou essayer de le consigner de manière plus appropriée (comme forcer la connexion dans un nouveau fichier sur le système de fichiers)Vous obtenez un
java.lang.NoClassDefFoundError
qui ne signifie PAS que votre classe est manquante (dans ce cas, vous obtiendrez unjava.lang.ClassNotFoundException
). Le ClassLoader a rencontré une erreur lors de la lecture de la définition de classe lors de la tentative de lecture de la classe.Mettez un try / catch dans votre initialiseur statique et regardez l'exception. Si vous lisez des fichiers là-bas et que cela diffère de votre environnement local, c'est très probablement la cause du problème (peut-être que le fichier est introuvable, aucune autorisation, etc.).
la source
@Stateless
, alors j'ai simplement ajouté la dépendance correspondante et j'ai pu continuer. Merci pour le conseil!NoClassDefFoundError ne donne pas beaucoup d'indices sur ce qui s'est mal passé à l'intérieur du bloc statique. Il est recommandé de toujours avoir un bloc comme celui-ci à l'intérieur du code d'initialisation static {...}:
la source
J'ai eu la même exception, c'est ainsi que j'ai résolu le problème:
Conditions préalables:
Classe Junit (et test), qui a étendu une autre classe.
ApplicationContext initialisé à l'aide de spring, qui initie le projet.
Le contexte Application a été initialisé dans la méthode @Before
Solution:
Initiez le contexte de l'application à partir de la méthode @BeforeClass, car la classe parente nécessitait également certaines classes initialisées à partir du contexte de l'application.
J'espère que cela aidera.
la source
Comme mentionné ci-dessus, cela pourrait être un certain nombre de choses. Dans mon cas, j'avais une variable initialisée statiquement qui reposait sur une entrée manquante dans mon fichier de propriétés. Ajout de l'entrée manquante au fichier de propriétés et le problème a été résolu.
la source
Il y a quelques jours à peine, j'ai rencontré la même question, tout comme la vôtre. Tout le code fonctionne bien sur ma machine locale, mais s'avère une erreur (noclassdeffound & initialize). Alors je poste ma solution, mais je ne sais pas pourquoi, je ne fais qu'avancer une possibilité. J'espère que quelqu'un sait vous l'expliquera. @ John Vint Premièrement, je vais vous montrer mon problème. Mon code a une variable statique et un bloc statique à la fois. Quand j'ai rencontré ce problème pour la première fois, j'ai essayé la solution de John Vint et j'ai essayé d'attraper l'exception. Cependant, je n'ai rien attrapé. Alors j'ai pensé que c'est parce que la variable statique (mais maintenant je sais qu'ils sont la même chose) et toujours rien trouvé. Donc, j'essaye de trouver la différence entre la machine Linux et mon ordinateur. Ensuite, j'ai trouvé que ce problème ne se produit que lorsque plusieurs threads s'exécutent dans un processus (à propos, la machine Linux a des cœurs doubles et des processus doubles). Cela signifie que si deux tâches (les deux utilisent le code qui a un bloc statique ou des variables) exécutées dans le même processus, cela se passe mal, mais si elles s'exécutent dans des processus différents, les deux sont ok. Dans la machine Linux, j'utilise
pour exécuter une tâche, et parce que ma variable statique est de démarrer un conteneur (ou peut-être que vous initialisez un nouveau chargeur de classe), il restera jusqu'à l'arrêt du jvm, et le jvm ne s'arrête que lorsque toutes les tâches d'un processus s'arrêtent. Chaque tâche démarrera un nouveau conteneur (ou chargeur de classe) et rendra le jvm confus. En conséquence, l'erreur se produit. Alors, comment le résoudre? Ma solution est d'ajouter une nouvelle commande à la commande maven et de faire en sorte que chaque tâche aille dans le même conteneur.
Peut-être avez-vous déjà résolu ce problème, mais espérons toujours que cela aidera d'autres personnes qui rencontrent le même problème.
la source
java.lang.ExceptionInInitializerError: null
cela signifie que vous ne pouvez pas trouver la classe dans le chargeur de classe, ou que vous ne savez pas charger laquelle (je suppose). Avez-vous rencontré cela?J'ai eu la même exception - mais seulement en cours d'exécution en mode débogage, voici comment j'ai résolu le problème (après 3 jours entiers): dans le build.gradle j'avais: "multiDexEnabled true" défini dans la section defaultConfig.
mais apparemment ce n'était pas suffisant. mais quand j'ai changé:
à:
cela l'a résolu. J'espère que cela aidera quelqu'un
la source
Si vous travaillez sur un projet Android, assurez-vous de n'appeler aucune méthode statique sur aucune classe Android. J'utilise uniquement JUnit + Mockito, donc peut-être que d'autres frameworks pourraient vous aider à éviter complètement le problème, je ne suis pas sûr.
Mon problème était d'appeler
Uri.parse(uriString)
dans le cadre d'un initialiseur statique pour un test unitaire. La classe Uri est une API Android, c'est pourquoi la version de test unitaire n'a pas pu la trouver. J'ai changé cette valeur à lanull
place et tout est revenu à la normale.la source
J'ai eu les mêmes problèmes :java.lang.NoClassDefFoundError: Impossible d'initialiser la classe com.xxx.HttpUtils
c'est le problème d'environnement, cela signifie que les propriétés dans application.yml sont incorrectes ou vides!
la source
Je rencontre le même problème. J'ai initié un objet bean dans un bloc statique comme ci-dessous:
Juste parce que le processus de mon obejct inition bean a causé un NPE, j'ai des problèmes. Je pense donc que vous devriez vérifier attentivement votre bloc de code statique.
la source