【问题标题】:Android: IllegalStateException thrownAndroid:抛出 IllegalStateException
【发布时间】:2016-12-12 08:22:42
【问题描述】:

在 LoginActivity.java 类中,当用户单击注册按钮时,代码将登录会话设置为 true,然后将活动从 LoginActivity 切换到 MainActivity。这是登录代码sn-p。

            case(R.id.login):
                String email = etEmail.getText().toString();
                String password = etPassword.getText().toString();

                if(email.trim().length() > 0 && password.trim().length() > 0) {
                    loginManager.checkLogin(email, password);
                    pDialog.setMessage("Logging in..");
                    showDialog();
                    session.setLogin(true);

                    if(loginManager.isLoginSuccessful()) {
                        hideDialog();
                        Toast.makeText(this, getResources().getString(R.string.welcome_msg), Toast.LENGTH_LONG).show();
                        Intent intent = new Intent(this, MainActivity.class);
                        startActivity(intent);
                        overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
                        finish();
                    } else {
                        Toast.makeText(this, loginManager.getErrorMessage(), Toast.LENGTH_LONG).show();
                    }

                } else if(email.trim().length() < 1) {
                    Toast.makeText(this, "Please enter the email", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(this, "Please enter the password", Toast.LENGTH_SHORT).show();
                }
                break;

这里是处理登录过程的 LoginManager.java 文件。我使用 OkHttp 作为 HTTP 库。

public class LoginManager {
    private final String TAG_LOGIN = LoginManager.class.getSimpleName();
    private OkHttpClient client = new OkHttpClient();
    private final String loginURL = URL.getInstance().getUrlLogin();
    private Request request = new Request.Builder().url(loginURL).build();

    private static JSONObject jsonObject;
    private boolean error;

    public void checkLogin(final String email, final String password) {

        client.newCall(request).enqueue(new Callback() {

            // onFailure is called when the request could not be executed due to cancellation, a connectivity problem or timeout.
            @Override
            public void onFailure(Request request, IOException e) {

            }

            // onResponse is called when the HTTP response was successfully returned by the remote server.
            // using POST request for login
            @Override
            public void onResponse(Response response) throws IOException {
                Log.d(TAG_LOGIN, "Login response: " + response.body().string());
                RequestBody body = new FormEncodingBuilder()
                        .add("tag", "login")
                        .add("email", email)
                        .add("password", password)
                        .build();
                Request request = new Request.Builder().url(loginURL).post(body).build();
                client.newCall(request).execute();

                try {
                    jsonObject = new JSONObject(response.body().string());
                    error = jsonObject.getBoolean("error");
                } catch(JSONException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public boolean isLoginSuccessful() {
        if(error) {
            return false;
        }
        return true;
    }

    public String getErrorMessage() {
        String errorMessage = null;
        try {
            jsonObject.getString("error_msg");
        } catch(JSONException e) {
            e.printStackTrace();
        }

        return errorMessage;
    }
}

当我运行应用程序时,它会显示欢迎 toast 消息并突然退出并显示以下错误日志。

java.lang.IllegalStateException: closed
            at com.squareup.okhttp.internal.http.HttpConnection$FixedLengthSource.read(HttpConnection.java:454)
            at okio.Buffer.writeAll(Buffer.java:574)
            at okio.RealBufferedSource.readByteArray(RealBufferedSource.java:87)
            at com.squareup.okhttp.ResponseBody.bytes(ResponseBody.java:56)
            at com.squareup.okhttp.ResponseBody.string(ResponseBody.java:82)
            at com.marshall.thequizshow.application.http.LoginManager$1.onResponse(LoginManager.java:51)
            at com.squareup.okhttp.Call$AsyncCall.execute(Call.java:150)
            at com.squareup.okhttp.internal.NamedRunnable.run(NamedRunnable.java:33)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)

所以,我一定是在 LoginManager.java 文件的 onResponse 方法下的 try-catch 短语存在错误。

try {
                    jsonObject = new JSONObject(response.body().string());
                    error = jsonObject.getBoolean("error");
                } catch(JSONException e) {
                    e.printStackTrace();
                }

我想问你我应该如何修复代码,使其不再捕获 IllegalStateException。

提前谢谢你。

【问题讨论】:

  • 你怎么确定它正在捕获异常.. IllegalStateException 不会被JSONException 捕获块捕获,因为它们不是父子关系.. 我认为堆栈跟踪你得到是正常的..您可以在JSONException的捕获中放置一个记录器,您会看到它没有被记录,这意味着它已经没有捕获..如果您没有使用IllegalStateException或@ 987654329@ 或 Exception 然后 IllegalStateException 不会被任何 catch 块捕获..

标签: java android illegalstateexception


【解决方案1】:

作为一般答案,是:避免 RuntimeException 的正确方法是修复代码:在正常情况下,它们不应被程序捕获。

现在,让我们看看你的情况...IllegalStateException 的出现是因为 HttpConnection 在尝试使用它时似乎已关闭。会不会是因为你调用了两次方法response.body()

【讨论】:

  • 每个响应只能调用一次 response.body().string()。还要注意,如果您将其放在“监视”列表中,因为它也会被计算在内。 github.com/square/okhttp/issues/1240
【解决方案2】:

在错误的时间调用方法会引发 IllegalState 异常。检查您的流程的性质,然后重组您的代码以在适当的时间进行调用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多