2016-03-25 9 views
-2

Aus irgendeinem Grund bekomme ich eine Nullzeiger-Ausnahme, die auf videosGefunden zeigt, wenn es tatsächlich nicht Null ist. Selbst der Parameter Adapter, der übergeben wird, ist nicht null. Ich überprüfe und verifiziere das einfach, indem ich ausdrücke, ob es null ist oder nicht (beide sind NICHT null). Kann mir bitte jemand sagen, wie ich diesen Fehler bekomme?Mein Objekt ist nicht null, aber ich bekomme eine NULL POINTER EXCEPTION

private ListView videosFound; 

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_search); 

     searchInput = (EditText)findViewById(R.id.search_input); 
     videosFound = (ListView)findViewById(R.id.videos_found); 

     handler = new Handler(); 

     addClickListener(); 

     searchInput.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
      @Override 
      public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 

       if (actionId == EditorInfo.IME_ACTION_DONE) { 
        searchOnYoutube(v.getText().toString()); 
        return false; 
       } 
       return true; 
      } 
     }); 
    } 

    private void updateVideosFound(){ 
     ArrayAdapter<VideoItem> adapter = new ArrayAdapter<VideoItem>(getApplicationContext(), R.layout.video_item, searchResults){ 
      @Override 
      public View getView(int position, View convertView, ViewGroup parent) { 
       if(convertView == null){ 
        convertView = getLayoutInflater().inflate(R.layout.video_item, parent, false); 
       } 
       ImageView thumbnail = (ImageView)convertView.findViewById(R.id.video_thumbnail); 
       TextView title = (TextView)convertView.findViewById(R.id.video_title); 
       TextView description = (TextView)convertView.findViewById(R.id.video_description); 

       VideoItem searchResult = searchResults.get(position); 

       Picasso.with(getApplicationContext()).load(searchResult.getThumbnailURL()).into(thumbnail); 
       title.setText(searchResult.getTitle()); 
       description.setText(searchResult.getDescription()); 
       return convertView; 
      } 
     }; 
     if(videosFound == null){ 
      System.out.println("videoFound is null***********"); 
     }else{ 
      System.out.println("videoFound is NOT null***********"); 
     } 

     if(adapter == null){ 
      System.out.println("adapter is null***********"); 
     }else{ 
      System.out.println("adapter is NOT null***********"); 
     } 
     videosFound.setAdapter(adapter);//ERROR HERE. neither videosFound no adapter are null 
    } 

private void addClickListener(){ 
     videosFound.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> av, View v, int pos, 
            long id) { 
       Intent intent = new Intent(getApplicationContext(), PlayerActivity.class); 
       intent.putExtra("VIDEO_ID", searchResults.get(pos).getId()); 
       startActivity(intent); 
      } 
     }); 
    } 

XML

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <EditText 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:hint="@string/search" 
     android:id="@+id/search_input" 
     android:singleLine="true" /> 

    <ListView 
     android:id="@+id/videos_found" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:dividerHeight="5dp" /> 

</LinearLayout> 

Console:

03-24 18:04:31.833 17014-17440/com.example.shawn.myyoutube D/YC: Could not search: com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden 
                   { 
                    "code" : 403, 
                    "errors" : [ { 
                    "domain" : "usageLimits", 
                    "message" : "There is a per-IP or per-Referer restriction configured on your API key and the request does not match these restrictions. Please use the Google Developers Console to update your API key configuration if request from this IP or referer should be allowed.", 
                    "reason" : "ipRefererBlocked", 
                    "extendedHelp" : "https://console.developers.google.com" 
                    } ], 
                    "message" : "There is a per-IP or per-Referer restriction configured on your API key and the request does not match these restrictions. Please use the Google Developers Console to update your API key configuration if request from this IP or referer should be allowed." 
                   } 
03-24 18:04:31.833 17014-17014/com.example.shawn.myyoutube I/System.out: videoFound is NOT null*********** 
03-24 18:04:31.833 17014-17014/com.example.shawn.myyoutube I/System.out: adapter is NOT null*********** 
03-24 18:04:31.843 17014-17014/com.example.shawn.myyoutube D/AndroidRuntime: Shutting down VM 
03-24 18:04:31.843 17014-17014/com.example.shawn.myyoutube E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: com.example.shawn.myyoutube, PID: 17014 
                      java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference 
                       at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:330) 
                       at android.widget.ListView.setAdapter(ListView.java:502) 
                       at com.example.shawn.myyoutube.SearchActivity.updateVideosFound(SearchActivity.java:98) 
                       at com.example.shawn.myyoutube.SearchActivity.access$200(SearchActivity.java:23) 
                       at com.example.shawn.myyoutube.SearchActivity$2$1.run(SearchActivity.java:61) 
                       at android.os.Handler.handleCallback(Handler.java:739) 
                       at android.os.Handler.dispatchMessage(Handler.java:95) 
                       at android.os.Looper.loop(Looper.java:145) 
                       at android.app.ActivityThread.main(ActivityThread.java:5951) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at java.lang.reflect.Method.invoke(Method.java:372) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194) 
+5

Können Sie den Stacktrace buchen? – TheMirrox

+0

@TheMirrox hinzugefügt. Ich sollte das auch erwähnen: wenn ich es debugge, sind die Werte null, aber wenn ich eine IF-Anweisung zum Vergleich verwende, ist es NICHT null ... –

+5

Ich denke, es ist 'searchResults', das ist 'null'. –

Antwort

4

Im stacktrace Ich sehe dies:

java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference 

Der Adapter versucht size() auf null zu nennen List . Stellen Sie sicher, dass Ihre Liste searchResults nicht null ist.

1

NullPointerException ist aufgetreten, weil searchResults nicht initialisiert ist und null ist. In Bezug auf Ihre Frage im Kommentar -

wissen Sie, warum eigentlich ist der Fehler nicht auf die Linie zeigen, wo search war?

ArrayAdapter ruft getCount() intern, wann immer Sie setAdapter() oder aktualisieren Sie die bereits erstellten Adapter notifyDataSetChanged() nennen. Bis Sie setAdapter() oder notifyDataSetChanged() anrufen, ArrayAdapter erstellt keine Ansicht für Sie und um das zu erstellen, muss es die Größe der Daten überprüfen, die Sie an es übergeben haben. Dafür es getCount()
nennt die

public int getCount() { 
     return mObjects.size(); 
    } 

ist, wo mObjects auf der Datenliste initialisiert, die Sie übergeben, während die Adapter zu schaffen.

Offenbar mObjects.size() wird werfen NullPointerException seit mObjects ist null weil searchResults null ist.

Ich hoffe, Sie verstanden.

+0

Ja, das macht eigentlich Sinn, danke! –

Verwandte Themen