2016-04-20 5 views
4

Dies ist eine Funktion der Klasse A, in der ich meinen Wert an einen Klassennamen übergebe, um seine Registerfunktion zu bestätigen.Warum bekomme ich null Zeigerausnahme, obwohl es einen Wert gibt, wenn println angezeigt wird?

private void registerOrder() { 
    confirm.register(id); 
} 

Dies ist Klasse bestätigen. In dieser Klasse habe ich geplant, Daten innerhalb des Servers zu veröffentlichen. Es gibt keine Fehler in der URL. Ich habe diesen Code "System.out.println (" wei "+ getPostDataString (postDataParams));" und ich habe meinen Wert bekommen. Aber das System sagt Nullzeiger. Gibt es Fehler in anderen Teilen des Codes?

public class confirm { 
private static final String REGISTER_URL = 
"http://192.168.43.214/apexStore2/confirm.php"; 

public static void register(String id) { 
    class RegisterUser extends AsyncTask<String, Void, String> { 
     ProgressDialog loading; 
@Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
     } 

     @Override 
     protected void onPostExecute(String s) { 
      super.onPostExecute(s); 
      loading.dismiss(); 
     } 
    @Override 
     protected String doInBackground(String... params) { 

      HashMap<String, String> data = new HashMap<>(); 
      data.put("product_id",params[0]); 

      String result = sendPost(REGISTER_URL,data); 

      return result; 
     } 
    } 

    RegisterUser ru = new RegisterUser(); 
    ru.execute(String.valueOf(id)); 
} 
public static String sendPost(String requestURL, 
           HashMap<String, String> postDataParams) { 

    URL url; 
    String response = " "; 
    try { 
     url = new URL(requestURL); 

     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setRequestMethod("POST"); 
     conn.setRequestProperty("Content-Type", 
       "application/x-www-form-urlencoded"); 
     conn.setRequestProperty("Content-Length", "" +      
    Integer.toString(getPostDataString(postDataParams).getBytes().length)); 
     conn.setRequestProperty("Content-Language", "en-US"); 
     conn.setReadTimeout(15000); 
     conn.setConnectTimeout(15000); 
     conn.setDoInput(true); 
     conn.setDoOutput(true); 


     OutputStream os = conn.getOutputStream(); 
     BufferedWriter writer = new BufferedWriter(
       new OutputStreamWriter(os, "UTF-8")); 
     writer.write(getPostDataString(postDataParams)); 
     System.out.println("wei" + getPostDataString(postDataParams)); 

     writer.flush(); 
     writer.close(); 
     os.close(); 
     int responseCode=conn.getResponseCode(); 

     if (responseCode == HttpsURLConnection.HTTP_OK) { 
      BufferedReader br=new BufferedReader(new 
    InputStreamReader(conn.getInputStream())); 
      response = br.readLine(); 
     } 
     else { 
      response="Error Registering"; 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return response; 
} 

private static String getPostDataString(HashMap<String, String> params) 
throws UnsupportedEncodingException { 
    StringBuilder result = new StringBuilder(); 
    boolean first = true; 
    for(Map.Entry<String, String> entry : params.entrySet()){ 
     if (first) 
      first = false; 
     else 
      result.append("&"); 

     result.append(URLEncoder.encode(entry.getKey(), "UTF-8")); 
     result.append("="); 
     result.append(URLEncoder.encode(entry.getValue(), "UTF-8")); 
    } 

    return result.toString(); 
} 
} 
+0

println Nachricht benötigt, tritt auf, wenn es keine Daten in Log-Anweisungen angezeigt ist oder SOPs. Fügen Sie einen Debugger hinzu und überprüfen Sie, ob Ihr Wert erhalten wird oder nicht. –

+0

Werfen Sie einen Blick auf den Stacktrace von NPE und sehen Sie, wo es geworfen wird. – gmaslowski

+0

für das Debugging, sollte ich so schreiben? Log.d (getPostDataString (postDataParams), "onCreate()"); –

Antwort

0

Code Lesen ich die Null-Zeiger Ausnahme nehme an erscheint, wenn Sie confirm.register(id) nennen.

Wenn Sie eine Klasse in einer statischen Art und Weise verwenden möchten, müssen Sie es als letzte Klasse deklarieren:

public final class confirm {...} 

Für Sie sollte es funktionieren. Dennoch können Sie auch Ihr Problem lösen, ohne die endgültige Kennung unter Verwendung von eine Instanz der Klasse zu erstellen:

confirm conf = new confirm(); 
conf.register(id); 

Ich habe auch gesehen, dass Ihre Klassennamen mit einem Kleinbuchstaben beginnt. Es wird empfohlen, die Klassennamen beginnend mit einem Großbuchstaben zu erstellen.

Wenn es Ihren Fehler nicht löst, bitte die Fehlerinformationen hier einfügen.

+0

Der Nullzeiger wird aufgelöst, indem loading.dismiss() entfernt wird; von onpostexecute. Daten werden jedoch nicht an die Datenbank übergeben. Stimmt etwas nicht mit meiner Methode? –

2

Sie eine Instanzvariable haben, die nie zugeordnet:

ProgressDialog loading; 

und es verwendet wird, in

protected void onPostExecute(String s) { 
    super.onPostExecute(s); 
    loading.dismiss();  // expect NPE 
} 
+0

wenn ich debugge, erhalte ich den Wert –

+0

Welchen Wert meinst du? – laune

+0

dieser eine System.out.println ("wei" + getPostDataString (postDataParams)); –

Verwandte Themen