2010-09-26 3 views
0

J'ai 2 programme java situé séparement One dans c: \ test et l'autre dans c: \ test \ newL'ordre de la valeur dans le CLASSPATH est-il important?

Je peux compiler les deux sans aucune erreur \ javac

Mais lorsque je tente de exécutez le fichier \ java il montre l'erreur comme celui-ci

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at ButtonFrame.makeButton(ButtonTest3.java:42) 
    at ButtonFrame.<init>(ButtonTest3.java:29) 
    at ButtonTest$1.run(ButtonTest.java:17) 
    at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 

je mets dans mon classpath

CLASSPAT H C forte valeur: \ test; C: \ test \ new

mais si je change l'ordre de la valeur CLASSPATH à cette

CLASSPATH C à valeur: \ test \ nouveau; C : \ test

l'erreur est tout simplement disparu

Pourquoi ?? cela pourrait se produire Seule la commande est importante?

Répondre

1

Vous avez une classe avec le même nom dans les deux dossiers. En C:\test il y a une version de la classe ButtonTest3 qui contient un bogue de programmation causant ce NullPointerException. En C:\test\new il existe une version différente de la classe ButtonTest3 qui ne contient pas ce bogue, ou probablement il y a une classe ButtonTest qui fait des choses entièrement différentes de celle de C:\test.

Nettoyez votre chemin de classe. Il n'est pas bon d'avoir des doubles classes différentes avec la même signature dans le classpath. Si votre intention est que new est supposé être un identificateur de paquet, alors vous devez le laisser loin du classpath. Cependant, un tel nom de paquet aurait entraîné une erreur de compilation, ce qui ne peut pas être le cas.


Quant au bogue, un NullPointerException est relativement trivial à Naildown et fixer. Regardez d'abord la première ligne du stacktrace:

at ButtonFrame.makeButton(ButtonTest3.java:42) 

Il est dit qu'il a eu lieu dans la ligne 42 de ButtonTest3 classe, dans la méthode makeButton(). Maintenant, allez à la ligne 42 de ButtonTest3.java, ça va ressembler à quelque chose comme:

someObject.doSomething(); 

Regardez là où un opérateur de point . est été utilisé pour invoquer une méthode ou accéder à un champ d'un objet. Le NullPointerException signifie que someObject est null au moment particulier. Il n'y a pas d'instance!

Il est une solution facile: il suffit de veiller à ce qu'il est pasnull au moment vous appeler/y accéder:

someObject = new SomeObject(); 
// ... 
someObject.doSomething(); 
+0

il me faut du temps pour réfléchir, mais enfin je l'ai eu :) – CHEMlSTRY

+0

De rien. – BalusC

0

Eh bien, je ne crois pas que vous pouvez avoir deux classes définies dans un seul fichier source. Vous pouvez les définir comme une sous-classe.

Selon le Java spec:

Chaque fichier contient class la définition d'une seule classe ou d'une interface . Bien qu'une classe ou une interface ne doivent pas avoir une représentation externe littéralement contenue dans un fichier (par exemple, parce que la classe est générée par un chargeur de classe), nous allons familièrement référence à toute représentation valide d'une classe ou interface comme étant dans le fichier class format.format.

Vous pouvez placer ButtonFrame à l'intérieur de ButtonTest2.

public class ButtonTest2 
{ 
    public static void main(String[] args) 
    { 
     ... 
     ButtonFrame frame = new ButtonFrame(); 
    } 

    class ButtonFrame extends JFrame { 
     .... 
    } 
} 

Ou, placez-les dans différents fichiers java.

+0

ah oui, j'ai complètement oublié ça. btw j'ai décidé d'éditer la question pour être plus spécifique à ce que je vraiment curieux à propos de – CHEMlSTRY

+0

Hmm, à l'avenir, vous devriez poser une nouvelle question à ce sujet. Ne réutilisez pas les anciennes questions pour des problèmes complètement différents. Envisagez d'annuler votre modification et de poser une nouvelle question. Ensuite, je vais déplacer ma réponse là aussi. – BalusC

+0

j'ai essayé de mettre le ButtonFrame dans le ButtonTest2 mais il y a une erreur, je dois déclarer le «statique» quelque part. Je ne pouvais pas le trouver – CHEMlSTRY

0

Vous avez deux classes au plus haut niveau dans le programme, thats mal. Mais en gardant cela de côté, votre programme n'est pas compilé à la première place. Pour compiler avec succès le programme utilise le script NppExec suivant:

cmd /c cd "$(CURRENT_DIRECTORY)" && "%JAVA_HOME%\bin\javac" "$(FULL_CURRENT_PATH)" 
cmd /k cd "$(CURRENT_DIRECTORY)" && "%JAVA_HOME%\bin\java" "$(NAME_PART)" && exit 

Assurez-vous que vous avez votre dossier réglé sur JDK JAVA_HOME variable d'environnement. et réessayez.

+0

J'utilisais ce script de 3 lignes que je trouvais sur internet mais sentais que ça ne fonctionnait pas correctement, maintenant avec ton script c'est vraiment du travail! – CHEMlSTRY