android–BufferedInputStream或FileInputStream IOException

android–BufferedInputStream或FileInputStream IOException,第1张

概述我刚刚发布了一个Android应用程序,它解析本地文件并对数据进行一些处理.几天前,我的一位客户报告了一个错误,每次他试图处理他的文件时应用程序崩溃.这是他发给我的错误日志:java.lang.RuntimeException:AnerroroccuredwhileexecutingdoInBackground()atandroid.os.

我刚刚发布了一个Android应用程序,它解析本地文件并对数据进行一些处理.
几天前,我的一位客户报告了一个错误,每次他试图处理他的文件时应用程序崩溃.

这是他发给我的错误日志:

java.lang.RuntimeException: An error occured while executing doInBackground()    at androID.os.AsyncTask.done(AsyncTask.java:300)    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)    at java.util.concurrent.FutureTask.setException(FutureTask.java:222)    at java.util.concurrent.FutureTask.run(FutureTask.java:242)    at androID.os.AsyncTask$SerialExecutor.run(AsyncTask.java:231)    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)    at java.lang.Thread.run(Thread.java:818)Caused by: java.lang.NullPointerException: lock == null    at java.io.Reader.<init>(Reader.java:64)    at java.io.inputStreamReader.<init>(inputStreamReader.java:120)

与此相关的代码是这样的:

// EDIT 1: Following greenapps comment I will put a more reaListic version of this // method (The first version was invented because I wanted to be breaf)public voID selectfile(){    List<file> files = getDocstoparse();    this.ListvIEw.setAdapter(this.myadapter);    this.ListvIEw.setonItemClickListener(new OnItemClickListener()    {        ...        @OverrIDe        public voID onItemClick(AdapterVIEw<?> parent, VIEw v, int position, long ID) {        parsefile(files.get(position));                }        ...    }    this.myadapter.addfiles(files);}public static List<file> getDocstoparse() {    file sdcard = Environment.getExternalStorageDirectory();    file subdir = new file(sdcard, "MyAppFolder/files/");    // EDIT 2: I'm using  subdir.mkdirs(); because I want to     // create MyAppFolder/files/ folders the first time the user use the app.     // Is this not correct? Should I create these folders any other way?     if (!subdir.exists()) {        subdir.mkdirs();    }    file files[] = subdir.Listfiles();    List<file> filterfiles = new ArrayList<file>();    for (int i = 0; i < files.length; i++) {        file file = files[i];        filterfiles.add(file);    }    return filterfiles;}public voID parsefile(file filetoparse){    long totalSize = 0;    inputStream is = null;    try {            totalSize = filetoparse.length();            is = new BufferedinputStream(new fileinputStream(filetoparse));    } catch (IOException e) {        e.printstacktrace();    }    BufferedReader reader = null;    reader = new BufferedReader(new inputStreamReader(is, Charset.forname("UTF-8")));    String line = "";    StringTokenizer st = null;    try {        while ((line = reader.readline()) != null) {           // Here I parse the file        }    } catch (IOException e) {        e.printstacktrace();    }}

崩溃的线是这一行:

reader = new BufferedReader(new inputStreamReader(is, Charset.forname("UTF-8")));

我知道这是因为“是”是空的,我应该抓住这个案例,以避免应用程序崩溃(我将在我的下一个版本中修复此问题).

编辑3:你是对的,greenapps,我会在使用之前检查是否为null,在其他情况下我不会使用它.

我知道“is”是null,因为有一个IOException这样做:

 totalSize = filetoparse.length();    is = new BufferedinputStream(new fileinputStream(filetoparse));

编辑4:当然,如果这给了我一个IOEXception,我将不得不改变我的代码,使一个完全不同的东西.

我无法在Internet上找到原因,因此这两行代码可能会抛出IOException.

认为filetoparse没问题,或者至少不是null,因为我将这个“文件”列表传递给适配器,用files.get(i).getname()显示它们的文件名,并正确显示名称.

我必须补充说,要处理的文件非常大并且具有敏感的个人数据,因此用户无法将其发送给我,因此我可以使用它进行测试.

没有我的文件给我这个错误,没有有问题的文件,我很难跟踪问题所以我不得不猜测.知道什么原因会导致这个错误吗?

非常感谢和亲切的问候!

编辑5:遵循ctarabusi建议我已将我的parsefile方法更改为:

public voID parsefile(file filetoparse){    long totalSize = 0;    inputStream is = null;    try {            totalSize = filetoparse.length();            is = new BufferedinputStream(new fileinputStream(filetoparse));            BufferedReader reader = null;            reader = new BufferedReader(new inputStreamReader(is, Charset.forname("UTF-8")));            String line = "";            StringTokenizer st = null;            while ((line = reader.readline()) != null) {               // Here I parse the file            }    } catch (IOException e) {          Toast.makeText(getApplicationContext(), "Error parsing file", Toast.LENGTH_LONG).show();        e.printstacktrace();    } finally {        if(is != null)        {            try            {                is.close();            }            catch (IOException e)            {                Log.e("", e.getMessage(), e);            }        }    }}

我的测试再次正常工作,但是用户告诉我他看到了“Error parsing file”消息,所以它还没有失败.

我还能检查什么?

解决方法:

可能是您的问题是您没有关闭输入流.
文件描述符和流是有限的资源,完成它们后释放它们非常重要.

通常在finally块中完成,如:

inputStream inputStream = null;try {    ... use your input stream}catch (IOException e){    Log.e(TAG, e.getMessage(), e);}finally{    if (inputStream != null)    {        try        {            inputStream.close();        }        catch (IOException e)        {            Log.e(TAG, e.getMessage(), e);        }    }}
总结

以上是内存溢出为你收集整理的android – BufferedInputStream或FileInputStream IOException全部内容,希望文章能够帮你解决android – BufferedInputStream或FileInputStream IOException所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1120413.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存