【问题标题】:Return string from try catch block从 try catch 块返回字符串
【发布时间】:2015-07-07 22:08:43
【问题描述】:

我正在尝试从 Foo 函数返回字符串,但它的应用程序崩溃了。

public String Foo (String email){
    String url_set = "http://****.php?email=" + email;
    String responseStr = "1";
    try {
        HttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url_set);
        HttpResponse response = httpClient.execute(httpPost);
        return responseStr;
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
        return responseStr;
    } catch (ClientProtocolException e) {
        Log.e("ClientProtocolException", "Client");
        e.printStackTrace();
        return responseStr;
    } catch (IOException e) {
        Log.e("Ioexception", "Ioexption");
        e.printStackTrace();
        return responseStr;
    }
}

一般来说,我想将响应转换为字符串并将其返回给调用者。 但现在我无法返回字符串。

UPD:日志猫

04-28 14:13:57.220    2917-2917/com.example.lemon.onlineshop E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.lemon.onlineshop, PID: 2917
    android.os.NetworkOnMainThreadException
            at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
            at java.net.InetAddress.lookupHostByName(InetAddress.java:418)
            at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
            at java.net.InetAddress.getAllByName(InetAddress.java:215)
            at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
            at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
            at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
            at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
            at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
            at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
            at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
            at com.example.lemon.onlineshop.Library.SessionManager.getString(SessionManager.java:88)
            at com.example.lemon.onlineshop.Library.SessionManager.createLoginSession(SessionManager.java:76)
            at com.example.lemon.onlineshop.MainActivity.executeLogIn(MainActivity.java:96)
            at com.example.lemon.onlineshop.MainActivity$LogIn.onPostExecute(MainActivity.java:191)
            at com.example.lemon.onlineshop.MainActivity$LogIn.onPostExecute(MainActivity.java:160)
            at android.os.AsyncTask.finish(AsyncTask.java:632)
            at android.os.AsyncTask.access$600(AsyncTask.java:177)
            at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

UPD2:添加了整个班级

public class SessionManager {
// Shared Preferences
SharedPreferences pref;

// Editor for Shared preferences
SharedPreferences.Editor editor;

// Context
Context _context;

// Shared pref mode
int PRIVATE_MODE = 0;

// Sharedpref file name
private static final String PREF_NAME = "SessionPref";

// All Shared Preferences Keys
private static final String IS_LOGIN = "IsLoggedIn";

// User name (make variable public to access from outside)
public static final String KEY_EMAIL = "email";

// Email address (make variable public to access from outside)
public static final String KEY_PASSWORD = "password";

//
public static final String KEY_ID = "id";

// Constructor
public SessionManager(Context context){
    this._context = context;
    pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
    editor = pref.edit();
}

/**
 * Create login session
 * */
public void createLoginSession(String email, String password){
    // Storing login value as TRUE
    editor.putBoolean(IS_LOGIN, true);

    // Storing name in pref
    editor.putString(KEY_EMAIL, email);

    // Storing email in pref
    editor.putString(KEY_PASSWORD, password);

    // Storing id in pref
    editor.putString(KEY_ID, getId(email));
    // commit changes
    editor.commit();
}

public String getId(String email){
    String url_set = "http://***.php?email=" + email;
    String responseStr = "1";
    try {
        HttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url_set);
        httpClient.execute(httpPost);
        return responseStr;
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
        return responseStr;
    } catch (ClientProtocolException e) {
        Log.e("ClientProtocolException", "Client");
        e.printStackTrace();
        return responseStr;
    } catch (IOException e) {
        Log.e("Ioexception", "Ioexption");
        e.printStackTrace();
        return responseStr;
    }
}

【问题讨论】:

  • 添加返回reponseStr;在最后一个 catch 块之后。此时,如果抛出任何其他异常,那么您捕获的异常,则您缺少 return 语句,从而使该方法无法编译。
  • @Stultuske:不——如果有不同的例外,它会冒泡;如果没有异常,这意味着它一定已经到达try块的末尾并从那里返回。
  • return reponseStr 不起作用,android studio 说:“Unreachable statement”。
  • @JonSkeet:是的。我的错。但是我在最后一个 catch 块之后添加 return 语句的声明仍然有效:)
  • @Stultuske: 会使它无法编译,因为它是一个无法访问的语句。所以不,不要在最后一个 catch 块之后添加额外的 return 语句...

标签: java android http try-catch


【解决方案1】:

您不能在主线程上进行网络调用。你需要创建一个单独的线程来运行这个函数。

【讨论】:

    猜你喜欢
    • 2012-05-18
    • 2016-07-24
    • 2016-02-01
    • 2019-05-20
    • 2012-11-10
    • 2016-05-06
    • 2018-06-27
    • 2019-08-31
    • 2014-04-30
    相关资源
    最近更新 更多