2017-08-20 3 views
-4

J'ai essayé différentes solutions, mais comme j'ai échoué, j'ai besoin de savoir ce qui ne va pas avec mon code et ce qu'il devrait être.Comment faire pour résoudre "java.lang.NumberFormatException: s == null à java.lang.Integer.parseInt"

Voici mon erreur logcat

E/AndroidRuntime: FATAL EXCEPTION: main 
                     Process: freemig.freemigmessenger, PID: 31699 
                     java.lang.NumberFormatException: s == null 
                      at java.lang.Integer.parseInt(Integer.java:570) 
                      at java.lang.Integer.parseInt(Integer.java:643) 

Et il arrive sur un bouton événement click qui est

private class SentMessageHolder extends RecyclerView.ViewHolder { 
    TextView messageText, timeText; 
    ImageButton iB; 
    MsgDltAPIService msgDltAPIService; 
    String rec_id; 
    String content_id; 
    int[] ids = new int[100]; 

    SentMessageHolder(final View itemView) { 
     super(itemView); 

     messageText = itemView.findViewById(R.id.text_message_body); 
     timeText = itemView.findViewById(R.id.text_message_time); 
     iB = itemView.findViewById(R.id.sentMessageTextDelete); 
     msgDltAPIService = RestClient.getClient().create(MsgDltAPIService.class); 

     iB.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       userAuthenticationKey = new UserAuthenticationKey(mContext.getApplicationContext()); 
       sharedPreferences = mContext.getApplicationContext().getSharedPreferences("user authentication", MODE_PRIVATE); 
       editor = sharedPreferences.edit(); 
       ids[0] = Integer.parseInt(content_id); 
       final MsgDltRequest msgDltRequest = new MsgDltRequest(
         ids, 
         rec_id); 
       Call<MsgDltResponse> call = 
         msgDltAPIService.msgDlt(userAuthenticationKey.getUserTokenKey(), 
           msgDltRequest); 
       call.enqueue(new Callback<MsgDltResponse>() { 
        @Override 
        public void onResponse(Call<MsgDltResponse> call, Response<MsgDltResponse> response) { 

         Toast.makeText(mContext.getApplicationContext(), "" + response.body().getData(), 
           Toast.LENGTH_LONG).show(); 
        } 

        @Override 
        public void onFailure(Call<MsgDltResponse> call, Throwable t) { 
         Toast.makeText(mContext.getApplicationContext(), "please try again", 
           Toast.LENGTH_LONG).show(); 
        } 
       }); 
      } 
     }); 
    } 

    void bind(Datum2 message) { 
     messageText.setText(message.getMsg()); 

     // Format the stored timestamp into a readable String using method. 
     timeText.setText(message.getCreatedAt().getFormatTime()); 
     content_id.valueOf(message.getContentId().toString()) ; 
     if (! message.getOriginatorId().equals(userID)){ 
      rec_id.valueOf(message.getOriginatorId()); 
     } 
     else { 
      rec_id = null; 
     } 
         } 

} 

Il me donne l'erreur sur cette ligne

ids[0] = Integer.parseInt(content_id); 

J'ai essayé plusieurs les choses comme je l'ai dit précédemment, mais quel devrait être mon code? My full class is here. Encore une chose que je travaille sur une classe d'adaptateur.

+0

double possible de [Qu'est-ce qu'un NumberFormatException et comment puis-je résoudre ce problème?] (Https://stackoverflow.com/questions/39849984/what-is-a-numberformatexception-and-how-can-i -fix-it) – xenteros

+0

Vous pouvez vérifier quelle valeur est contenue dans "content_id". Après cela, vous décidez comment vous formater. – Aunog

Répondre

2

Vous pouvez utiliser TextUtils méthode utilitaire comme celui-ci,

if (!TextUtils.isEmpty(content_id) && TextUtils.isDigitsOnly(content_id)) { 
    ids[0] = Integer.parseInt(content_id); 
} else { 
    ids[0] = 0; 
} 

et lors de la configuration content_id vous pouvez définir comme celui-ci, content_id = message.getContentId().toString(); au lieu de content_id.valueOf(message.getContentId().toString()) ;

+0

Merci beaucoup! Cela fonctionne parfaitement. J'ai un autre problème avec mon adaptateur puis-je partager avec ici? – user7310707

+1

@ user7310707: posez une nouvelle question pour cela, plutôt que de mettre trop de travail sur un assistant ':-)' – halfer

1

Placez l'instruction dans try et catch bloc pour gérer l'exception .

try{ 
ids[0] = Integer.parseInt(content_id); 
}catch(NumberFormatException ex){ // handle your exception 
    ... 
} 

ou simplement matching- entier

String input=...; 
String pattern ="-?\\d+"; 
if(input.matches("-?\\d+")){ // any positive or negative integer or not! 
... 
} 
1

Log dit que c'est un NumberFormatException et la chaîne que vous essayez de convertir en int est nulle. Integer.parseInt (content_id) ne fonctionne que si content_id n'est pas null et que c'est un entier valide. Par conséquent, dans votre situation, vous pouvez ajouter une vérification pour voir si la chaîne est NULL. Si la chaîne n'est pas NULL et donne toujours une exception NumberFormatException, la chaîne n'est pas un entier valide et peut être gérée avec une instruction try catch.

if (content_id != null) { 
    try { 
     ids[0] = Integer.parseInt(content_id); 
    } catch(NumberFormatException e) { 
     // Deal with the situation like 
     ids[0] = 0; 
    } 
}