file!=null和file.exists()的区别
2016-05-23 15:16
435 查看
1:问题描述
代码:
//第一个方法:根据url进行拼接文件,获取文件的方法
public static File getImageFile(String imagePath){
//1获取sd卡的目录
File root = Environment.getExternalStorageDirectory();
//2判断sk卡是否存在(等价于Environment.getExternalStorageState());
if (root.exists()){
//拼接图片存储路径的字符串,并且判断这个文件是否存在
//如果存在,则返回这个文件,供其他地方使用,否则返回Null
//这里可以看到,获取到一个变量的时候我们最常用的操作就是判断是否为空
File file = new File(root.getAbsolutePath()+"/"+IMAGE_PATH+"/"+imagePath+".jpg");
if (file!=null&&file.exists()){
return file;
}
}
return null;
}
//第三个方法:根据路径判断图片是否存在的方法
//缓存的使用:当在sd卡已经存在这个文件的时候,我们应该在内存拿而不是在网络获取
public static boolean checkImageExists(String imagePath){
//1先把传进来的图片url转换成文件
File imageFile = getImageFile(imagePath);
//判断是否存在
if (imageFile.exists()&&imageFile.length()>0) {
//2通过文件的路径获取获取一个Bitmap
Bitmap bitmap = getBitmap(imageFile.getAbsolutePath());
//3不为空返回true
if (bitmap != null) {
return true;
}
}
//其他情况返回false
return false;
}
场景:网络获取资源图片,判断在本地是否有缓存,如果有缓存直接去,没有缓存直接下载;
错误:在图片需要在网络下载的时候发生NullpointException;
2:问题分析
为什么会出现这种问题呢?
关键就在于方法3的判断if (imageFile.exists()&&imageFile.length()>0)
我之前的想法是直接就能用这个imageFile.exists()代替imageFile!=null,
但是imageFile.exists()不存在是运行时才能发现, 和文件是不是null没什么关系,文件null的判断是对象级的;
如果你定义File file = null;那么就一定出现空指针
如果你定义File file = new File('xxxxx');
那么这个file绝不是null, 而file到底存在不存在是运行时捕获的异常, 即你写程序的时候是不可能知道在不在的........
所以两者不是一回事
3解决方法
//第三个方法:根据路径判断图片是否存在的方法
//缓存的使用:当在sd卡已经存在这个文件的时候,我们应该在内存拿而不是在网络获取
public static boolean checkImageExists(String imagePath){
//1先把传进来的图片url转换成文件
File imageFile = getImageFile(imagePath);
//判断是否存在 !=null与exists是有区别的 前者是指代码的未初始化,后者是指文件是否存在
if (imageFile!=null&&imageFile.exists()&&imageFile.length()>0) {
//2通过文件的路径获取获取一个Bitmap
Bitmap bitmap = getBitmap(imageFile.getAbsolutePath());
//3不为空返回true
if (bitmap != null) {
return true;
}
}
//其他情况返回false
return false;
}
代码:
//第一个方法:根据url进行拼接文件,获取文件的方法
public static File getImageFile(String imagePath){
//1获取sd卡的目录
File root = Environment.getExternalStorageDirectory();
//2判断sk卡是否存在(等价于Environment.getExternalStorageState());
if (root.exists()){
//拼接图片存储路径的字符串,并且判断这个文件是否存在
//如果存在,则返回这个文件,供其他地方使用,否则返回Null
//这里可以看到,获取到一个变量的时候我们最常用的操作就是判断是否为空
File file = new File(root.getAbsolutePath()+"/"+IMAGE_PATH+"/"+imagePath+".jpg");
if (file!=null&&file.exists()){
return file;
}
}
return null;
}
//第三个方法:根据路径判断图片是否存在的方法
//缓存的使用:当在sd卡已经存在这个文件的时候,我们应该在内存拿而不是在网络获取
public static boolean checkImageExists(String imagePath){
//1先把传进来的图片url转换成文件
File imageFile = getImageFile(imagePath);
//判断是否存在
if (imageFile.exists()&&imageFile.length()>0) {
//2通过文件的路径获取获取一个Bitmap
Bitmap bitmap = getBitmap(imageFile.getAbsolutePath());
//3不为空返回true
if (bitmap != null) {
return true;
}
}
//其他情况返回false
return false;
}
场景:网络获取资源图片,判断在本地是否有缓存,如果有缓存直接去,没有缓存直接下载;
错误:在图片需要在网络下载的时候发生NullpointException;
2:问题分析
为什么会出现这种问题呢?
关键就在于方法3的判断if (imageFile.exists()&&imageFile.length()>0)
我之前的想法是直接就能用这个imageFile.exists()代替imageFile!=null,
但是imageFile.exists()不存在是运行时才能发现, 和文件是不是null没什么关系,文件null的判断是对象级的;
如果你定义File file = null;那么就一定出现空指针
如果你定义File file = new File('xxxxx');
那么这个file绝不是null, 而file到底存在不存在是运行时捕获的异常, 即你写程序的时候是不可能知道在不在的........
所以两者不是一回事
3解决方法
//第三个方法:根据路径判断图片是否存在的方法
//缓存的使用:当在sd卡已经存在这个文件的时候,我们应该在内存拿而不是在网络获取
public static boolean checkImageExists(String imagePath){
//1先把传进来的图片url转换成文件
File imageFile = getImageFile(imagePath);
//判断是否存在 !=null与exists是有区别的 前者是指代码的未初始化,后者是指文件是否存在
if (imageFile!=null&&imageFile.exists()&&imageFile.length()>0) {
//2通过文件的路径获取获取一个Bitmap
Bitmap bitmap = getBitmap(imageFile.getAbsolutePath());
//3不为空返回true
if (bitmap != null) {
return true;
}
}
//其他情况返回false
return false;
}
相关文章推荐
- VMAX应用实例:如何查看VMAX Enginuity版本和补丁信息
- Android Studio教程从入门到精通
- 多线程之间变量锁的实现
- android 获取视频缩略图
- leetcode Increasing Triplet Subsequence
- iOS 循环引用
- 高并发金融应用架构优化与平台创新
- Python easy install的安装及使用
- Symmetrix 超级卷、物理卷、逻辑卷及Meta卷图解手册
- Shell 正则表达式
- Java网络编程基础(三)---基于UDP编程
- INTERACTIVE HEAT MAPS FOR R
- JAVA多线程(三)生产者消费者模式及实现方法
- mac jdk 1.6下载地址
- Amaze ~ 妹子 UI 中国首个开源 HTML5 跨屏前端框架
- 操作技巧——保障无线上网的技巧
- 服务器TIME_WAIT和CLOSE_WAIT详解和解决办法
- 苹果App Store新规:6月1日后所有应用必须支持IPv6-only网络
- 控件不会被输入法影响
- ArrayList源码分析(JDK1.8)