我正在尝试列出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
答案 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。