Java 如果在第三个活动之前启动第二个活动,则获取空对象引用(如果直接从第一个活动移动到第三个活动,则无错误)

Java 如果在第三个活动之前启动第二个活动,则获取空对象引用(如果直接从第一个活动移动到第三个活动,则无错误),java,android,json,web-services,Java,Android,Json,Web Services,我知道这是一个常见的错误,我知道这里的很多话题都在问同样的错误,但我尝试了很多解决方案和非工程。 我的申请如下: 第一个活动是登录活动, 第二个是一个菜单,用于导航到哪里, 第三是客户的详细信息 我想我知道问题出在哪里,但我不知道是什么原因造成的 在第二个活动中,我调用了一个函数来获取客户id(我在第三个活动中调用了相同的函数,但没有获取所有细节,我只获取它的id,因为我在其他活动中需要它) 所以我第二次得到的结果总是空的,这导致了这个错误 所以,如果我直接从第一个跳到第三个,应用程序不会崩溃

我知道这是一个常见的错误,我知道这里的很多话题都在问同样的错误,但我尝试了很多解决方案和非工程。 我的申请如下:

第一个活动是登录活动, 第二个是一个菜单,用于导航到哪里, 第三是客户的详细信息

我想我知道问题出在哪里,但我不知道是什么原因造成的

在第二个活动中,我调用了一个函数来获取客户id(我在第三个活动中调用了相同的函数,但没有获取所有细节,我只获取它的id,因为我在其他活动中需要它)

所以我第二次得到的结果总是空的,这导致了这个错误

所以,如果我直接从第一个跳到第三个,应用程序不会崩溃

但是(第1次、第2次、第3次)该函数将被调用两次(即使我将数据存储在另一个对象中),并且仅在第一次调用时有效

希望我能解释清楚

现在,我的第二个活动代码:

public class AfterLogin extends AppCompatActivity {
    @Override
       protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        new AsyncpkAbone().execute(SharedValues.AboneKod);
        setContentView(R.layout.activity_after_login);


    }
    public void AboneBilgiPressed(View v){
        Intent i = new Intent(AfterLogin.this, UserDetailsActivity.class);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                    startActivity(i);


    }


    protected class AsyncpkAbone extends AsyncTask<String,Void,UserDetailsTable>
    {

        @Override
        protected UserDetailsTable doInBackground(String... params) {
            // TODO Auto-generated method stub
            UserDetailsTable userDetail2=null;
            RestAPI api = new RestAPI();
            try {

                JSONObject jsonObj = api.GetUserDetails(params[0]);
                JSONParser parser = new JSONParser();
                userDetail2 = parser.parseUserDetails(jsonObj);

            } catch (Exception e) {
                // TODO Auto-generated catch block
                Log.d("AsyncUserDetails", e.getMessage());

            }

            return userDetail2;
        }

        @Override
        protected void onPostExecute(UserDetailsTable result2) {
            // TODO Auto-generated method stub

            SharedValues.AboneKod =result2.getAboneKod();
            SharedValues.pkAbone = result2.getPkAbone();

        }

    }
我在双异步中调用的函数如下:

 public JSONObject GetUserDetails(String AboneKod) throws Exception {
        JSONObject result = null;
        JSONObject o = new JSONObject();
        JSONObject p = new JSONObject();
        o.put("interface","Service1");
        o.put("method", "GetUserDetails");
        p.put("AboneKod",mapObject(AboneKod));
        o.put("parameters", p);
        String s = o.toString();
        String r = load(s);
        result = new JSONObject(r);
        return result;
    }
在web服务中,这是GetUserDetails函数:

public DataTable GetUserDetails(string AboneKod)
{       
    DataTable userDetailsTable = new DataTable();
    userDetailsTable.Columns.Add(new DataColumn("Adres", typeof(String)));
    userDetailsTable.Columns.Add(new DataColumn("Tel1", typeof(String)));
    userDetailsTable.Columns.Add(new DataColumn("pkAbone", typeof(String)));

    if (dbConnection.State.ToString() == "Closed")
    {
        dbConnection.Open();
    }

    string query = "SELECT Adres,Tel1,pkAbone FROM r_Abone WHERE AboneKod='" + AboneKod + "';";

    SqlCommand command = new SqlCommand(query, dbConnection);
    SqlDataReader reader = command.ExecuteReader();

    if (reader.HasRows)
    {
        while (reader.Read())
        {
            userDetailsTable.Rows.Add(reader["Adres"], reader["Tel1"], reader["pkAbone"]);
        }
    }

    reader.Close();
    dbConnection.Close();
    return userDetailsTable;

}
当我从第二位转到第三位时,我遇到的错误是

java.lang.NullPointerException:尝试调用虚拟方法 上的“java.lang.String com.artyazilim.art.UserDetailsTable.GetAddress()” 空对象引用

10-30 05:33:13.410 24881-24881/com.artyazilim.art E/AndroidRuntime:
在 com.artyazilim.art.UserDetailsActivity$AsyncUserDetails.onPostExecute(UserDetailsActivity.java:74)

10-30 05:33:13.410 24881-24881/com.artyazilim.art E/AndroidRuntime:
在 com.artyazilim.art.UserDetailsActivity$AsyncUserDetails.onPostExecute(UserDetailsActivity.java:47) 十,

我知道这看起来像是重复的,我知道在提问之前搜索规则,我花了很多时间尝试其他人的解决方案,但我可能没有找到答案的原因是因为我不知道是什么导致了这个错误,所以不知道搜索什么


提前感谢:)

在第二个活动中检查
result2.getAboneKod()未返回
null
对象


我认为这就是为什么当您从第二个活动开始打开第三个活动时,您在第二个活动中有
NullPointerException
检查
result2.getAboneKod()未返回
null
对象


我想这就是为什么当你从第二个活动开始打开第三个活动时,你会出现
NullPointerException

你能缩小你的代码范围,只提供相关的一个吗?在tvAdres.setText(result.getAdres()!=null)之前检查(result.getAdres())@X.L.Ant很抱歉我忘了to@activesince93我尝试过同样的错误,如果仍然得到NullPointerException,那么得到的是“result”null。能否缩小代码范围,只提供相关的一个?检查tvAdres.setText(result.getAddress()!=null)之前是否有(result.getAddress())@X.L.Ant很抱歉我忘了to@activesince93我尝试过同样的错误,如果你仍然得到NullPointerException,那么你得到的是“result”null。
 public JSONObject GetUserDetails(String AboneKod) throws Exception {
        JSONObject result = null;
        JSONObject o = new JSONObject();
        JSONObject p = new JSONObject();
        o.put("interface","Service1");
        o.put("method", "GetUserDetails");
        p.put("AboneKod",mapObject(AboneKod));
        o.put("parameters", p);
        String s = o.toString();
        String r = load(s);
        result = new JSONObject(r);
        return result;
    }
public DataTable GetUserDetails(string AboneKod)
{       
    DataTable userDetailsTable = new DataTable();
    userDetailsTable.Columns.Add(new DataColumn("Adres", typeof(String)));
    userDetailsTable.Columns.Add(new DataColumn("Tel1", typeof(String)));
    userDetailsTable.Columns.Add(new DataColumn("pkAbone", typeof(String)));

    if (dbConnection.State.ToString() == "Closed")
    {
        dbConnection.Open();
    }

    string query = "SELECT Adres,Tel1,pkAbone FROM r_Abone WHERE AboneKod='" + AboneKod + "';";

    SqlCommand command = new SqlCommand(query, dbConnection);
    SqlDataReader reader = command.ExecuteReader();

    if (reader.HasRows)
    {
        while (reader.Read())
        {
            userDetailsTable.Rows.Add(reader["Adres"], reader["Tel1"], reader["pkAbone"]);
        }
    }

    reader.Close();
    dbConnection.Close();
    return userDetailsTable;

}