Java попробуй поймай и вернись - PullRequest
2 голосов
/ 20 октября 2011

У меня есть небольшая функция в Java, которая выполняет HTTP POST и возвращает объект JSON.Эта функция возвращает объект JSON.

public JSONObject send_data(ArrayList<NameValuePair> params){
    JSONObject response;
    try {
        response = new JSONObject(CustomHttpClient.executeHttpPost(URL, params).toString());
        return response;
    } catch(Exception e) {
        // do smthng
    }
}

Это показывает мне ошибку, что функция должна возвращать объект JSONObject.как мне заставить это работать?Я не могу отправить JSONObject при возникновении ошибки, могу ли я?Было бы бесполезно отправлять пустой jsonobject

Ответы [ 6 ]

10 голосов
/ 20 октября 2011

Это потому, что вы возвращаете JSONObject, только если все прошло гладко.Однако, если возникнет исключение, вы войдете в блок catch и не вернете ничего из функции.

Вам необходимо либо

  • вернуть что-то впоймать блок.Например:

    //...
    catch(Exception e) {
        return null;
    }
    //...
    
  • Возврат чего-либо после блока catch.Например:

    //...
    catch (Exception e) {
        //You should probably at least log a message here but we'll ignore that for brevity.
    }
    return null;
    
  • Выдать исключение из метода (если вы выберете эту опцию, вам нужно будет добавить throws к объявлению send_data).

    public JSONObject send_data(ArrayList<NameValuePair> params) throws Exception {
        return new JSONObject(CustomHttpClient.executeHttpPost(URL, params).toString());
    }
    
2 голосов
/ 20 октября 2011

Вы можете изменить это на:

public JSONObject send_data(ArrayList<NameValuePair> params){
    JSONObject response = null;
    try {
        response = new JSONObject(CustomHttpClient.executeHttpPost(URL, params).toString());
    } catch(Exception e) {
        // do smthng
    }

    return response;
}
0 голосов
/ 21 октября 2011

Метод send_data() должен генерировать исключение, чтобы код, вызывающий send_data(), мог контролировать, как он хочет обработать исключение.

public JSONObject send_data(ArrayList<NameValuePair> params) throws Exception {
  JSONObject response = new JSONObject(CustomHttpClient.executeHttpPost(URL, params).toString());
  return response;
}

public void someOtherMethod(){
  try{
    JSONObject response = sendData(...);
    //...
  } catch (Exception e){
    //do something like print an error message
    System.out.println("Error sending request: " + e.getMessage());
  }
}
0 голосов
/ 20 октября 2011

Я предпочитаю один вход и один выход.Нечто подобное мне кажется разумным:

public JSONObject send_data(ArrayList<NameValuePair> params)
{
    JSONObject returnValue;
    try
    {
        returnValue = new JSONObject(CustomHttpClient.executeHttpPost(URL, params).toString());
    }
    catch (Exception e)
    {
        returnValue = new JSONObject(); // empty json object .
        // returnValue = null; // null if you like.
    }

    return returnValue;
}
0 голосов
/ 20 октября 2011

Целесообразно возвращать «что-то» даже в состоянии ошибки.Посмотрите на JSend, чтобы найти способ стандартизировать ваши ответы - http://labs.omniti.com/labs/jsend

На мой взгляд, проще всего вернуть объект ошибки json и обработать его на стороне клиента, а затем полагаться исключительно на коды ошибок HTTP, поскольку не во всех средахразберись с ними как можно лучше.

0 голосов
/ 20 октября 2011

Через функцию есть путь, который ничего не возвращает;компилятору это не нравится.

Вы можете изменить это на

catch(Exception e) {
    // do smthng
    return null; <-- added line
}
or put the return null (or some reasonable default value) after the exception block.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...