BitmapFactory.decodeFile空指针问题

时间:2021-05-16 22:39:50
public class HttpThread extends Thread {
private String url;
private Handler handler;
private WebView webView;
private ImageView imageView;

public HttpThread(String url,WebView webView,Handler handler){
this.url = url;
this.webView = webView;
this.handler = handler;
}

public HttpThread(String url,ImageView imageView,Handler handler){
this.url = url;
this.imageView = imageView;
this.handler = handler;
}

public void run(){
try {
URL httpUrl = new URL(url);
try {
HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
conn.setReadTimeout(5000);
conn.setRequestMethod("GET");
conn.setDoInput(true);
InputStream in = conn.getInputStream();
File downloadFile = null;
FileOutputStream out = null;
String fileName = String.valueOf(System.currentTimeMillis());
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File parent = Environment.getExternalStorageDirectory();
downloadFile = new File(parent,fileName);
out = new FileOutputStream(downloadFile);
}
byte[] b = new byte[2 * 1024];
int len;
if(out != null){
while ((len = in.read(b)) != -1) {
out.write(b, 0, len);
}
}

final Bitmap bitmap = BitmapFactory.decodeFile(downloadFile.getAbsolutePath());
 handler.post(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
imageView.setImageBitmap(bitmap);
}
});
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

报错空指针,图片应该没有溢出内存,原来这段代码差不多,没有报空指针。我删除重新写的时候一直就报空指针,
不知道是哪里写错了
final Bitmap bitmap = BitmapFactory.decodeFile(downloadFile.getAbsolutePath());

12 个解决方案

#1


              检查你的 downloadFile 是不是空的?

#2


有可能生成不成功导致的空指针,要看看log是不是缺少权限没有生成

#3


if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))是否返回true?
downloadFile = new File(parent,fileName);是否返回非空?
debug一下

#4


引用 1 楼 u011070145 的回复:
              检查你的 downloadFile 是不是空的?

不是空

#5


引用 2 楼 lj19851227 的回复:
有可能生成不成功导致的空指针,要看看log是不是缺少权限没有生成

error级别的就三句,都是说空指针的,权限早就加了。本来这个程序可以运行,我删除HttpThread类当中部分代码重新写一遍的时候,其他没改,就报错了

#6


引用 1 楼 u011070145 的回复:
              检查你的 downloadFile 是不是空的?

确实是空,看错了,怎么解决?

#7


引用 6 楼 qq_29754803 的回复:
Quote: 引用 1 楼 u011070145 的回复:

              检查你的 downloadFile 是不是空的?

确实是空,看错了,怎么解决?
debug一下这一句:
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File parent = Environment.getExternalStorageDirectory();
downloadFile = new File(parent,fileName);
out = new FileOutputStream(downloadFile);
}
downloadFile可能没有生成;还有就是downloadFile是不是需要判断一下是否不存在然后调用createNewFile()方法

#8


引用 7 楼 NiZhuanXingHeIT 的回复:
Quote: 引用 6 楼 qq_29754803 的回复:

Quote: 引用 1 楼 u011070145 的回复:

              检查你的 downloadFile 是不是空的?

确实是空,看错了,怎么解决?
debug一下这一句:
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File parent = Environment.getExternalStorageDirectory();[code=java]

downloadFile = new File(parent,fileName);
out = new FileOutputStream(downloadFile);
}[/code]downloadFile可能没有生成;还有就是downloadFile是不是需要判断一下是否不存在然后调用createNewFile()方法


那是这么写吗?
downloadFile = new File(parent,fileName);
if(downloadFile == null){
downloadFile.createNewFile();
}
out = new FileOutputStream(downloadFile);
但是报错,怎么搞。我的外置存储卡好像本来就打不开,不知道是不是权限的原因,要改adb命令

#9


引用 8 楼 qq_29754803 的回复:
Quote: 引用 7 楼 NiZhuanXingHeIT 的回复:

Quote: 引用 6 楼 qq_29754803 的回复:

Quote: 引用 1 楼 u011070145 的回复:

              检查你的 downloadFile 是不是空的?

确实是空,看错了,怎么解决?
debug一下这一句:
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File parent = Environment.getExternalStorageDirectory();[code=java]

downloadFile = new File(parent,fileName);
out = new FileOutputStream(downloadFile);
}[/code]downloadFile可能没有生成;还有就是downloadFile是不是需要判断一下是否不存在然后调用createNewFile()方法


那是这么写吗?
downloadFile = new File(parent,fileName);
if(downloadFile == null){
downloadFile.createNewFile();
}
out = new FileOutputStream(downloadFile);
但是报错,怎么搞。我的外置存储卡好像本来就打不开,不知道是不是权限的原因,要改adb命令
不要那样写写,应该这样:
if(!downloadFile .exists()){
downloadFile.createNewFile();}
;还有向外部文件输出需要在manifests中加权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

#10


不行啊
09-18 07:03:27.379: D/dalvikvm(854): GC_FOR_ALLOC freed 41K, 6% free 2693K/2852K, paused 81ms, total 84ms
09-18 07:03:27.379: I/dalvikvm-heap(854): Grow heap (frag case) to 3.348MB for 635812-byte allocation
09-18 07:03:27.449: D/dalvikvm(854): GC_FOR_ALLOC freed 2K, 5% free 3311K/3476K, paused 61ms, total 61ms
09-18 07:03:27.909: W/dalvikvm(854): threadid=15: thread exiting with uncaught exception (group=0x414c4700)
09-18 07:03:27.909: E/AndroidRuntime(854): FATAL EXCEPTION: Thread-82
09-18 07:03:27.909: E/AndroidRuntime(854): java.lang.NullPointerException
09-18 07:03:27.909: E/AndroidRuntime(854):  at com.hao123.http_01.HttpThread.run(HttpThread.java:67)
09-18 07:03:27.969: I/Choreographer(854): Skipped 65 frames!  The application may be doing too much work on its main thread.
09-18 07:03:28.179: D/gralloc_goldfish(854): Emulator without GPU emulation detected.
09-18 07:03:31.409: I/Choreographer(854): Skipped 30 frames!  The application may be doing too much work on its main thread.
09-18 07:03:34.060: I/Process(854): Sending signal. PID: 854 SIG: 9

注册文件很早就已经全部注册过了,我是说FileExplorer中的mnt中的sdcard打不开,之前文件想存进去的结果好像崩溃了,还是存进去也打不开就没管了,查了一下好像是要搞linux的adb命令,好像是文件夹权限。

  <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

#11


Quote: 引用 9 楼 NiZhuanXingHeIT 的回复:

Quote: 引用 8 楼 qq_29754803 的回复:

Quote: 引用 7 楼 NiZhuanXingHeIT 的回复:

Quote: 引用 6 楼 qq_29754803 的回复:

Quote: 引用 1 楼 u011070145 的回复:

          还是报错啊,求解

#12


BitmapFactory.decodeFile空指针问题要不换个测试机试试,如果还是不行,就是代码的问题了

#1


              检查你的 downloadFile 是不是空的?

#2


有可能生成不成功导致的空指针,要看看log是不是缺少权限没有生成

#3


if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))是否返回true?
downloadFile = new File(parent,fileName);是否返回非空?
debug一下

#4


引用 1 楼 u011070145 的回复:
              检查你的 downloadFile 是不是空的?

不是空

#5


引用 2 楼 lj19851227 的回复:
有可能生成不成功导致的空指针,要看看log是不是缺少权限没有生成

error级别的就三句,都是说空指针的,权限早就加了。本来这个程序可以运行,我删除HttpThread类当中部分代码重新写一遍的时候,其他没改,就报错了

#6


引用 1 楼 u011070145 的回复:
              检查你的 downloadFile 是不是空的?

确实是空,看错了,怎么解决?

#7


引用 6 楼 qq_29754803 的回复:
Quote: 引用 1 楼 u011070145 的回复:

              检查你的 downloadFile 是不是空的?

确实是空,看错了,怎么解决?
debug一下这一句:
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File parent = Environment.getExternalStorageDirectory();
downloadFile = new File(parent,fileName);
out = new FileOutputStream(downloadFile);
}
downloadFile可能没有生成;还有就是downloadFile是不是需要判断一下是否不存在然后调用createNewFile()方法

#8


引用 7 楼 NiZhuanXingHeIT 的回复:
Quote: 引用 6 楼 qq_29754803 的回复:

Quote: 引用 1 楼 u011070145 的回复:

              检查你的 downloadFile 是不是空的?

确实是空,看错了,怎么解决?
debug一下这一句:
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File parent = Environment.getExternalStorageDirectory();[code=java]

downloadFile = new File(parent,fileName);
out = new FileOutputStream(downloadFile);
}[/code]downloadFile可能没有生成;还有就是downloadFile是不是需要判断一下是否不存在然后调用createNewFile()方法


那是这么写吗?
downloadFile = new File(parent,fileName);
if(downloadFile == null){
downloadFile.createNewFile();
}
out = new FileOutputStream(downloadFile);
但是报错,怎么搞。我的外置存储卡好像本来就打不开,不知道是不是权限的原因,要改adb命令

#9


引用 8 楼 qq_29754803 的回复:
Quote: 引用 7 楼 NiZhuanXingHeIT 的回复:

Quote: 引用 6 楼 qq_29754803 的回复:

Quote: 引用 1 楼 u011070145 的回复:

              检查你的 downloadFile 是不是空的?

确实是空,看错了,怎么解决?
debug一下这一句:
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File parent = Environment.getExternalStorageDirectory();[code=java]

downloadFile = new File(parent,fileName);
out = new FileOutputStream(downloadFile);
}[/code]downloadFile可能没有生成;还有就是downloadFile是不是需要判断一下是否不存在然后调用createNewFile()方法


那是这么写吗?
downloadFile = new File(parent,fileName);
if(downloadFile == null){
downloadFile.createNewFile();
}
out = new FileOutputStream(downloadFile);
但是报错,怎么搞。我的外置存储卡好像本来就打不开,不知道是不是权限的原因,要改adb命令
不要那样写写,应该这样:
if(!downloadFile .exists()){
downloadFile.createNewFile();}
;还有向外部文件输出需要在manifests中加权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

#10


不行啊
09-18 07:03:27.379: D/dalvikvm(854): GC_FOR_ALLOC freed 41K, 6% free 2693K/2852K, paused 81ms, total 84ms
09-18 07:03:27.379: I/dalvikvm-heap(854): Grow heap (frag case) to 3.348MB for 635812-byte allocation
09-18 07:03:27.449: D/dalvikvm(854): GC_FOR_ALLOC freed 2K, 5% free 3311K/3476K, paused 61ms, total 61ms
09-18 07:03:27.909: W/dalvikvm(854): threadid=15: thread exiting with uncaught exception (group=0x414c4700)
09-18 07:03:27.909: E/AndroidRuntime(854): FATAL EXCEPTION: Thread-82
09-18 07:03:27.909: E/AndroidRuntime(854): java.lang.NullPointerException
09-18 07:03:27.909: E/AndroidRuntime(854):  at com.hao123.http_01.HttpThread.run(HttpThread.java:67)
09-18 07:03:27.969: I/Choreographer(854): Skipped 65 frames!  The application may be doing too much work on its main thread.
09-18 07:03:28.179: D/gralloc_goldfish(854): Emulator without GPU emulation detected.
09-18 07:03:31.409: I/Choreographer(854): Skipped 30 frames!  The application may be doing too much work on its main thread.
09-18 07:03:34.060: I/Process(854): Sending signal. PID: 854 SIG: 9

注册文件很早就已经全部注册过了,我是说FileExplorer中的mnt中的sdcard打不开,之前文件想存进去的结果好像崩溃了,还是存进去也打不开就没管了,查了一下好像是要搞linux的adb命令,好像是文件夹权限。

  <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

#11


Quote: 引用 9 楼 NiZhuanXingHeIT 的回复:

Quote: 引用 8 楼 qq_29754803 的回复:

Quote: 引用 7 楼 NiZhuanXingHeIT 的回复:

Quote: 引用 6 楼 qq_29754803 的回复:

Quote: 引用 1 楼 u011070145 的回复:

          还是报错啊,求解

#12


BitmapFactory.decodeFile空指针问题要不换个测试机试试,如果还是不行,就是代码的问题了