不幸的是,申请已经停止

时间:2014-10-14 06:39:12

标签: java android nullpointerexception

我正在尝试列出sdcard中的文件,并根据上次修改日期对它们进行排序。

我构建它时没有出现任何错误,但是当我在模拟器中启动时,logcat显示错误,模拟器显示“很遗憾,应用程序已停止”。 请帮助我理解错误信息以及如何解决这个问题。

以下是我使用的代码:

main activity.java     公共类MainActivity扩展Activity     {

@SuppressWarnings("rawtypes")
public final class ComparatorImplementation implements Comparator
{
    public int compare(Object f1, Object f2)
    {
      if (((File) f1).lastModified() < ((File) f2).lastModified())
      {
        return -1;
      }
      else if (((File) f1).lastModified() > ((File) f2).lastModified())
      {
        return 1;
      }
      else
      {
        return 0;
      }
    }
}

@SuppressWarnings("unchecked")
@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    TextView info = (TextView)findViewById(R.id.info);


    File dir = new File("/storage/sdcard/");

    if(dir.isDirectory())
    {
      // Fetching the list from the directory
      File[] files = dir.listFiles();

      // Sort files by date.
     Arrays.sort(files, new ComparatorImplementation());

      //Prints files in order by last modified date
      for(File file:files)
      {
          info.setText( "list of files according to last modified date \n " + file.getName());
      }
    }       
    }
}

这是logcat输出

10-14 01:58:10.470: E/AndroidRuntime(3399): FATAL EXCEPTION: main
10-14 01:58:10.470: E/AndroidRuntime(3399): Process: com.listfiles, PID: 3399
10-14 01:58:10.470: E/AndroidRuntime(3399): java.lang.RuntimeException: Unable to start activity          ComponentInfo{com.listfiles/com.listfiles.MainActivity}: java.lang.NullPointerException
10-14 01:58:10.470: E/AndroidRuntime(3399):     at    android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
10-14 01:58:10.470: E/AndroidRuntime(3399):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
10-14 01:58:10.470: E/AndroidRuntime(3399):     at android.app.ActivityThread.access$800(ActivityThread.java:135)
10-14 01:58:10.470: E/AndroidRuntime(3399):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
10-14 01:58:10.470: E/AndroidRuntime(3399):     at android.os.Handler.dispatchMessage(Handler.java:102)
10-14 01:58:10.470: E/AndroidRuntime(3399):     at android.os.Looper.loop(Looper.java:136)
10-14 01:58:10.470: E/AndroidRuntime(3399):     at android.app.ActivityThread.main(ActivityThread.java:5017)
10-14 01:58:10.470: E/AndroidRuntime(3399):     at java.lang.reflect.Method.invokeNative(Native Method)
10-14 01:58:10.470: E/AndroidRuntime(3399):     at  java.lang.reflect.Method.invoke(Method.java:515)
10-14 01:58:10.470: E/AndroidRuntime(3399):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
10-14 01:58:10.470: E/AndroidRuntime(3399):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
10-14 01:58:10.470: E/AndroidRuntime(3399):     at dalvik.system.NativeStart.main(Native Method)
10-14 01:58:10.470: E/AndroidRuntime(3399): Caused by: java.lang.NullPointerException
10-14 01:58:10.470: E/AndroidRuntime(3399):     at java.util.TimSort.sort(TimSort.java:169)
10-14 01:58:10.470: E/AndroidRuntime(3399):     at java.util.Arrays.sort(Arrays.java:2023)
10-14 01:58:10.470: E/AndroidRuntime(3399):     at com.listfiles.MainActivity.onCreate(MainActivity.java:55)
10-14 01:58:10.470: E/AndroidRuntime(3399):     at android.app.Activity.performCreate(Activity.java:5231)
10-14 01:58:10.470: E/AndroidRuntime(3399):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
10-14 01:58:10.470: E/AndroidRuntime(3399):     at                       android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
10-14 01:58:10.470: E/AndroidRuntime(3399):     ... 11 more

5 个答案:

答案 0 :(得分:1)

您将获得NullPointerException。这意味着对象未正确初始化。

您可以看到有一行at java.util.Arrays.sort(Arrays.java:2023),所以我猜问题出现在Arrays.sort()函数中。

我认为以下代码存在一些问题

File[] files = dir.listFiles();

// Sort files by date.
Arrays.sort(files, new ComparatorImplementation());
如果目录无效,

listFiles()可以返回null

请尝试使用以下代码来防止异常:

File[] files = dir.listFiles();

// Sort files by date.
if(files!=null){
    Arrays.sort(files, new ComparatorImplementation());

    //your rest of the code based on "files" object. If object is `null`, you can
    //not proceed
}

您还应该使用Environment.getExternalStorageDirectory()方法而不是手动指定方法,因为某些设备具有与SD卡不同的路径。

答案 1 :(得分:0)

在您的代码中,

File[] files = dir.listFiles();

files变量设置为null,因此崩溃。排序前检查文件是否为空。

答案 2 :(得分:0)

可能那里没有文件。 你应该检查是否有任何一个像:

if (Dir.exists()) {
    // type your code here!
}

答案 3 :(得分:0)

你没有处理文件

File[] files = dir.listFiles();
Arrays.sort(files, new ComparatorImplementation());

案例: - 假设dir路径确实存在, case: - 假设dir不包含文件        那么,files对象是null,它显然会引发空指针异常,以及这里到底发生了什么

溶液:    处理文件空指针条件:

if(files==null){
Toast.makeText(getApplicationContext(),"directory doesnt contain files",0).show();}
else{
for(File file:files)
  {
      info.setText( "list of files according to last modified date \n " + file.getName());
  }}

答案 4 :(得分:0)

您使用的是listFiles(),如果此文件不是目录,则可以为null。

我可以在这里看到:

File dir = new File("/storage/sdcard/");

然后,

dir.listFiles();
  

public File [] listFiles()
  在API级别1中添加

     

返回一个数组   此文件表示的目录中包含的文件。结果   如果此文件不是目录,则为null。文件的路径   如果此文件的路径是绝对的,则数组是绝对的,它们是   相对而言。

     

返回文件数组或null。