Java mkdir() 导致的Bug
2016-08-23 13:39
344 查看
原文地址:https://www.zybuluo.com/linux1s1s/note/132124
而且有一点我比较好奇的是,为什么有些机型有这个问题(红米,Android5.1.1),而有些机型不会有这个问题呢(红米,Android4.4.2)?
以下是正文:
有些Bug你可能怎么想也想不通,请始终铭记出现Bug首先看看自己的代码哪里出问题了,而不是一直在那郁闷吐槽。废话说到这里,下面直接上干货:
上面代码有啥问题?
如果一旦使用上面代码片段,很可能会抛出以下异常:
上面异常大概是说不能打开数据库,所以抛出异常
那么为什么会打不开呢? 按照正常的思维是先检验文件是否存在,如果存在,则直接使用,如果不存在,那么创建相应的目录,所以左思右想,上面的Crash不该有啊。
其实上面的代码有明显的问题,这里先提示一下:
上面两个方法有啥区别?mkdir()不会创建所有层级,而mkdirs()则可以。对的,就是这个方法的误用导致上面的问题。如果不清楚为啥,可以自行查阅Java JDK,这里不再赘述。
而且有一点我比较好奇的是,为什么有些机型有这个问题(红米,Android5.1.1),而有些机型不会有这个问题呢(红米,Android4.4.2)?
以下是正文:
有些Bug你可能怎么想也想不通,请始终铭记出现Bug首先看看自己的代码哪里出问题了,而不是一直在那郁闷吐槽。废话说到这里,下面直接上干货:
//得到SD卡路径
private final static String DATABASE_PATH = android.os.Environment.getExternalStorageDirectory().getAbsolutePath()
+ "/com/cn21/account/public";
//数据库名
private final static String DATABASE_FILENAME = "account.db3";
public class AccountDBHelper{
private static SQLiteDatabase initDatabase(){
String databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME;
File dir = new File(DATABASE_PATH);
if(!dir.exists())
dir.mkdir();
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(databaseFilename, null);
db.execSQL(sql_user);
return db;
}
}
上面代码有啥问题?
如果一旦使用上面代码片段,很可能会抛出以下异常:
01-02 13:29:17.601: E/SQLiteDatabase(2258): Failed to open database '/storage/emulated/0/com/cn21/account/public/account.db3'.
01-02 13:29:17.601: E/SQLiteDatabase(2258): android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
01-02 13:29:17.601: E/SQLiteDatabase(2258): at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
01-02 13:29:17.601: E/SQLiteDatabase(2258): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:339)
01-02 13:29:17.601: E/SQLiteDatabase(2258): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:236)
01-02 13:29:17.601: E/SQLiteDatabase(2258): at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:515)
01-02 13:29:17.601: E/SQLiteDatabase(2258): at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:207)
01-02 13:29:17.601: E/SQLiteDatabase(2258): at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:178)
01-02 13:29:17.601: E/SQLiteDatabase(2258): at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:891)
01-02 13:29:17.601: E/SQLiteDatabase(2258): at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:859)
01-02 13:29:17.601: E/SQLiteDatabase(2258): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:696)
01-02 13:29:17.601: E/SQLiteDatabase(2258): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:1249)
01-02 13:29:17.601: E/SQLiteDatabase(2258): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:1238)
01-02 13:29:17.601: E/SQLiteDatabase(2258): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:236)
01-02 13:29:17.601: E/SQLiteDatabase(2258): at com.cn21.account.lib.db.AccountDBHelper.initDatabase(AccountDBHelper.java:114)
01-02 13:29:17.601: E/SQLiteDatabase(2258): at com.cn21.account.lib.db.AccountDBHelper.getCache(AccountDBHelper.java:73)
01-02 13:29:17.601: E/SQLiteDatabase(2258): at com.cn21.account.lib.ui.LoginActivity.onCreate(LoginActivity.java:71)
01-02 13:29:17.601: E/SQLiteDatabase(2258): at android.app.Activity.performCreate(Activity.java:5372)
01-02 13:29:17.601: E/SQLiteDatabase(2258): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104)
01-02 13:29:17.601: E/SQLiteDatabase(2258): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2270)
01-02 13:29:17.601: E/SQLiteDatabase(2258): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2362)
01-02 13:29:17.601: E/SQLiteDatabase(2258): at android.app.ActivityThread.access$700(ActivityThread.java:168)
01-02 13:29:17.601: E/SQLiteDatabase(2258): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1329)
01-02 13:29:17.601: E/SQLiteDatabase(2258): at android.os.Handler.dispatchMessage(Handler.java:99)
01-02 13:29:17.601: E/SQLiteDatabase(2258): at android.os.Looper.loop(Looper.java:137)
01-02 13:29:17.601: E/SQLiteDatabase(2258): at android.app.ActivityThread.main(ActivityThread.java:5493)
01-02 13:29:17.601: E/SQLiteDatabase(2258): at java.lang.reflect.Method.invokeNative(Native Method)
01-02 13:29:17.601: E/SQLiteDatabase(2258): at java.lang.reflect.Method.invoke(Method.java:525)
01-02 13:29:17.601: E/SQLiteDatabase(2258): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
01-02 13:29:17.601: E/SQLiteDatabase(2258): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
01-02 13:29:17.601: E/SQLiteDatabase(2258): at dalvik.system.NativeStart.main(Native Method)
上面异常大概是说不能打开数据库,所以抛出异常
那么为什么会打不开呢? 按照正常的思维是先检验文件是否存在,如果存在,则直接使用,如果不存在,那么创建相应的目录,所以左思右想,上面的Crash不该有啊。
其实上面的代码有明显的问题,这里先提示一下:
dir.mkdir()
dir.mkdirs()
上面两个方法有啥区别?mkdir()不会创建所有层级,而mkdirs()则可以。对的,就是这个方法的误用导致上面的问题。如果不清楚为啥,可以自行查阅Java JDK,这里不再赘述。
相关文章推荐
- 分享内bug导致iOS审核失败的解决方案
- ssh中action方法不执行导致Dbug无法调试
- 解决jqueryeasyUI dialog 弹出窗口超出浏览器,导致不能关闭的bug
- 已知的CPropertysheet bug: 切换焦点导致无响应
- ios模拟器和真机的差异-浮点数精度导致的bug
- dockpanel suit 关闭dock窗口导致document焦点丢失bug问题处理
- Java中static变量相互引用导致的Bug
- 一个时序混乱导致的bug分析过程记录
- 触发了MySQL一个bug导致进程不断crash重启
- solaris系统下使用asm的bug (solaris系统248天未重启导致asm进程异常)
- XP bug 导致的java.lang.NoClassDefFoundError:javax/transaction/SystemException问题解决
- [php内核bug]动态链接方式编译的扩展, 扩展全局空间dtor导致core dump
- IE Bug 1 - 错误识别出现在javascript脚本中的字符串,导致HTML标签解析错误
- Xcode 5 的一个 Bug:修改 TableView的 content导致崩溃
- Open SuSE11.4 Bug 导致samba启动失败
- CSDN博客工具配置部分存在Bug,导致不能加载Google搜索
- 由 BUG 引发 ORA-15064 进而导致数据库实例意外中止
- 一次jedis使用不规范,导致redis客户端close_wait大量增加的bug
- Android ListView避免在GetView时数据发生变化导致找不到元素的Bug
- php redis2.2.7扩展bug导致段故障与重新声明类bug