android studio 无法进入Try 区块如何解决?

how to fix the problem of not entering to Try block in android studio?

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

我检查了我的 API 是否正常工作,我做对了 json;这是来自我的一次登录尝试的 json:

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

我在 class 的开头放了一个 "Log" 命令来检查 class 是否被调用和启动;它启动但忽略 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());
    }
}

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

首先,我正在处理片段而不是 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());

您的 JSON 具有以下结构:

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

所以这一行

username = jsonObject.getString("username");

不会像您预期的那样变成 return "yasi",因为 "username" 是 "user," 的字段,而不是顶级对象的字段。它要么抛出异常,要么 return 为 null,在这种情况下,检查 username 是否为 "admin" 的代码将抛出异常。无论哪种方式,你都会中招。

捕获异常时简单地打印 getMessage() 的结果通常不是一个好主意,因为 NullPointerException 的 "message" 只是 "null."(不确定是否这是因为没有消息,或者因为消息实际上说 "null," 但效果是一样的。)NPE 很常见,而 "null" 很少是有用的错误消息,因此您应该始终打印至少是异常的类型,或者调用 printStackTrace,或者只是将整个异常传递给记录器,记录器通常会用它做正确的事情。

Use Gson for best and optimized code

Add Gson dependency in gradle :

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 解析而不是手动解析的优化和更好的方法。

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

JSONObject jsonObject=new JSONObject(jsonUser);
JSONObject jsonObjectUser=jsonObject.getJSONObject("user");

username = jsonObjectUser.getString("username");
password = jsonObjectUser.getString("password");
user_count=jsonObjectUser.getString("user_count");