【问题标题】:Try block returns String before body code is executedTry 块在执行主体代码之前返回 String
【发布时间】:2011-06-26 14:02:15
【问题描述】:

我正在用 GWT 编写一个 Web 应用程序。我有一个类可以处理我所有的 http 请求并返回服务器的响应。 这是我当前的代码:(变量 messageXml 被定义为常量)

try {

        Request request = builder.sendRequest(requestData, new RequestCallback() {

            @Override
            public void onResponseReceived(Request request, Response response) {
                if(200 == response.getStatusCode()) {
                    messageXml = response.getText();

                }
                else {
                    Window.alert("There was an error (1) :-(");
                    messageXml = "ERROR";

                }
            }


            @Override
            public void onError(Request request, Throwable exception) {
                Window.alert("There was an error (2) :-(");
                messageXml = "ERROR";

            }
        });
        Window.alert(messageXml);
        return messageXml;
    }
    catch (RequestException e) {
          Window.alert("Could not connect to the server :-("); 
          return "ERROR";
        }

当我调用 httprequest 方法时,它首先返回字符串,然后执行 try 正文中的代码。 例如当我这样做时:

request object = new request();

    String test = object.httpRequest(file, type, requestData);
    Window.alert(test);

它首先输出 null(因为字符串还没有内容),然后输出字符串的内容。有谁知道为什么该方法的行为如此?

【问题讨论】:

  • “变量 messageXml 被定义为一个常量”——但是你正在给它赋值!

标签: java gwt try-catch return


【解决方案1】:

messageXml 是否定义为常量不是这里的问题。 Request#sendRequest() 是一个异步操作,因此您无法对何时为 messageXml 赋值做出任何假设。有关详细信息,请参阅 GWT 的 Getting Used to Asynchronous Calls。使用Request#sendRequest() 的正确方法是使用回调:

public void getMessageXml(String requestData,
                          final AsyncCallback<String> callback) {
  try {
    // Modify for your application.
    RequestBuilder rb = new RequestBuilder(Method.GET,
      "http://www.mycompany.com/getMessageXml");

    rb.sendRequest(requestData, new RequestCallback() {
      @Override
      public void onError(Request request, Throwable caught) {
        callback.onFailure(caught);
      }

      @Override
      public void onResponseReceived(Request request, Response response) {
        if (Response.SC_OK == response.getStatusCode()) {
          callback.onSuccess(response.getText());
        } else {
          // Use a correctly typed exception here.
          callback.onFailure(...);
        }
      }
    });
  } catch (RequestException rex) {
    callback.onFailure(rex);
  }
}

并调用方法:

object.getMessageXml(someRequestString, new AsyncCallback<String>() {
  @Override
  public void onFailure(Throwable caught) {
    // Handle error.
  }

  @Override
  public void onSuccess(String messageXml) {
    // Process response
  }
});

【讨论】:

    猜你喜欢
    • 2021-05-13
    • 1970-01-01
    • 2021-11-27
    • 2014-07-16
    • 2019-05-04
    • 2017-09-20
    • 2016-12-25
    • 2016-05-06
    • 2019-07-30
    相关资源
    最近更新 更多