Nullpointer [Umbrella] 싱글 톤에서 GWT SimpleEventBus 이벤트를 시작할 때 예외가 발생했습니다.

패트릭

GWT SimpleEventbus의 간단한 구현에 몇 시간 동안 갇혀 있습니다.

이 설정에 문제가 있습니까? 이에 대한 가능한 이유는 무엇입니까?

web.binderyEventbus를 사용하고 있습니다.

import com.google.web.bindery.event.shared.SimpleEventBus;

Eventbus는 내 Entrypoint 클래스에서 초기화됩니다.

public void onModuleLoad() {

    ApplicationEvents = new SimpleEventBus();

그런 다음 Singleton LoadData와 MainView (MVP가없는 UIBinder 클래스)에 삽입됩니다.

    LoadData.initLoadData(ApplicationEvents);
    view = new MainView(ApplicationEvents);

initLoadData는 아무것도 반환하지 않는다는 점을 제외하면 기본적으로 생성자의 별칭입니다.

public class LoadData {

    private final SimpleEventBus eventBus;

    private LoadData(final SimpleEventBus bus) {
        eventBus = bus;
        ...
    }

    public static void initLoadData(final SimpleEventBus bus){ 
        if (instance == null){
            instance = new LoadData(bus);
        }
    }

Eventbus는 이와 같이 MainView에 삽입됩니다.

public class MainView extends Composite {

    private final SimpleEventBus eventbus;

    public MainView(final SimpleEventBus bus) {
        eventbus = bus;
        ...

그런 다음 핸들러가 등록됩니다.

        eventbus.addHandler(EntriesReceiveEvent.TYPE, new EntriesReceiveEventHandler() {
            @Override
            public void onEntriesReceive(EntriesReceiveEvent event) {
            ...
            }
        });

그리고 메서드가 끝나면 LoadData의 메서드를 호출합니다.

        LoadData.getLoadData().fetchYears(); //alias for loadIndex

LoadData.java 의 loadIndex 메소드

        private void loadIndex() {
                System.out.println(eventBus.toString());
                if(indexEntries == null){
                    AsyncCallback..
                    public void onSuccess(Map<Short, IndexEntry> result) {
                        eventBus.fireEvent(new EntriesReceiveEvent());
                        //^^ LoadData.java:190

ItemsReceiveEvent.java

import com.google.gwt.event.shared.GwtEvent;

public class EntriesReceiveEvent extends GwtEvent<EntriesReceiveEventHandler> {

      public static Type<EntriesReceiveEventHandler> TYPE = 
              new Type<EntriesReceiveEventHandler>();

    @Override
    public Type<EntriesReceiveEventHandler> getAssociatedType() {
        return TYPE;
    }

    @Override
    protected void dispatch(EntriesReceiveEventHandler handler) {
        handler.onEntriesReceive(this);
    }
}

그리고 그것은 핸들러 ItemsReceiveEventHandler.java입니다.

import com.google.gwt.event.shared.EventHandler;

public interface EntriesReceiveEventHandler extends EventHandler {

    void onEntriesReceive(EntriesReceiveEvent event);
}

마지막으로 예외입니다.

11:36:57.417 [ERROR] [] Uncaught exception escaped

com.google.web.bindery.event.shared.UmbrellaException: Exception caught: null
at com.google.web.bindery.event.shared.SimpleEventBus.doFire(SimpleEventBus.java:203)
at com.google.web.bindery.event.shared.SimpleEventBus.fireEvent(SimpleEventBus.java:88)
at com.SoftwareEngineering.client.LoadData$2.onSuccess(LoadData.java:190)
at com.SoftwareEngineering.client.LoadData$2.onSuccess(LoadData.java:1)
at com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter.java:232)
at com.google.gwt.http.client.Request.fireOnResponseReceived(Request.java:258)
at com.google.gwt.http.client.RequestBuilder$1.onReadyStateChange(RequestBuilder.java:412)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:338)
at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:219)
at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)
at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:571)
at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:279)
at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)
at com.google.gwt.core.client.impl.Impl.apply(Impl.java)
at com.google.gwt.core.client.impl.Impl.entry0(Impl.java:242)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:293)
at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:547)
at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:364)
at java.lang.Thread.run(Unknown Source)

나는 Eventbus가 모두 동일한 Eventbus와 대화하고 있는지 알지 못했던 것과 같지 않을 것이라고 생각했습니다. 그러나이 사이트 는 내 우려가 잘못되었음을 입증했습니다.

부수적 인 질문 :이 문맥에서 싱글 톤이 나쁘다고 생각 하십니까? 이는 다소 작은 프로젝트이며 모든 RPC 요청을 처리하는 LoadData는 전역 적으로 사용 가능해야합니다.

도움을 주셔서 감사합니다!

콜린 앨 워스

보유하고있는 NPE는 Umbrella 예외로 묶여 있습니다. 이것은 이벤트 핸들러 중 하나가 실제로 예외를 발생 시켰음을 의미합니다. 이 경우 표준 절차는 나머지 핸들러를 계속 호출 한 다음 발생하는 동안 발생한 모든 오류를 포함하는 우산 예외를 발생시키는 것입니다.

실제 예외 를 읽으려면 스택 위로 계속 진행하십시오.이 문제가 발생한 곳을 지나서 나머지 로그를 읽고 핸들러 (아마도 사용자 고유의 이벤트 핸들러 코드 또는 핸들러가 호출하는 일부 코드)에서 발생한 일을 확인하십시오.

이와 같은 문제를 파헤치는 또 다른 방법 : IDE의 디버거를 사용하고 throw 된 모든 NullPointerException에 중단 점을 설정합니다. 이렇게하면 NPE가 발생하는 즉시 디버거가 일시 중지되므로 로그를 파헤치는 대신 즉시 확인할 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관