简体   繁体   English

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

[英]Error converting result java.lang.NullPointerException: lock == null, Why tthis error?

This is the logcat 这是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

This is my JAVA code 这是我的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;
                }
        }

}

My JSON parser is 我的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;

    }
}

If you use localhost in your android device it is referring to the actual device, if you want to access to your local computer, use your LAN IP address if your device is connected to your LAN network, or your internet IP if not. 如果您在android设备中使用localhost ,则是指实际设备,如果要访问本地计算机,请在设备连接到LAN网络时使用LAN IP地址,否则请使用Internet IP。

If on the other hand, you are using Android emulator, change localhost to 10.0.2.2 . 另一方面,如果您使用的是Android模拟器, 10.0.2.2 localhost更改为10.0.2.2

PS: You are possibly missing a port in your url, depending on how you have configurated your server. PS:根据您配置服务器的方式,您可能在URL中缺少端口。

That should do the trick 这应该够了吧

in your code json object is assigned as null because makeHttpRequest is either returning null or failed to make connection. 代码中的json对象被分配为null,因为makeHttpRequest返回null或建立连接失败。

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

so this line will throw exception when you call any method by any reference that is pointing to null. 因此,当您通过指向null的任何引用调用任何方法时,此行将引发异常。

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

replace localhost to localhost:your listening port number(ex:8080) 将localhost替换为localhost:您的监听端口号(例如:8080)

if your are running your app in emulator replace localhost to 10.0.2.2:your listening port number 如果您在模拟器中运行您的应用,请将localhost替换为10.0.2.2:您的监听端口号

  1. run makeHttpRequest() in separate thread 在单独的线程中运行makeHttpRequest()
  2. make sure internet permission is added to your manifest.xml file 确保将互联网权限添加到您的manifest.xml文件中

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM