2010-09-26 48 views
0

我于c seperately 扰2 java程序:在C \试验和其他:\测试\新CLASSPATH内的值的顺序是什么?

我可以编译两者是没有任何错误\ 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) 

我把这个在我的类路径

CLASSPAT错误ħ值 - C:\测试; C:\测试\新

但如果我改变的值的顺序在CLASSPATH本

CLASSPATH值 - C:\测试\新; C^:\测试

的错误只是去

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

回答

1

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

清理你的类路径。在类路径中使用相同的签名来重复使用不同版本的类是不好的。如果你的意图是new应该是一个包标识符,那么你需要远离类路径。但是,这样的包名会导致编译错误,所以不能这样做。


至于这个bug,对于naildown和fix是比较微不足道的。首先看堆栈跟踪的第一行:

at ButtonFrame.makeButton(ButtonTest3.java:42) 

它告诉它已经发生了ButtonTest3班线42条,makeButton()方法内。现在转到行ButtonTest3.java 42,它会看起来像:

someObject.doSomething(); 

看看那里有一个点运算符.是被用来调用一个方法或访问某些对象的字段。 NullPointerException表示在特定时刻someObjectnull。没有实例!

这是一个简单的办法:只要确保它不null你是在调用的瞬间/访问它:

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

需要一段时间来思考,但最后我得到了它:) – CHEMlSTRY 2010-09-26 05:06:05

+0

不客气。 – BalusC 2010-09-26 05:19:44

0

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

按照Java spec

class每个文件包含一个类或接口 的 定义。虽然类或 界面不需要有一个外部 表示字面上包含在 文件(例如,因为是由类加载器所产生的 类), 我们将通俗是指一类或 的任何 有效表示界面,如class文件 format.format。

您可以将​​放入ButtonTest2的内部。

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

    class ButtonFrame extends JFrame { 
     .... 
    } 
} 

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

+0

哦,对,我完全忘了。 顺便说一句我已决定编辑这个问题,以更具体到我对 – CHEMlSTRY 2010-09-26 03:42:12

+0

好奇的事情,未来,你应该提出一个新的问题。不要重复使用旧问题来解决完全不同的问题。考虑回滚你的编辑并提出一个新问题。那么我也会在那里提出我的答案。 – BalusC 2010-09-26 03:58:48

+0

我试图把ButtonFrame放在ButtonTest2里面,但是有一个错误,我需要在某处声明'static'。我找不到它 – CHEMlSTRY 2010-09-26 04:29:39

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环境变量。 并再试一次。

+0

我正在使用我在互联网上发现的3行脚本,但觉得它不能正常工作, 现在与我们的脚本它真的工作! – CHEMlSTRY 2010-09-26 04:10:16