2016-07-28 7 views
0

編集:これは重複としてマークされています。しかし、これは、Null Pointer Exceptionが何であるか、または「プログラミングの基礎」レベルでそれを修正する方法を尋ねていないので、これはやや異なると考えています。私が間違っていたら、私を修正してください。でも、私の質問はAndroidフレームワークを扱うもっと複雑な問題に触れると信じています。私の問題は、私は基本的なYouTubeチュートリアルの後に単純なメディアプレーヤーアプリを作成しようとしていますが、アプリケーションはエミュレータで開くとすぐにすぐに閉じるようにしています。私は手紙にチュートリアルに従っているので、何らかの設定エラーであると推測しています。私は与えられた助言に従って私のコードスニペットを更新しました。エミュレータではアプリの強制は終了しますが、携帯電話でデバイスを実行すると、トーストメッセージ「Null Array」が表示されます。私の質問は、私のデバイスの内部と外部の両方のストレージディレクトリに.mp3ファイルがあるので、プログラムがmySongs ArrayListに項目を追加しない理由です。EDITED:ヌルポインタの例外でAndroidアプリケーションの強制終了 - ArrayListがアイテムの読み込みに失敗する

public class MainActivity extends AppCompatActivity 
{ 
    ListView lv; 
    String[] items; 

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

    lv = (ListView) findViewById(R.id.lvPlaylist); 

    final ArrayList<File> mySongs = findSongs(Environment.getExternalStorageDirectory()); 

    items = new String[mySongs.size()]; 

    if (mySongs != null && !mySongs.isEmpty()) 
    { 
     for (int i = 0; i < mySongs.size(); i++) 
     { 
      //toast(mySongs.get(i).getName().toString()); 
      items[i] = mySongs.get(i).getName().toString().replace("mp3", "").replace(".wav", ""); 
     } 
    } 
    else 
    { 
     //Log.e(getString(R.string.Exception)); 
     Toast.makeText(this, "Null Array", Toast.LENGTH_SHORT).show(); 

    } 

    ArrayAdapter<String> adp = new ArrayAdapter<String>(getApplicationContext(), R.layout.song_layout, R.id.textView,items); 
    lv.setAdapter(adp); 
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      startActivity(new Intent(getApplicationContext(), Player.class).putExtra("pos", position).putExtra("songlist", mySongs)); 
     } 
    }); 

} 

public ArrayList<File> findSongs(File root) 
{ 
    ArrayList<File> al = new ArrayList<File>(); 
    File[] files = root.listFiles(); 

    for (File singleFile : files) 
    { 
     if (singleFile.isDirectory() && !singleFile.isHidden()) 
     { 
      findSongs(singleFile); 
     } 
     else 
     { 
      if (singleFile.getName().endsWith(".mp3") || singleFile.getName().endsWith(".wav")) 
      { 
       al.add(singleFile); 
      } 
     } 
    } 
    return al; 
} 

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context="com.example.user.mediaplayer.MainActivity"> 

<ListView 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/lvPlaylist" 
    android:layout_centerHorizontal="true" 
    android:layout_alignParentTop="true" /> 
</RelativeLayout> 

ログファイル:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.user.mediaplayer/com.example.user.mediaplayer.MainActivity}: java.lang.NullPointerException: Attempt to get length of null array 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
    at android.app.ActivityThread.-wrap11(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5417) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
Caused by: java.lang.NullPointerException: Attempt to get length of null array 
    at com.example.user.mediaplayer.MainActivity.findSongs(MainActivity.java:42) 
    at com.example.user.mediaplayer.MainActivity.onCreate(MainActivity.java:28) 
    at android.app.Activity.performCreate(Activity.java:6237) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  
    at android.app.ActivityThread.-wrap11(ActivityThread.java)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:148)  
    at android.app.ActivityThread.main(ActivityThread.java:5417)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

私も含まれている次のように私のコードは....

MainActivity.javaです:

uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" 
uses-permission android:name="android.permission.STORAGE" 
uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" 
AndroidManifest.xmlファイルの

適切な方向へのアドバイスをいただければ幸いです。ありがとう...

+0

お試しください! @Override保護ボイドのonCreate(バンドルsavedInstanceState) {super.onCreate(savedInstanceState)。 setContentView(R.layout.activity_main); lv =(ListView)findViewById(R.id.lvPlaylist); ArrayList mySongs = findSongs(Environment.getExternalStorageDirectory()); (mySongsは= NULL && mySongs.isEmpty()!)のために{ は(INT i = 0; iはmySongs.size()<; iは++)の場合 {トースト(mySongs.get(I).getName() .toString()); } }他{ Log.e( "アレイNULL") } } –

+0

私はそれをしようとします。あなたはなぜそれが例外を投げているのか知っていますか?それはmySongs配列に何もないからですか? –

+0

と思います。 File []ファイル= root.listFiles(); return NULL –

答えて

0

あなたはArrayList mySongsの長さを取得しようとしています。 findSongs()メソッドから受け取ったArrayListが空であると、Null Pointerという例外が発生する可能性があります。mySongs.length

ArrayList mySongsがnullであるかどうかを確認してから操作を実行してください。

関連する問題