2017-04-03 1 views
-3

J'essaie d'appeler la méthode suivante qui est supposée analyser un fichier JSON à partir d'une autre activité. Comment se fait-il que Android Studio me montre une erreur?Appel de JSON à partir d'une autre activité JAVA

C'est la première activité appelée FirstActivity.java

public class FirstActivity extends AppCompatActivity { 

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

     ReadJSON classToReadJSON = new ReadJSON(); 
     classToReadJSON.loadJSONFromAsset(); 
    }} 

Ceci est ma deuxième classe ReadJSON.java:

public class ReadJSON extends AppCompatActivity{ 
    public String loadJSONFromAsset() { 
      String json = null; 
      try { 
       InputStream is = getAssets().open("jsonfile.json"); 
       int size = is.available(); 
       byte[] buffer = new byte[size]; 
       is.read(buffer); 
       is.close(); 
       json = new String(buffer, "UTF-8"); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
       return null; 
      } 
      return json; 
     } 
} 

Le code pour analyser le fichier JSON dérive de la réponse de Faizan. Edit: Désolé de ne pas avoir publié le journal des erreurs, je suis encore assez nouveau pour la programmation.

Donc, c'est le journal des erreurs:

D/AndroidRuntime: Shutting down VM 


        --------- beginning of crash 
E/AndroidRuntime: FATAL EXCEPTION: main 
        Process: com.example.zeus.jsonstackoverflow, PID: 2805 
        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.zeus.jsonstackoverflow/com.example.zeus.jsonstackoverflow.FirstActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
         at android.app.ActivityThread.-wrap12(ActivityThread.java) 
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
         at android.os.Handler.dispatchMessage(Handler.java:102) 
         at android.os.Looper.loop(Looper.java:154) 
         at android.app.ActivityThread.main(ActivityThread.java:6077) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 
        Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference 
         at android.content.ContextWrapper.getResources(ContextWrapper.java:86) 
         at android.view.ContextThemeWrapper.getResourcesInternal(ContextThemeWrapper.java:127) 
         at android.view.ContextThemeWrapper.getAssets(ContextThemeWrapper.java:116) 
         at com.example.zeus.jsonstackoverflow.ReadJSON.loadJSONFromAsset(ReadJSON.java:16) 
         at com.example.zeus.jsonstackoverflow.FirstActivity.onCreate(FirstActivity.java:14) 
         at android.app.Activity.performCreate(Activity.java:6662) 
         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)  
         at android.app.ActivityThread.-wrap12(ActivityThread.java)  
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)  
         at android.os.Handler.dispatchMessage(Handler.java:102)  
         at android.os.Looper.loop(Looper.java:154)  
         at android.app.ActivityThread.main(ActivityThread.java:6077)  
         at java.lang.reflect.Method.invoke(Native Method)  
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)  
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)  

Je vous serais très reconnaissant de toute aide à ce sujet.

+1

Publiez le journal des erreurs. –

+1

Veuillez ajouter l'erreur Android Studio! – Mercury

+0

la seconde devrait être une classe java simple pas une activité –

Répondre

1

Vous devez passer à la méthode contexte si vous n'utilisez pas essayer Activité ceci:

public class FirstActivity extends AppCompatActivity { 

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

     ReadJSON classToReadJSON = new ReadJSON(); 
     classToReadJSON.loadJSONFromAsset(this); 
    } 
} 

ReadJSON.class

public class ReadJSON { 
public String loadJSONFromAsset(Context c) { 
     String json = null; 
     try { 
      InputStream is = c.getAssets().open("jsonfile.json"); 
      int size = is.available(); 
      byte[] buffer = new byte[size]; 
      is.read(buffer); 
      is.close(); 
      json = new String(buffer, "UTF-8"); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
      return null; 
     } 
     return json; 
    } 
} 
1

pas mal de problèmes/idées fausses dans votre code. D'abord, votre ReadJSON n'a pas besoin d'étendre AppCompatActivity car ce n'est pas une activité. C'est une façon de le faire:

public class FirstActivity extends AppCompatActivity { 

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

     String myJsonString = loadJSONFromAsset(); 
    } 

    public String loadJSONFromAsset() { 
     String json = null; 
     try { 
      InputStream is = getAssets().open("jsonfile.json"); 
      int size = is.available(); 
      byte[] buffer = new byte[size]; 
      is.read(buffer); 
      is.close(); 
      json = new String(buffer, "UTF-8"); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
      return null; 
     } 
     return json; 
    } 

} 

Deuxièmement, avec le retour de json, vous devez faire quelque chose. Je l'ai mis dans la variable myJsonString et probablement vous devrez le transformer en JSONObject et l'analyser. Le blocage apparaît parce que vous essayez .getAssets (...) à partir d'un contexte nul. En mettant loadJSONFromAsset dans votre activité, vous aurez un contexte.

0

Nous vous remercions de votre aide jusqu'à maintenant tout le monde!

Je pourrais trouver qu'il s'agit de la ligne suivante.

 InputStream is = getAssets().open("jsonfile.json"); 

Pourquoi est-il pas possible d'appeler cette ligne de ma première activité?