我刚刚发布了一个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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)