0

NetBeans の Mattise フォーム エディタで設計した JPanel があります。このフォームを JFrame に含めたいと思います。ただし、JPanel のコンストラクターでは、プログラムの他の場所から静的変数を参照するため、これは失敗しています。これは、フォームエディターでは ですnull。JFrame がロードされる前に、他の場所のプログラムでのみ初期化されるためです。を思い付きNullPointerExceptionます。

public UserManagementPanel() {
    initComponents();
    loadUserRequest();
}

private void loadUserRequest() {
    GetUserListRequest req = new GetUserListRequest();
    req.setListener(this);
    transcription.Main.cq.addRequest(req);
}

初期化されていないため、 への呼び出しに失敗しtranscription.Main.cq.addRequestます。

java.lang.NullPointerException
at transcription.users.UserManagementPanel.loadUserRequest(UserManagementPanel.java:28)
at transcription.users.UserManagementPanel.<init>(UserManagementPanel.java:22)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
at java.lang.Class.newInstance(Class.java:433)
at org.netbeans.modules.form.CreationFactory.createDefaultInstance(CreationFactory.java:178)
at org.netbeans.modules.form.RADComponent.createBeanInstance(RADComponent.java:252)
at org.netbeans.modules.form.RADComponent.initInstance(RADComponent.java:191)
at org.netbeans.modules.form.GandalfPersistenceManager.restoreComponent(GandalfPersistenceManager.java:780)
at org.netbeans.modules.form.GandalfPersistenceManager.loadComponent(GandalfPersistenceManager.java:968)
at org.netbeans.modules.form.GandalfPersistenceManager.restoreComponent(GandalfPersistenceManager.java:824)
at org.netbeans.modules.form.GandalfPersistenceManager.loadComponent(GandalfPersistenceManager.java:968)
at org.netbeans.modules.form.GandalfPersistenceManager.loadForm(GandalfPersistenceManager.java:503)
at org.netbeans.modules.form.GandalfPersistenceManager.loadForm(GandalfPersistenceManager.java:283)
at org.netbeans.modules.form.FormEditor$2.run(FormEditor.java:352)
at org.netbeans.modules.form.FormLAF$2.run(FormLAF.java:293)
at org.openide.util.Mutex.doEventAccess(Mutex.java:1376)
at org.openide.util.Mutex.readAccess(Mutex.java:327)
at org.netbeans.modules.form.FormLAF.executeWithLookAndFeel(FormLAF.java:276)
at org.netbeans.modules.form.FormEditor.loadFormData(FormEditor.java:349)
at org.netbeans.modules.nbform.FormEditorSupport.loadOpeningForm(FormEditorSupport.java:467)
at org.netbeans.modules.nbform.FormDesignerTC.loadForm(FormDesignerTC.java:279)
at org.netbeans.modules.nbform.FormDesignerTC.access$300(FormDesignerTC.java:87)
at org.netbeans.modules.nbform.FormDesignerTC$PreLoadTask$1.run(FormDesignerTC.java:268)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744)
at java.awt.EventQueue.access$400(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:697)
at java.awt.EventQueue$3.run(EventQueue.java:691)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:714)
at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:159)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

このコードは、フォーム エディターにとって重要ではありません。実際のプログラムで実行する必要があるのは、そのコードだけです。初期化時にそのコードを無視するようにフォーム エディターに指示する方法はありますか?

4

1 に答える 1

0

最後に、簡単な回避策を実行しました。NullPointerException をキャッチして無視しました。

private void loadUserRequest() {
    GetUserListRequest req = new GetUserListRequest();
    req.setListener(this);
    try {
        transcription.Main.cq.addRequest(req);
    } catch (NullPointerException e) {}
}

実際のプログラムの実行中に何らかの理由で cq が実際に になる場合null、例外をスローする必要があるため、これは完璧なソリューションではありません。他の誰かがよりエレガントなソリューションを持っているかどうか知りたいです。

于 2014-11-11T19:06:06.783 に答える