CLASSPATH中的值的顺序是否重要?

时间:2010-09-26 01:17:55

标签: java classpath

我有2个独立的java程序 一个在c:\ test中,另一个在c:\ test \ new

我可以编译它们而没有任何错误\ javac

但是当我尝试执行文件\ java时 它显示了像这样的错误

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)

我把它放在我的类路径中

  

CLASSPATH值-C:\ test; C:\ test \ new

但如果我将CLASSPATH中的值的顺序更改为此

  

CLASSPATH值-C:\ test \ new; C:\ test

错误消失了

为什么?这可能会发生 只有订单很重要吗?

3 个答案:

答案 0 :(得分:1)

您在两个文件夹中都有一个同名的课程。在C:\test中有ButtonTest3类的版本,其中包含导致此NullPointerException的编程错误。在C:\test\new中有ButtonTest3类的不同版本,它不包含此错误,或者可能有一个ButtonTest类与C:\test中的类完全不同

清理类路径。在类路径中使用相同的签名重复不同的版本化类是不好的。如果您的意图是new应该是包标识符,那么您需要将其从类路径中移开。但是,这样的包名会导致编译错误,所以不可能。


关于这个bug,NullPointerException对于naildown和修复来说相对微不足道。首先看一下stacktrace的第一行:

at ButtonFrame.makeButton(ButtonTest3.java:42)

它告诉我ButtonTest3方法中makeButton()类的第42行已经发生了这种情况。现在转到ButtonTest3.java的第42行,它看起来像是:

someObject.doSomething();

查看点运算符.用于调用方法或访问某个对象的字段的位置。 NullPointerException表示someObject在特定时刻为null。没有实例!

这是一个简单的修复方法:只需确保在您调用/访问它时 null

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

答案 1 :(得分:0)

好吧,我不相信你可以在一个源文件中定义两个类。您可以将它们定义为子类。

根据Java spec

  

每个class文件都包含   单个类的定义或   接口。一班或一班   界面不需要外部   字面上包含的表示   一个文件(例如,因为   class由类加载器生成),   我们将通俗地提及任何   有效的代表或类   接口在class文件中   format.format。

您可以将ButtonFrame放在ButtonTest2内。

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

    class ButtonFrame extends JFrame {
       ....
   }
}

或者,将它们放在不同的java文件中。

答案 2 :(得分:0)

你在程序的顶级有两个课程,这是错误的。但是把它放在一边,你的程序不会在第一时间编译。 要成功编译该程序,请使用以下NppExec脚本:

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

确保将JDK文件夹设置为JAVA_HOME环境变量。 然后再试一次。