2012-04-09 2 views
0

일부 디버깅 후 "com.google.gwt.event.shared.UmbrellaException : 하나 또는 더 많은 예외가 발견되어 UmbrellaException # getCauses에서 전체 세트를 볼 수 있습니다. 메소드 호출시 : [nsIDOMEventListener :: handleEvent]"(웹 모델) 런타임 null pointer.Question에 의해 발생합니다 이유는 런타임 null 포인터 예외가 이런 종류의 호스트 model.Actually, 예외 코드를 던져 밖으로 throw되지 않습니다 심지어 내 노트북 ​​(경고 gt 2.4 + 자바 7 64 비트 + 우분투 12.04 64 비트 + 이클립스 3.7). 누구든지 JavascriptObject 포인터에 런타임 null이 발생할 때마다 예외를 던져 예외를 제거하도록합니다.JavascriptObject의 런타임 null 포인터를 감지 할 수없는 이유는 무엇입니까?

public class GWTTest implements EntryPoint 
{ 
    public static class JsObj extends JavaScriptObject 
    { 
     protected JsObj() 
     { 
     } 

     public final native void setValue(String Value)/*-{ 
       this.Value=Value; 
       alert(Value); 
     }-*/; 
    } 

    public void onModuleLoad() 
    { 
     JsObj jsObj = null; 
     jsObj.setValue("val"); 
    } 
} 

답변

2

컴파일러는 GWT/Java를 Javascript로 변환하기 위해 여러 가지 최적화 작업을 수행합니다.

  • 유형 및 메소드가 최종적으로 작성됩니다. 이는 나중에 구현 된 메소드가 정상적으로 전달되어야하고 정적 구현이 가능하며 단일 구현을 호출하는 것을 이해할 수있게합니다.
  • 방법은, 가능하다면, 방법은 인라인 할 수있는 정적 만들어, 방법은 인라인 가능하고 합리적인
  • 말했다 ...

나는 당신의 샘플는 onModuleLoad의 몸을 (컴파일 할 때)이 밖으로 최적화되어 있습니다 :

null.nullMethod(); 

이 '이 작동하지 않습니다'말의 GWT 컴파일러의 방법입니다 -이 값은 항상 null의 경우, 그래서 메소드가 호출 할 수 없음을 통지. 그러나 Dev 모드에서는 null 객체가 JavaScript의 window 객체를 가리키고 있습니다. 이 내용은 GWT 프로젝트의 http://code.google.com/p/google-web-toolkit/issues/detail?id=6625에 있습니다.

null을 처리하지 않으려면 메소드를 호출하기 전에 null을 테스트하십시오. 테스트와 같은 경우 값이 항상 null 인 경우 최적화됩니다. 런타임 예외는 코드 제어에 사용되어서는 안되므로 코드에서 NullPointerException을 사용해서는 안됩니다.

관련 문제