2012-08-08 51 views
0

我遇到了一個奇怪的問題,我很好奇(並希望找到解決方法)。在界面和類中聲明的常量之間的區別?

如果我宣佈我班的變量節點:

private static final String NODES = "nodes";

一切工作正常。

但是,如果我聲明在接口變量:

public interface MSMConstants { 
    public static final String NODES = "nodes"; 
} 

和實施在使用變量節點的類接口, 我得到在我第一次使用節點的空指針異常。

關於這裏發生了什麼的任何想法?

線被崩潰:

lr_fontSize.setSelectedItem(((VisualItem)m_vis.getVisualGroup(NODES).tuples().next()).getFont().getSize()); 

SearchQueryBinding sq = new SearchQueryBinding((Table) m_vis.getGroup(NODES), "label", 
     (SearchTupleSet) m_vis.getGroup(Visualization.SEARCH_ITEMS)); 

第二個是一個構造函數中;第一個也在構造函數內部,但對於從第二個實例化的對象。請求

堆棧跟蹤:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at prefuse.data.query.SearchQueryBinding.<init>(SearchQueryBinding.java:53) 
    at edu.stanford.folding.msmexplorer.MSMExplorer.<init>(MSMExplorer.java:703) 
    at edu.stanford.folding.msmexplorer.MSMExplorer.graphView(MSMExplorer.java:1538) 
    at edu.stanford.folding.msmexplorer.MSMExplorer.graphView(MSMExplorer.java:1526) 
    at edu.stanford.folding.msmexplorer.MSMExplorer$1.actionPerformed(MSMExplorer.java:202) 
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2028) 
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2351) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) 
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) 
    at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:272) 
    at java.awt.Component.processMouseEvent(Component.java:6375) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) 
    at java.awt.Component.processEvent(Component.java:6140) 
    at java.awt.Container.processEvent(Container.java:2083) 
    at java.awt.Component.dispatchEventImpl(Component.java:4737) 
    at java.awt.Container.dispatchEventImpl(Container.java:2141) 
    at java.awt.Component.dispatchEvent(Component.java:4565) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4619) 
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4280) 
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4210) 
    at java.awt.Container.dispatchEventImpl(Container.java:2127) 
    at java.awt.Window.dispatchEventImpl(Window.java:2482) 
    at java.awt.Component.dispatchEvent(Component.java:4565) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:684) 
    at java.awt.EventQueue.access$000(EventQueue.java:85) 
    at java.awt.EventQueue$1.run(EventQueue.java:643) 
    at java.awt.EventQueue$1.run(EventQueue.java:641) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98) 
    at java.awt.EventQueue$2.run(EventQueue.java:657) 
    at java.awt.EventQueue$2.run(EventQueue.java:655) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:654) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 
+1

我們可以看到如何/在哪裏使用NODES? – davidmontoyago 2012-08-08 20:33:52

+0

你能告訴我們你如何訪問NODES嗎? – JamesB 2012-08-08 20:35:50

+0

如果NODES已正確初始化,則NullPointerException與變量無關。我們可以看到StackTrace嗎? – davidmontoyago 2012-08-08 20:46:18

回答

2

不存在技術差異。我們可以在接口和類上聲明final static常量並使用它們。你展示的兩種方法都應該可以工作。

但是常量聲明與接口的概念不太匹配。我知道,很多人使用接口作爲「常量庫」,這絕對不是他們的目的。

這樣做的一個原因是它提供了一種簡單的方法來通過「實現」那些常量持有者接口「繼承」常量定義。

但是現在我們有靜態導入,儘管沒有必要「濫用」接口了。

+0

感謝您的提示。我其實並不知道靜態導入。我不特別喜歡這個語法,但我想它比接口更清晰。有趣的是,這避免了我上面遇到的問題,但我仍然不確定問題是什麼。 – bcr 2012-08-08 20:43:35

+0

我不太確定,我無法重現您的實際問題... – 2012-08-08 20:44:27

0

嗯,我不確定爲什麼它會產生一個NullPointerException,但是如果你有兩個同名的靜態變量,你應該用類名或接口名加前綴,這樣Java知道你的意思是哪個靜態變量。

您可以更改代碼以使用MSMConstants.NODESMyClassName.NODES(例如)並查看是否解決了問題?

相關問題