Überprüfen ob Server online ist - > NullPointerException

  • Hallo leude,


    ich bin es mal wieder. Hmm.. also ich beschäftige mich gerade mit dem Problem, wie ich mit einer App überprüfen kann ob ein Server online ist. Die Anwendung selbst greift nämlich auf eine webservice zu. Und falls dieser nicht online sein sollte, habe ich mir überlegt, dass die anwendung so früh wie möglich den user informieren soll (z.B. mit einem AlertBox mit der message das der Service gerade nicht genutzt werden kann, da keine Verbindung zum Server hergestellt werden kann). Allerdings bekomme ich stets eine NullPointerException wenn ich die app ausführe. Die Verbindung zu dem webservice wird erst über einen menübutton ausgeführt. was ich möchte ist, das während die activity aufgebaut wird oder ist, dann überprüft werden soll, ob überhaupt eine Verbindung hergestellt werden kann. Ich bin folgendermaßen vorgegangen:




    log-Ausgabe:



    Habe das in die onResume-Methode gepackt und bekomme daher die Fehlermeldung. WEnn das die onCreate-Methode wäre dann hätte ich die Fehlermeldung verstanden, aber auch bei der onResume?? :-/


    Wie gesagt möchte ich, wenn die App sozusagen geladen wird, die überprüfung stattfindet. Mal abgesehen davon, bin ich mir auch nicht mal sicher, ober die isServerReachable()-Methode korrekt ist. Könnte man die überprüfung während eines splashscreens durchführen?


    Danke im voraus für die antworten


    PS: verzeiht die rechtschreibfehler. habe schnell geschrieben O:-)

  • Netzwerkzugriffe gehören seit Android 3.0 in einen eigenen Thread sonst gibt es Policy OnNetwork Error oder so, aber bis dahin kommt deine App gerade nicht (sollte also erst das nächste Problem sein) -> Lösung: AsyncTask


    Zu deinem Fehler - ich vermute mal dein context ist eventl nicht inialisiert....


    context.getSystemService(Context.CONNECTIVITY_SERVICE);



    besser mit GetActivityContext oder so besorgen oder der Function übergeben.

  • hallo killphil75,


    danke für deine hilfe. meinst du mit getActivityContext getApplicationContext??


    ich habe das in einen separaten thread gepackt. aber anscheinend kann ich diese doch nicht aus der onResume()-Methode aus ausführen.


    MainActivity:



    Thread:


    wieder eine nullpointerexception :-/


    die letzte zeile des log-cats zeigt, dass es eine erfolgreiche verbinung gab. in zeile 445 seht die if-bedinung


    Code
    if(serverOnline == false) {
    			
    			showServerUnreachableMessage();
    		}


    was genau mache ich falsch? :-[

  • habe das jetzt ohne thread/asynctask zum laufen gebracht. es läuft zwar, aber wird immerwieder die exception ausgeführt, also sprich der alertdialog ausgeworfen. der link wird gar nicht gecheckt ob diese erreichbar ist.



    irgendeiner eine idee?

  • Lass Dir doch mal in der Exception im Log ausgeben was das für eine Exception ist und poste es hier.


    bzw. wenn es immer noch die Nullpointer ist, dann einfach mal den Debugger starten und Schritt für Schritt durchsteppen
    da siehst du wo er ins "Leere" greift.

  • Moin killphil75,


    ne du hast mich falsch verstanden. Ich bekomme keine fehlermeldungen oder irgendwelche abstürze. Was ich meinte ist, dass vom try-catch block der catch block ausgeführt wird, Also die methode showServerUnreachableMessage(). dadrunter habe ich ja noch einen log.eintrag hinzugefügt. Also wenn ich die app ausführe dann erscheint sofort der errorDialog. ich glaube nicht, dass die app überprüft hat, ob der server online oder offline ist.


    hier sind die logeinträge, wenn ich die app ausführe:


  • Also try catch fängt ja aber die Exception, deswegen siehst du ja den Fehler nicht (try catch sorgt dafür das dein Programm nicht abstürzt)
    und weil du im Catch die Fehlermeldung ausgibst siehts du deinen ErrorDialog.


    Also kommt es vorher zu einer Exception. (das war ja ursprünglich mal diese "NullPointer" Nummer, und dafür musst du die Ursache finden.
    In den meisten Fehler greift er auf ein Objekt zu, welches nicht initalisiert ist.


    bau mal
    in deinem Catch



    Java
    try {
    			URL url = new URL("http://www.google.de"); 
    			checkReq(url);
    		} 
    		catch (Exception e) {
    			showServerUnreachableMessage();
    			Log.e("Service", "Service is not available");
    		}


    ein


    Java
    Log.d("Service" , "Ich bin der Fehler : " + e.getMessage());



    ein

  • stimmt, du hast recht.


    habe den catch-block wie du geraten hast erweitert.




    NACHTRAG: ok, habe es gesehen. -> NULL :(

  • hmm, debuggen tue ich selten und habe da nicht so die erfahrung.


    da steht folgendes:



    der rest ist das gleiche wie vorher. sollte ich jetzt herausfinden was debugger has settled (1302) bedeutet?? ist das die nützliche info? (sry wegen den ganzen keinlichen fragen) :-/

  • Ok,


    du kannst dir mal einen Breakpoint setzen (einfach in deinem Javacode ganz an den Anfang der Zeile klicken, da erscheint ein Punkt)


    an diesen Breakpoint hält der Debugger in deinem Fall am besten vor dem Try catch konstrukt.


    Dann wechselt er nach dem Start in die Debuggeransicht und du kannst Schrittweise dein Programm weiter ausführen lassen.

  • Hallo killphil75,


    danke für deine hilfreiche beschreibung. musste mir noch ein paar tutorials reinziehen um mit dem debuggen ein wenig umgehen zu können. also ich habe zwei breakpoints gesetzt. einmal wo der try-block beginnt (der breakpoint ist dann in der zeile URL url = new URL("...");) gesetzt und einmal an der checkReq() Methode (1. zeile). beim debuggen kommt der 1. breakpoint, also die zeile URL url = new URL("...");. wenn ich dann auf stepInto klicke um zur nächsten zeile zu springen, kommt diese meldung. wenn ich ein schritt zurück gehe und dann auf resume klicke, komme ich zum nächsten breakpoint. dort bei der zeile httpURLConnection.setReadTimeout(30000); bekomme ich diese Meldung. Hmm... also ganz verstanden habe ich es nicht. Müssen zusätzliche jars angehängt werden oder wie jetzt? :-/

  • Nope


    in deinem ersten Bild kanst du sehen das er eine Exception wirft -> Malformed URL
    das heisst die Url die du mitgibst, ist irgendwie falsch. bzw wirft er da die Exception.


    Java
    URL url = new URL("http://www.google.de"); 
    			checkReq(url);


    Lass Dir hier oben mal im Log die URL nochmal ausgeben.


    Log.d("MeineAusgabe", url.toString());


    Wenn du das schon einen Fehler bekommst, dann übergibst du NULL an dein CheckReq und der Rest sind nur Folgefehler

  • Moin Killphil75,


    also übergeben wird die url richtig.


  • Hmm


    ich habe eben mal deinen Code bei mir getestet (da hätte ich schon mal eher drauf kommen können )
    und alles funktioniert.


    Hast du mal deine Berechtigungen geprüft (im Manifest)


    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>

  • Nein nicht zwingend, nur wenn du deinem Programm erlauben willst das er selber eine Verbindung anfordern darf.
    Dann verstehe ich nicht wo der NUllpointer bei dir her kommt, wie gesagt hier funktioniert es.


    Hab eben auch mal die Url falsch gemacht, Wlan ausgeschalten , dann kommt wie gewünscht dein Dialog , aber nirgendwo ein Absturz.
    Unter welcher Android Version testet du ?

  • ich teste es auf meinem galaxy s2 (android-version 4.1.2). Hmm... das ist echt merkwürdig. Kann es an meinem smartphone liegen?? ich habe nämlich mal ein problem gehabt, dass ich ein anderes projekt auf meinem galaxy getestet habe, welches fehlerhaft war. es lag aber nicht am code. ich habe gegrübelt und gegrübelt, bis ich es auf einem htc mit der version 4.1.1 getestet hatte. un da hat es fehlerfrei gefunzt.


    irgendwie ergibt das für mich keinen sinn, aber ich werde es mal testen.

  • ne, also auf dem htc funzt es auch nicht (würde mich auch wundern). also ich bin mit meinem latain am ende. ich habe alles mögliche von der mainactivity entfernt (eigentlich unnötig aber egal), sodass ich nur noch die onCreate und die anderen zwei mehtoden habe. Berechtigungen sind auch gesetzt. Du hast den code getestet und es geht, d.h. es müsste dann auch bei mir gehen, was es aber nicht tut. :( ?( ich weiß ehrlich nicht weiß ich falsch mache, habe inzwischen auch ein neues projekt erstellt um nur connection zu testen. das gleiche resultat. Killphil75, könntest du freundlicherweise mir mal dein projekt schicken oder hochladen, womit du die connection geprüft hast? das wäre echt korrekt

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!