2012-12-03 55 views
-2

我正在创建新文件的应用程序,当我的名字是这样的文件,没有任何问题:Android的尴尬行为

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

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

+0

帖子堆栈跟踪 –

+0

你的代码有问题,你应该仔细阅读崩溃日志而不是看错地方。如果你正确地引用了log cat,我们就会知道你的'NullPointerException'崩溃发生在哪里,但到目前为止,你必须检查你自己,然后看看那里提到的文件和行。 –

+0

将错误日志更新为前五行。如果这就是你需要的? – user1813774

回答

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,等等。

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

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

+0

谢谢我改变它> =但关于其他代码我喜欢它(我= 0;我<= arrayLength-2;)之前,但我改变它(我 user1813774