android 4.4.3上的NullPointerException但不是4.1.2

时间:2016-04-22 12:57:35

标签: java android nullpointerexception

我有一个问题,我的Android应用程序的一部分在Android版本4.1.2上正常工作,但在android 4.4.3上执行相同的部分时抛出NullPointerException。我的最小sdk设置为15,目标sdk为21.请找到以下代码:

try {
    FileInputStream towe = new FileInputStream(path2);
    re = new BufferedReader(new InputStreamReader(towe));
    while ((res = re.readLine()) != null) {
        result.append(res);
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        re.close();           //ERROR IS GENERATED AT THIS LINE
    } catch (IOException e) {
        e.printStackTrace();
    }
}
早上的人们,离开了一会儿。事实证明,由于文件路径,异常被抛出。我已经对android 4.1.2的路径进行了硬编码,但在4.4.3中,即使设备是相同的,路径也是不同的。我最终使用了

ndroid.os.Environment.getExternalStorageDirectory();

方法。现在两者都很好。感谢您的建议

1 个答案:

答案 0 :(得分:2)

从多个角度来看,这是写这个的正确方法:

 try (FileInputStream towe = new FileInputStream(path2);
      Reader re = new BufferedReader(new InputStreamReader(towe))) {
    while ((res = re.readLine()) != null) {
        result.append(res);
    }
 }
  1. 使用 try-with-resources 。它更简单,更简洁。
  2. 不要抓住异常,继续好像什么都没发生一样。如果您发现自己这样做,那么可能在错误的地方捕获异常。
  3. 在随机位置打印堆栈跟踪是一个坏主意。
  4. 如果您不使用 try-with-resources ,那么您需要在re块中测试finally是否为空,以避免NPE。看起来像错误的堆栈跟踪和异常挤压一样。

     try {
        FileInputStream towe = new FileInputStream(path2);
        re = new BufferedReader(new InputStreamReader(towe));
        while ((res = re.readLine()) != null) {
            result.append(res);
        }
     } finally {
         if (re != null) {
            re.close();
         }
     }
    

    即便如此,理论上存在towe不会被关闭的风险。 (提示:Error子类。)

      

    Android 4.4.3上的NullPointerException但不是4.1.2

    最有可能的意思是new FileInputStream(path2);在一个平台上抛出异常(可能是某种IOException而不是另一个平台。线索很可能出现在I / O异常的消息中。