Android尴尬的行为

时间:2012-12-03 22:07:47

标签: android behavior

我正在创建一个创建新文件的应用程序,当我命名这样的文件时没有问题:

private String FILENAME = "myFilename";

但是当我使用方法命名文件时,编译器直接跳到这一行:

String lineSep = System.getProperty("line.separator");

然后到我的班级声明:

public class AddUser extends Activity

应用程序崩溃。

这是日志文件所说的内容:

12-03 16:26:12.814: E/AndroidRuntime(20307): FATAL EXCEPTION: main
12-03 16:26:12.814: E/AndroidRuntime(20307): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp.app/com.myapp.app.ProfileSaved}: java.lang.NullPointerException
12-03 16:26:12.814: E/AndroidRuntime(20307):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
12-03 16:26:12.814: E/AndroidRuntime(20307):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
12-03 16:26:12.814: E/AndroidRuntime(20307):    at android.app.ActivityThread.access$600(ActivityThread.java:130)

这是我的文件命名方法:

int firstArray;
int nextArray;  

private String fileNamer(){

    File dataDirectory = Environment.getDataDirectory();
    File fileDir = new File(dataDirectory, "data/com.myapp.app/files");

    String[] filenameArray = fileDir.list();

    Arrays.sort(filenameArray);

    if (filenameArray.length == 0){
        return "0";
    }

    if (filenameArray.length == 2500){
        return "too_many_items";
    }

    if (!filenameArray[0].equals("0")){
        return "0";
    }

    int arrayLength = filenameArray.length;
    int i;

    for(i=0; i<arrayLength-1;){

        firstArray = Integer.parseInt(filenameArray[i]);
        nextArray = Integer.parseInt(filenameArray[i+1]);

        if (firstArray+1 == nextArray){
            i++;
        }
    }
    return Integer.toString(nextArray+1);
}

该方法似乎工作正常,但我无法理解为什么它会影响程序的其余部分,因为它只是返回一个字符串?

2 个答案:

答案 0 :(得分:1)

我怀疑

if (filenameArray.length == 2500){应为if (filenameArray.length >= 2500){。但更重要的是,

    for(i=0; i<arrayLength-1;){
        firstArray = Integer.parseInt(filenameArray[i]);
        nextArray = Integer.parseInt(filenameArray[i+1]);

将访问不存在的filenameArray[arrayLength]。我想你的意思是

    for(i=0; i<arrayLength-2;){

你还应该检查数组中至少有两个元素。这对我来说听起来不对。

答案 1 :(得分:0)

好的家伙感谢您的投入。

我相信我终于做对了。首先,这个方法确实是错误的,但这不是真正的问题,一个好的答案会是这样的:

String和调用返回分配给变量的String的方法之间存在差异,因为为了在另一个类中使用调用的String,可能需要将变量设置为static。这就是为什么String正在运行而'方法调用'String没有。“

关于代码中的错误以防万一有人感兴趣,

中的if
if (firstArray+1 == nextArray) 

需要else以防文件名之间有空格,例如1, 3, 4,因此下一个文件名为2

另一个错误是我将文件名比作Strings所以当我对它们进行排序时,它们被排序为1, 10, 2, 3, 4, 5, 6, 7, 8, 9

我使用的解决方案是将零添加到文件名的开头,如0001, 0002,,依此类推。