2017-02-12 3 views
-1

Ich versuche, Daten in AWS DynamoDB zu schieben, aber ich halte diesen Fehler auftritt:Fehler - Versuch virtuelle Methode aufzuzurufen ‚‘ auf einer Null-Objekt Referenz

java.lang.NullPointerException: Attempt to invoke virtual method 'com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper com.uploadtodatabasevts.amazonaws.AWSMobileClient.getDynamoDBMapper()' on a null object reference

Jede Idee, was fehlt oder was tat Ich gehe falsch ein? Ich kann es nicht herausfinden.

Unten ist die MainActivity Klasse:

Für die outfitID seine suppose ein Primärschlüssel Autoinkrement sein, aber ich habe keine Ahnung, wie es auf AWS DynamoDB NoSQL zu tun, so bin ich zur Zeit die ID manuell schieben.

package com.uploadtodatabasevts; 
 

 
import android.support.v7.app.AlertDialog; 
 
import android.support.v7.app.AppCompatActivity; 
 
import android.os.Bundle; 
 
import android.util.Log; 
 
import android.view.View; 
 
import android.widget.Button; 
 
import android.widget.EditText; 
 

 
import com.amazonaws.AmazonClientException; 
 
import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper; 
 
import com.uploadtodatabasevts.amazonaws.AWSMobileClient; 
 
import com.uploadtodatabasevts.amazonaws.DynamoDBUtils; 
 
import com.uploadtodatabasevts.amazonaws.OutfitDO; 
 
import com.uploadtodatabasevts.amazonaws.ThreadUtils; 
 

 
public class MainActivity extends AppCompatActivity { 
 

 
    private static final String LOG_TAG = MainActivity.class.getName(); 
 
    String pID, pDetails; 
 
    double oID; 
 

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

 
     EditText outfitID = (EditText)findViewById(R.id.eTxtOutfitID); 
 

 

 
     EditText productID = (EditText)findViewById(R.id.eTxtProductID); 
 
     pID = productID.getText().toString(); 
 

 
     EditText productDetails = (EditText)findViewById(R.id.eTxtProductDetails); 
 
     pDetails = productDetails.getText().toString(); 
 

 
     Button confirm = (Button)findViewById(R.id.btnConfirm); 
 
     confirm.setOnClickListener(new View.OnClickListener() { 
 
      @Override 
 
      public void onClick(View view) { 
 

 
       insertData(); 
 

 
      } 
 
     }); 
 

 
    } 
 

 
    private void insertData() throws AmazonClientException { 
 
     final DynamoDBMapper dynamoDBMapper = AWSMobileClient.defaultMobileClient().getDynamoDBMapper(); 
 
     final OutfitDO outfitDO = new OutfitDO(); 
 

 
     outfitDO.setOutfitId((double) 10); 
 
     outfitDO.setOutfitId(oID); 
 
     outfitDO.setItemOneId(pID); 
 
     outfitDO.setItemOneDetails(pDetails); 
 
     AmazonClientException lastException = null; 
 

 
     try { 
 
      dynamoDBMapper.save(outfitDO); 
 
     } catch (final AmazonClientException ex) { 
 
      Log.e(LOG_TAG, "Failed saving item : " + ex.getMessage(), ex); 
 
      lastException = ex; 
 
     } 
 

 
     if (lastException != null){ 
 
      throw lastException; 
 
     } 
 

 
    } 
 
}

Unten ist die AWSMobileClient:

package com.uploadtodatabasevts.amazonaws; 
 

 
import android.content.Context; 
 
import android.util.Log; 
 

 
import com.amazonaws.ClientConfiguration; 
 
import com.uploadtodatabasevts.amazonaws.IdentityManager; 
 
import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper; 
 
import com.amazonaws.regions.Region; 
 
import com.amazonaws.regions.Regions; 
 
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient; 
 

 
/** 
 
* The AWS Mobile Client bootstraps the application to make calls to AWS 
 
* services. It creates clients which can be used to call services backing the 
 
* features you selected in your project. 
 
*/ 
 
public class AWSMobileClient { 
 

 
    private static final String LOG_TAG = AWSMobileClient.class.getSimpleName(); 
 

 
    private static AWSMobileClient instance; 
 

 
    private final Context context; 
 

 
    private ClientConfiguration clientConfiguration; 
 
    private IdentityManager identityManager; 
 
    private AmazonDynamoDBClient dynamoDBClient; 
 
    private DynamoDBMapper dynamoDBMapper; 
 

 
    /** 
 
    * Build class used to create the AWS mobile client. 
 
    */ 
 
    public static class Builder { 
 

 
     private Context applicationContext; 
 
     private String cognitoIdentityPoolID; 
 
     private Regions cognitoRegion; 
 
     private ClientConfiguration clientConfiguration; 
 
     private IdentityManager identityManager; 
 

 
\t /** 
 
\t * Constructor. 
 
\t * @param context Android context. 
 
\t */ 
 
     public Builder(final Context context) { 
 
      this.applicationContext = context.getApplicationContext(); 
 
     }; 
 

 
\t /** 
 
\t * Provides the Amazon Cognito Identity Pool ID. 
 
\t * @param cognitoIdentityPoolID identity pool ID 
 
\t * @return builder 
 
\t */ 
 
     public Builder withCognitoIdentityPoolID(final String cognitoIdentityPoolID) { 
 
      this.cognitoIdentityPoolID = cognitoIdentityPoolID; 
 
      return this; 
 
     }; 
 
     
 
\t /** 
 
\t * Provides the Amazon Cognito service region. 
 
\t * @param cognitoRegion service region 
 
\t * @return builder 
 
\t */ 
 
     public Builder withCognitoRegion(final Regions cognitoRegion) { 
 
      this.cognitoRegion = cognitoRegion; 
 
      return this; 
 
     } 
 

 
     /** 
 
     * Provides the identity manager. 
 
\t * @param identityManager identity manager 
 
\t * @return builder 
 
\t */ 
 
     public Builder withIdentityManager(final IdentityManager identityManager) { 
 
      this.identityManager = identityManager; 
 
      return this; 
 
     } 
 

 
     /** 
 
     * Provides the client configuration 
 
     * @param clientConfiguration client configuration 
 
     * @return builder 
 
     */ 
 
     public Builder withClientConfiguration(final ClientConfiguration clientConfiguration) { 
 
      this.clientConfiguration = clientConfiguration; 
 
      return this; 
 
     } 
 

 
\t /** 
 
\t * Creates the AWS mobile client instance and initializes it. 
 
\t * @return AWS mobile client 
 
\t */ 
 
     public AWSMobileClient build() { 
 
      return 
 
       new AWSMobileClient(applicationContext, 
 
            cognitoIdentityPoolID, 
 
            cognitoRegion, 
 
            identityManager, 
 
            clientConfiguration); 
 
     } 
 
    } 
 

 
    private AWSMobileClient(final Context context, 
 
          final String cognitoIdentityPoolID, 
 
          final Regions cognitoRegion, 
 
          final IdentityManager identityManager, 
 
          final ClientConfiguration clientConfiguration) { 
 

 
     this.context = context; 
 
     this.identityManager = identityManager; 
 
     this.clientConfiguration = clientConfiguration; 
 

 
     this.dynamoDBClient = new AmazonDynamoDBClient(identityManager.getCredentialsProvider(), clientConfiguration); 
 
     this.dynamoDBClient.setRegion(Region.getRegion(AWSConfiguration.AMAZON_DYNAMODB_REGION)); 
 
     this.dynamoDBMapper = new DynamoDBMapper(dynamoDBClient); 
 
    } 
 

 
    /** 
 
    * Sets the singleton instance of the AWS mobile client. 
 
    * @param client client instance 
 
    */ 
 
    public static void setDefaultMobileClient(AWSMobileClient client) { 
 
     instance = client; 
 
    } 
 

 
    /** 
 
    * Gets the default singleton instance of the AWS mobile client. 
 
    * @return client 
 
    */ 
 
    public static AWSMobileClient defaultMobileClient() { 
 
     return instance; 
 
    } 
 

 
    /** 
 
    * Gets the identity manager. 
 
    * @return identity manager 
 
    */ 
 
    public IdentityManager getIdentityManager() { 
 
     return this.identityManager; 
 
    } 
 

 
    /** 
 
    * Creates and initialize the default AWSMobileClient if it doesn't already 
 
    * exist using configuration constants from {@link AWSConfiguration}. 
 
    * 
 
    * @param context an application context. 
 
    */ 
 
    public static void initializeMobileClientIfNecessary(final Context context) { 
 
     if (AWSMobileClient.defaultMobileClient() == null) { 
 
      Log.d(LOG_TAG, "Initializing AWS Mobile Client..."); 
 
      final ClientConfiguration clientConfiguration = new ClientConfiguration(); 
 
      clientConfiguration.setUserAgent(AWSConfiguration.AWS_MOBILEHUB_USER_AGENT); 
 
      final IdentityManager identityManager = new IdentityManager(context, clientConfiguration); 
 
      final AWSMobileClient awsClient = 
 
       new AWSMobileClient.Builder(context) 
 
        .withCognitoRegion(AWSConfiguration.AMAZON_COGNITO_REGION) 
 
        .withCognitoIdentityPoolID(AWSConfiguration.AMAZON_COGNITO_IDENTITY_POOL_ID) 
 
        .withIdentityManager(identityManager) 
 
        .withClientConfiguration(clientConfiguration) 
 
        .build(); 
 

 
      AWSMobileClient.setDefaultMobileClient(awsClient); 
 
     } 
 
     Log.d(LOG_TAG, "AWS Mobile Client is OK"); 
 
    } 
 

 
    /** 
 
    * Gets the DynamoDB Client, which allows accessing Amazon DynamoDB tables. 
 
    * @return the DynamoDB client instance. 
 
    */ 
 
    public AmazonDynamoDBClient getDynamoDBClient() { 
 
     return dynamoDBClient; 
 
    } 
 

 
    /** 
 
    * Gets the Dynamo DB Object Mapper, which allows accessing DynamoDB tables using annotated 
 
    * data object classes to represent your data using POJOs (Plain Old Java Objects). 
 
    * @return the DynamoDB Object Mapper instance. 
 
    */ 
 
    public DynamoDBMapper getDynamoDBMapper() { 
 
     return dynamoDBMapper; 
 
    } 
 

 
}

+0

Mögliches Duplikat [Was für eine Nullpointer ist, und wie kann ich es beheben?] (Http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix -it) –

+0

Geben Sie den Code der Klasse 'AWSMobileClient' ein. –

+0

Es scheint ziemlich klar, dass AWSMobileClient.defaultMobileClient() eine Null zurückgibt. Da Sie diesen Code jedoch nicht veröffentlicht haben, ist es unmöglich zu sagen, warum. Wenn es beim Lesen des Codes nicht offensichtlich ist, sollte Ihr erster Schritt den Debugger verwenden, um herauszufinden, warum. – GreyBeardedGeek

Antwort

1

Ihre Anwendungsklasse sollte Code, der durch den Aufruf AWSMobileClient.initializeMobileClientIfNecessary(context) sonst AWSMobileClient.defaultMobileClient den mobilen Client initialisiert () wird r um null zu gehen. Wenn Sie keine benutzerdefinierte Anwendungsklasse haben, können Sie AWSMobileClient.initializeMobileClientIfNecessary(context) in der Lebenszyklusmethode onCreate() Ihrer Aktivität aufrufen.

Verwandte Themen