-2

新しいファイルを作成するアプリを作成しています。次のようにファイルに名前を付けても問題ありません。

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);
}

このメソッドは正常に機能しているようですが、文字列を返すだけなので、プログラムの残りの部分に影響を与える理由がわかりません。

4

2 に答える 2

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;){

また、配列に少なくとも2つの要素があることを確認する必要があります。それは私には正しく聞こえません。

于 2012-12-03T22:14:22.880 に答える
0

皆さん、ご意見ありがとうございます。

私はついにそれを正しくしたと信じています。まず第一に、この方法は確かにバグがありましたが、それは実際には問題ではありませんでした。良い答えは次のようなものでした。

「aと、変数に割り当てられたStringaを返すメソッドの呼び出しには違いがあります。これは、別のクラスで呼び出されたものを使用するには、おそらく変数をとして設定する必要があるためです。これが、が機能している理由です。メソッドが呼び出されませんでした。」StringStringstaticStringString

誰かが興味を持った場合に備えて、コードのバグifについて

if (firstArray+1 == nextArray) 

次のファイルに。という名前が付けられるelseように、ファイル名の間に空のスペースがある場合に備えて、が必要です。1, 3, 42

もう1つのバグは、ファイル名を比較していStringsたため、ファイル名を並べ替えると、として並べ替えられたこと1, 10, 2, 3, 4, 5, 6, 7, 8, 9です。

私が使用した解決策は、ファイル名の先頭にゼロを追加することでした0001, 0002,

于 2012-12-05T04:44:32.817 に答える