【问题标题】:how to fix the problem of not entering to Try block in android studio?如何解决在android studio中无法进入Try block的问题?
【发布时间】:2019-06-20 12:32:28
【问题描述】:

我正在开发一个安卓应用程序。实际上,我的数据库位于本地主机上。我已经使用 PHP 开发了我的 API。对于android studio中的登录页面,我需要检查用户登录凭据是否正确。当我想反序列化从 API 获得的 json 时,我遇到了问题;没有进入 Try 块的问题!请您检查一下并写下解决方案是什么?

我检查了我的 API 是否正常工作,并且我得到了正确的 json;这是我的一次登录尝试中的 json:

{"status":"success","user_count":1,"user":{"id":"2","username":"yasi","password":"yasi"}}

我在班级的第一个地方放了一个“日志”命令来检查班级是否被调用和启动;它启动但忽略 Try 块并转到 Catch 块。

public void jsonToUser (String jsonUser){
    String username,password,user_count;
    try {
        JSONObject jsonObject=new JSONObject(jsonUser);

        username = jsonObject.getString("username");
        password = jsonObject.getString("password");
        user_count=jsonObject.getString("user_count");
        if(user_count.equals("1"))
        {
            if (!username.equals("admin"))
            {
                Intent intent = new Intent(getActivity(), HomePageActivity.class);
                startActivity(intent);
            }
            else
            {
                Intent intent = new Intent(getActivity(), AdminHomePageActivity.class);
                startActivity(intent);
            }
        }
        else
            Toast.makeText(getActivity(),"User not Found",Toast.LENGTH_LONG).show();
    }
    catch (JSONException e){
        Log.d("error",e.getMessage());
    }
}

如果我输入正确的用户登录凭据,我希望显示下一个活动。

首先,我正在处理 Fragment 而不是 Activity。

其次,这是在 OnCreateView() 中调用我的 API 的代码:

btnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                 new CheckUserLoginAsync().execute("http://10.0.2.2:80/whereToEatAPI/api/check_user_login_api.php"
                        ,txtUsername.getText().toString()
                        ,txtPassword.getText().toString());

【问题讨论】:

  • 您是否尝试过使用调试器进行单步调试?最后执行的行是什么?
  • 请粘贴您的 API 调用代码以及调用此 jsonToUser() 的位置
  • 你所描述的是不可能的。如果它进入了 catch 块,则意味着它进入了 try 块并且在该块中抛出了 JSONException。异常的错误和堆栈跟踪将告诉您(和我们)问题是什么如果您阅读(发布)
  • 要获得更多详细信息,可以在您的 catch 块中执行 e.printStackTrace();

标签: java json json-deserialization


【解决方案1】:

您的 JSON 具有以下结构:

{
  "status":"success",
  "user_count":1,
  "user": {
    "id":"2",
    "username":"yasi",
    "password":"yasi"
  }
}

所以这一行

username = jsonObject.getString("username");

不会像您预期的那样返回“yasi”,因为“用户名”是“用户”的字段,而不是顶级对象的字段。它要么抛出异常,要么返回 null,在这种情况下,检查 username 是否为“admin”的代码将抛出异常。无论哪种方式,你都会陷入困境。

在捕获异常时简单地打印getMessage() 的结果通常不是一个好主意,因为NullPointerException 的“消息”只是“空”。 (不确定这是因为没有消息,还是因为消息实际上说“null”,但效果是一样的。)NPE 很常见,“null”很少是有用的错误消息,所以你应该总是至少打印异常的类型,或者调用printStackTrace,或者只是将整个异常传递给记录器,这通常会用它来做正确的事情。

【讨论】:

    【解决方案2】:

    使用 Gson 获得最佳和优化的代码

    在 gradle 中添加 Gson 依赖:

    implementation 'com.google.code.gson:gson:2.8.5'
    

    现在在项目中添加两个模型类

    Login.class

    public class Login {
    
        @SerializedName("status")
        @Expose
        private String status;
        @SerializedName("user_count")
        @Expose
        private Integer userCount;
        @SerializedName("user")
        @Expose
        private User user;
    
        public String getStatus() {
            return status;
        }
    
        public void setStatus(String status) {
            this.status = status;
        }
    
        public Integer getUserCount() {
            return userCount;
        }
    
        public void setUserCount(Integer userCount) {
            this.userCount = userCount;
        }
    
        public User getUser() {
            return user;
        }
    
        public void setUser(User user) {
            this.user = user;
        }
    
    }
    

    User.class

    public class User {
    
        @SerializedName("id")
        @Expose
        private String id;
        @SerializedName("username")
        @Expose
        private String username;
        @SerializedName("password")
        @Expose
        private String password;
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
    }
    

    现在用这个替换json反序列化

    public void jsonToUser (String jsonUser){
            String username,password,user_count;
            try {
    
                Gson gson = new Gson();
                Login login =gson.fromJson(jsonUser, Login.class);
    
                username = login.getUser().getUsername();
                user_count = String.valueOf(login.getUserCount());
                password = login.getUser().getPassword();
    
                if(user_count.equals("1"))
                {
                    if (!username.equals("admin"))
                    {
                        Intent intent = new Intent(getActivity(), HomePageActivity.class);
                        startActivity(intent);
                    }
                    else
                    {
                        Intent intent = new Intent(getActivity(), AdminHomePageActivity.class);
                        startActivity(intent);
                    }
                }
                else
                    Toast.makeText(MainActivity.this,"User not Found",Toast.LENGTH_LONG).show();
            }
            catch (Exception e){
                Log.e("error",e.getMessage());
            }
        }
    

    这是进行 json 解析而不是手动解析的优化和更好的方法。

    【讨论】:

    • 针对什么进行了优化?
    • @WillisBlackburn 针对解析来自 API 的响应进行了优化。
    【解决方案3】:

    您正在直接访问用户名,但它在用户对象中。所以首先获取用户对象,然后尝试获取用户名和其他字段。

    JSONObject jsonObject=new JSONObject(jsonUser);
    JSONObject jsonObjectUser=jsonObject.getJSONObject("user");
    
    username = jsonObjectUser.getString("username");
    password = jsonObjectUser.getString("password");
    user_count=jsonObjectUser.getString("user_count");
    

    【讨论】:

      猜你喜欢
      • 2015-03-13
      • 2019-07-28
      • 2019-09-27
      • 1970-01-01
      • 2021-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多