转换结果时出错java.lang.NullPointerException:lock == null,为什么会出现这个错误?

时间:2015-03-13 06:26:29

标签: java android json

这是logcat

  D/request!(1826): [mtd=empLog, request[cmp_id]=, request[user_name]=sureshsk_cepl, request[password]=ceplvalrep2014, request[remember]=1, Phone_type=Android]
    I/Choreographer(1826): Skipped 39 frames!  The application may be doing too much work on its main thread.
    I/art(1826): Background sticky concurrent mark sweep GC freed 1612(81KB) AllocSpace objects, 0(0B) LOS objects, 19% free, 829KB/1026KB, paused 4.407ms total 114.250ms
    W/System.err(1826): org.apache.http.conn.HttpHostConnectException: Connection to http://localhost refused
    W/System.err(1826):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:183)
    W/System.err(1826):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
    W/System.err(1826):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
    W/System.err(1826):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
    W/System.err(1826):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
    W/System.err(1826):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
    W/System.err(1826):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
    W/System.err(1826):     at com.cepl.valrep.adapter.JSONParser.makeHttpRequest(JSONParser.java:52)
    W/System.err(1826):     at com.cepl.valrep.MainActivity$Login.doInBackground(MainActivity.java:120)
    W/System.err(1826):     at com.cepl.valrep.MainActivity$Login.doInBackground(MainActivity.java:1)
    W/System.err(1826):     at android.os.AsyncTask$2.call(AsyncTask.java:288)
    W/System.err(1826):     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    W/System.err(1826):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
    W/System.err(1826):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
    W/System.err(1826):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
    W/System.err(1826):     at java.lang.Thread.run(Thread.java:818)
    W/System.err(1826): Caused by: java.net.ConnectException: failed to connect to /127.0.0.1 (port 80): connect failed: ECONNREFUSED (Connection refused)
    W/System.err(1826):     at libcore.io.IoBridge.connect(IoBridge.java:124)
    W/System.err(1826):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
    W/System.err(1826):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:456)
    W/System.err(1826):     at java.net.Socket.connect(Socket.java:882)
    W/System.err(1826):     at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
    W/System.err(1826):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
    W/System.err(1826):     ... 15 more
    W/System.err(1826): Caused by: android.system.ErrnoException: connect failed: ECONNREFUSED (Connection refused)
    W/System.err(1826):     at libcore.io.Posix.connect(Native Method)
    W/System.err(1826):     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:111)
    W/System.err(1826):     at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
    W/System.err(1826):     at libcore.io.IoBridge.connect(IoBridge.java:122)
    W/System.err(1826):     ... 20 more
    E/Buffer Error(1826): Error converting result java.lang.NullPointerException: lock == null
    E/JSON Parser(1826): Error parsing data org.json.JSONException: End of input at character 0 of 
    W/System.err(1826): java.lang.NullPointerException: Attempt to invoke virtual method 'int org.json.JSONObject.getInt(java.lang.String)' on a null object reference
    W/System.err(1826):     at com.cepl.valrep.MainActivity$Login.doInBackground(MainActivity.java:126)
    W/System.err(1826):     at com.cepl.valrep.MainActivity$Login.doInBackground(MainActivity.java:1)
    W/System.err(1826):     at android.os.AsyncTask$2.call(AsyncTask.java:288)
    W/System.err(1826):     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    W/System.err(1826):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
    W/System.err(1826):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
    W/System.err(1826):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
    W/System.err(1826):     at java.lang.Thread.run(Thread.java:818)
    I/System.out(1826): Some error occurs

这是我的JAVA代码

public class MainActivity extends Activity implements OnClickListener{

    private EditText Edit_UserName,Edit_Password;
    private Button Login;
    private RadioButton Remember;
    TextView textview;

    HttpPost httppost;
    StringBuffer buffer;
    HttpResponse response;
    HttpClient httpclient;
    List<NameValuePair> nameValuePairs;
    ProgressDialog dialog = null;

    JSONParser jsonParser = new JSONParser(); 
    private static String url_login = "http://localhost/valrep/php/request.php?c=employee";
    private static final String TAG_SUCCESS = "success";
    private static final String TAG_MESSAGE = "message";

    static String mtd;
    static String cmp_id;
    static String login_username;
    static String login_password;
    String remember="0";

    AsyncTask<Void, Void, Void> mRegisterTask;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Edit_UserName = (EditText)findViewById(R.id.txtUserName);
        Edit_Password = (EditText)findViewById(R.id.txtDate);
        Login = (Button) findViewById(R.id.btnLogin);       
        Remember = (RadioButton)findViewById(R.id.btnCheckin);
        textview = (TextView)findViewById(R.id.textView1);

//      Remember.setOnClickListener(this);
        Login.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {

        switch (v.getId()) {
        case R.id.btnLogin:
            login_username = Edit_UserName.getText().toString();
            login_password = Edit_Password.getText().toString();

            if (Remember.isChecked()) {
                remember = "1";
            }else {
                remember = "0";
            }

            new Login().execute();

//          httpclient=new DefaultHttpClient();
//          httppost= new HttpPost(url_login);
        }
    }   
        class Login extends AsyncTask<String, String, String>{

             boolean failure = false;
             private JSONArray jsonarray=null;

                @Override
                protected String doInBackground(String... args) {

                    int success;

                    try{
                        nameValuePairs = new ArrayList<NameValuePair>();
                        List<NameValuePair> params = new ArrayList<NameValuePair>();
                        params.add(new BasicNameValuePair("mtd", "empLog"));
                        params.add(new BasicNameValuePair("request[cmp_id]", ""));
                        params.add(new BasicNameValuePair("request[user_name]", login_username));
                        params.add(new BasicNameValuePair("request[password]", login_password));
                        params.add(new BasicNameValuePair("request[remember]", remember));
                        params.add(new BasicNameValuePair("Phone_type", "Android"));
//                      httppost.setEntity(new UrlEncodedFormEntity(params));

                        Log.d("request!", params.toString());

                        JSONObject json = jsonParser.makeHttpRequest(url_login, "POST", params);

//                      HttpResponse response = httpclient.execute(httppost);
//                      
//                      Log.d("request!",json.toString());

                        success = json.getInt(TAG_SUCCESS);

                        if (success == 1) {

                            Toast.makeText(getApplicationContext(), "Successfully loggedIn", Toast.LENGTH_LONG).show();
                            }
                        else {

                            Toast.makeText(getApplicationContext(), "Wrong username or password", Toast.LENGTH_LONG).show();
                        }

                    }catch (Exception e) {
                        e.printStackTrace();
                        System.out.println("Some error occurs");
                    }

                    // TODO Auto-generated method stub
                    return null;
                }
        }

}

我的JSON解析器是

public class JSONParser
{
    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    // constructor
    public JSONParser() {

    }

    // function get json from url
    // by making HTTP POST or GET mehtod
    public JSONObject makeHttpRequest(String url, String method,
            List<NameValuePair> params) {

        // Making HTTP request
        try {

            // check for request method
            if(method == "POST"){

                // request method is POST
                // defaultHttpClient
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);
                httpPost.setEntity(new UrlEncodedFormEntity(params));

                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();

            }
            else if(method == "GET"){
                // request method is GET
                DefaultHttpClient httpClient = new DefaultHttpClient();
                String paramString = URLEncodedUtils.format(params, "utf-8");
                url += "?" + paramString;
                HttpGet httpGet = new HttpGet(url);

                HttpResponse httpResponse = httpClient.execute(httpGet);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
            }           


        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            //Log.d("response string",json);
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;

    }
}

3 个答案:

答案 0 :(得分:1)

如果您在Android设备中使用localhost,则指的是实际设备,如果您要访问本地计算机,请使用您的LAN IP地址(如果您的设备已连接到LAN网络)或互联网IP如果没有。

另一方面,如果您使用的是Android模拟器,请将localhost更改为10.0.2.2

PS:您可能错过了网址中的端口,具体取决于您配置服务器的方式。

应该做的伎俩

答案 1 :(得分:0)

代码中的

json对象被指定为null,因为makeHttpRequest要么返回null,要么无法建立连接。

JSONObject json = jsonParser.makeHttpRequest(url_login, "POST", params);

因此,当您通过任何指向null的引用调用任何方法时,此行将抛出异常。

success = json.getInt(TAG_SUCCESS); // because json = null

答案 2 :(得分:0)

将localhost替换为localhost:您的侦听端口号(例如:8080)

如果您在模拟器中运行您的应用 将localhost替换为10.0.2.2:您的侦听端口号

  1. 在单独的线程中运行makeHttpRequest()
  2. 确保将internet权限添加到您的manifest.xml文件