2013-01-12 41 views
1

連接到Webservice時,我的Android客戶端中出現NullPointerException。我真的不知道爲什麼...連接到webservice時AndroidClient中的NullPointerException

的logcat:

01-12 18:46:55.062: E/AndroidRuntime(831): FATAL EXCEPTION: main 
01-12 18:46:55.062: E/AndroidRuntime(831): java.lang.RuntimeException: Unable to start activity ComponentInfo{pl.webcentral.androidclient1/pl.webcentral.androidclient1.MainActivity}: java.lang.NullPointerException 
01-12 18:46:55.062: E/AndroidRuntime(831): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) 
01-12 18:46:55.062: E/AndroidRuntime(831): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
01-12 18:46:55.062: E/AndroidRuntime(831): at android.app.ActivityThread.access$600(ActivityThread.java:130) 
01-12 18:46:55.062: E/AndroidRuntime(831): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
01-12 18:46:55.062: E/AndroidRuntime(831): at android.os.Handler.dispatchMessage(Handler.java:99) 
01-12 18:46:55.062: E/AndroidRuntime(831): at android.os.Looper.loop(Looper.java:137) 
01-12 18:46:55.062: E/AndroidRuntime(831): at android.app.ActivityThread.main(ActivityThread.java:4745) 
01-12 18:46:55.062: E/AndroidRuntime(831): at java.lang.reflect.Method.invokeNative(Native Method) 
01-12 18:46:55.062: E/AndroidRuntime(831): at java.lang.reflect.Method.invoke(Method.java:511) 
01-12 18:46:55.062: E/AndroidRuntime(831): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
01-12 18:46:55.062: E/AndroidRuntime(831): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
01-12 18:46:55.062: E/AndroidRuntime(831): at dalvik.system.NativeStart.main(Native Method) 
01-12 18:46:55.062: E/AndroidRuntime(831): Caused by: java.lang.NullPointerException 
01-12 18:46:55.062: E/AndroidRuntime(831): at pl.webcentral.androidclient1.GameAndroidUtil.callGameStatus(GameAndroidUtil.java:106) 
01-12 18:46:55.062: E/AndroidRuntime(831): at pl.webcentral.androidclient1.GameAndroidUtil.testGameWS(GameAndroidUtil.java:21) 
01-12 18:46:55.062: E/AndroidRuntime(831): at pl.webcentral.androidclient1.MainActivity.onCreate(MainActivity.java:24) 
01-12 18:46:55.062: E/AndroidRuntime(831): at android.app.Activity.performCreate(Activity.java:5008) 
01-12 18:46:55.062: E/AndroidRuntime(831): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
01-12 18:46:55.062: E/AndroidRuntime(831): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 
01-12 18:46:55.062: E/AndroidRuntime(831): ... 11 more 

GameAndroidUtil:

package pl.webcentral.androidclient1; 

import org.ksoap2.SoapEnvelope; 
import org.ksoap2.SoapFault; 
import org.ksoap2.serialization.PropertyInfo; 
import org.ksoap2.serialization.SoapObject; 
import org.ksoap2.serialization.SoapPrimitive; 
import org.ksoap2.serialization.SoapSerializationEnvelope; 
import org.ksoap2.transport.HttpTransportSE; 

public class GameAndroidUtil { 
    private static final String NAMESPACE = "http://game.webcentral.pl/"; 
    private static final String SOAP_ACTION = ""; 
    private static final String WSDL_URL = "http://10.0.2.2:8080/ReversiGameWS/services/GameWS?wsdl"; 

    public static void testGameWS() throws SoapFault { 

     String session1 = callGameLogin("Marcin 1"); 


     GameStatus gameStatus = callGameStatus(session1); 
     System.out.println("Status gracza 1 " + gameStatus.getLastMove() + " " + gameStatus.isYourMove()); 


     String session2 = callGameLogin("Marcin 2"); 


     gameStatus = callGameStatus(session2); 
     System.out.println("Status gracza 2 " + gameStatus.getLastMove() + " " + gameStatus.isYourMove()); 

     gameStatus = callGameStatus(session1); 
     System.out.println("Status gracza 1 " + gameStatus.getLastMove() + " " + gameStatus.isYourMove()); 


     try { 
      callGameAddMove(session1, 5); 
     } catch (Exception e) { 
      System.out.println("Złapaliśmy wyjątek zgodnie z założeniem"); 
     } 


     callGameAddMove(session2, 5); 


     gameStatus = callGameStatus(session2); 
     System.out.println("Status gracza 1 " + gameStatus.getLastMove() + " " + gameStatus.isYourMove()); 

     gameStatus = callGameStatus(session1); 
     System.out.println("Status gracza 2 " + gameStatus.getLastMove() + " " + gameStatus.isYourMove()); 
    } 

    private static String callGameLogin(String userName) { 
     String METHOD_NAME = "login"; 

     SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 

     PropertyInfo propInfo=new PropertyInfo(); 
     propInfo.setName("arg0"); 
     propInfo.setType(PropertyInfo.STRING_CLASS); 
     propInfo.setValue(userName); 

     request.addProperty(propInfo); 

     envelope.setOutputSoapObject(request); 
     HttpTransportSE androidHttpTransport = new HttpTransportSE(WSDL_URL); 

     try { 
      androidHttpTransport.call(SOAP_ACTION, envelope); 

      SoapPrimitive resultsRequestSOAP = (SoapPrimitive) envelope.getResponse(); 

      return resultsRequestSOAP.toString(); 

     } catch (Exception e) { 
      throw new RuntimeException("Unexpected exception", e); 
     } 
    } 
    private static GameStatus callGameStatus(String sessionId) throws SoapFault { 
     String METHOD_NAME = "getGameStatus"; 

     SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 

     PropertyInfo propInfo=new PropertyInfo(); 
     propInfo.setName("arg0"); 
     propInfo.setType(PropertyInfo.STRING_CLASS); 
     propInfo.setValue(sessionId); 

     request.addProperty(propInfo); 

     envelope.setOutputSoapObject(request); 
     HttpTransportSE androidHttpTransport = new HttpTransportSE(WSDL_URL); 

     try { 
      androidHttpTransport.call(SOAP_ACTION, envelope); 
     } catch (Exception e) { 
      throw new RuntimeException("Unexpected exception", e); 
     } 

     try { 
      SoapObject response = (SoapObject)envelope.getResponse(); 

      GameStatus gameStatus = new GameStatus(); 
      if (response.hasProperty("lastMove")) { 
       gameStatus.setLastMove(Integer.parseInt(response.getProperty("lastMove").toString())); 
      } 
      gameStatus.setYourMove(Boolean.parseBoolean(response.getProperty("yourMove").toString())); 

      return gameStatus; 
     } catch (SoapFault e) { 
      System.out.println("Error adding move: " + e.faultstring);//można to ładnie jakoś pokazać na ekranie 
      throw e; 
     } 

    } 
    private static void callGameAddMove(String sessionId, Integer move) throws SoapFault { 
     String METHOD_NAME = "addMove"; 

     SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 

     PropertyInfo propInfo=new PropertyInfo(); 
     propInfo.setName("arg0"); 
     propInfo.setType(PropertyInfo.STRING_CLASS); 
     propInfo.setValue(sessionId); 

     request.addProperty(propInfo); 

     propInfo=new PropertyInfo(); 
     propInfo.setName("arg1"); 
     propInfo.setType(PropertyInfo.INTEGER_CLASS); 
     propInfo.setValue(move); 

     request.addProperty(propInfo); 

     envelope.setOutputSoapObject(request); 
     HttpTransportSE androidHttpTransport = new HttpTransportSE(WSDL_URL); 

     try { 
      androidHttpTransport.call(SOAP_ACTION, envelope); 
     } catch (Exception e) { 
      throw new RuntimeException("Unexpected exception", e); 
     } 

     try { 
      SoapPrimitive resultsRequestSOAP = (SoapPrimitive) envelope.getResponse(); 
     } catch (SoapFault e) { 
      System.out.println("Error adding move: " + e.faultstring);//można to ładnie jakoś pokazać na ekranie 
      throw e; 
     } 
    } 

} 

,問題就在這裏:

  gameStatus.setLastMove(Integer.parseInt(response.getProperty("lastMove").toString()); 

爲什麼會這樣呢?只有當響應具有此屬性時纔會執行此行。如果有,爲什麼是空指針?

+1

在調用''gameStatus.setLastMove''之前,您可以添加''Log.d(「lastMove」,response.getProperty(「lastMove」)+「」)''''。你知道,只是爲了確定。 – harism

+0

有沒有可能'request'具有鍵'「lastMove」'但數據是'null'? – Sam

+0

這個Log.d()應該改變什麼?添加它但沒有結果。 – user208030

回答

0

看來,登錄.d(「lastMove」,response.getProperty(「lastMove」)。toString());現在引起NullPointerException ...

很明顯,response.getProperty("lastMove")是問題所在。這意味着,response有一個鍵"lastMove"但價值本身null ...只需使用:

if (response.hasProperty("lastMove") && response.getProperty("lastMove") != null) { 
    gameStatus.setLastMove(Integer.parseInt(response.getProperty("lastMove").toString())); 
} 

(如果你控制SOAPObject是如何創建的,你應該找出你爲什麼保存在一個空值)

0
  gameStatus.setLastMove(Integer.parseInt(response.getProperty("lastMove").toString())); 

下面的線爲空,這就是爲什麼空指針異常,請添加日誌n檢查出來
response.getProperty( 「lastMove」)。的toString()

+0

爲什麼所有這些使用Log進行調試的討論?包括NPE在內,找到大多數問題是一種糟糕的方式。只需簡單地通過調試器來檢查變量。這就是我們應該教新人。 – Simon

+0

我們每個人都有不同的想法來調試解決方案。我首選日誌會幫助他。 –

+0

我加入,但我沒有看到它在我的logcat ... – user208030