guolindev / LitePal

An Android library that makes developers use SQLite database extremely easy.
Apache License 2.0
8.11k stars 1.59k forks source link

LitePalSupportException #561

Open keyejxptwn opened 5 years ago

keyejxptwn commented 5 years ago

org.litepal.exceptions.LitePalSupportException: Attempt to invoke virtual method 'java.lang.Class[] java.lang.reflect.Constructor.getParameterTypes()' on a null object reference at org.litepal.crud.DataHandler.query(DataHandler.java:154) at org.litepal.crud.QueryHandler.onFind(QueryHandler.java:159) at org.litepal.FluentQuery.find(FluentQuery.java:234) at org.litepal.FluentQuery$1.run(FluentQuery.java:253) at java.lang.Thread.run(Thread.java:764) Caused by: org.litepal.exceptions.LitePalSupportException: Attempt to invoke virtual method 'java.lang.Class[] java.lang.reflect.Constructor.getParameterTypes()' on a null object reference at org.litepal.crud.DataHandler.createInstanceFromClass(DataHandler.java:636) at org.litepal.crud.DataHandler.query(DataHandler.java:139) at org.litepal.crud.QueryHandler.onFind(QueryHandler.java:159)  at org.litepal.FluentQuery.find(FluentQuery.java:234)  at org.litepal.FluentQuery$1.run(FluentQuery.java:253)  at java.lang.Thread.run(Thread.java:764)  Caused by: org.litepal.exceptions.LitePalSupportException: Attempt to invoke virtual method 'java.lang.Class[] java.lang.reflect.Constructor.getParameterTypes()' on a null object reference at org.litepal.crud.DataHandler.createInstanceFromClass(DataHandler.java:636) at org.litepal.crud.DataHandler.getInitParamValue(DataHandler.java:953) at org.litepal.crud.DataHandler.getConstructorParams(DataHandler.java:692) at org.litepal.crud.DataHandler.createInstanceFromClass(DataHandler.java:634) at org.litepal.crud.DataHandler.query(DataHandler.java:139)  at org.litepal.crud.QueryHandler.onFind(QueryHandler.java:159)  at org.litepal.FluentQuery.find(FluentQuery.java:234)  at org.litepal.FluentQuery$1.run(FluentQuery.java:253)  at java.lang.Thread.run(Thread.java:764)  Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class[] java.lang.reflect.Constructor.getParameterTypes()' on a null object reference at org.litepal.crud.DataHandler.getConstructorParams(DataHandler.java:689) at org.litepal.crud.DataHandler.createInstanceFromClass(DataHandler.java:634) at org.litepal.crud.DataHandler.getInitParamValue(DataHandler.java:953)  at org.litepal.crud.DataHandler.getConstructorParams(DataHandler.java:692)  at org.litepal.crud.DataHandler.createInstanceFromClass(DataHandler.java:634)  at org.litepal.crud.DataHandler.query(DataHandler.java:139)  at org.litepal.crud.QueryHandler.onFind(QueryHandler.java:159)  at org.litepal.FluentQuery.find(FluentQuery.java:234)  at org.litepal.FluentQuery$1.run(FluentQuery.java:253)  at java.lang.Thread.run(Thread.java:764) 

keyejxptwn commented 5 years ago

Android 9.0+会出现该问题,直接闪退,9.0以下未发现该问题

guolindev commented 4 years ago

能把你的实体类也贴出来看一下吗

keyejxptwn commented 4 years ago

是构造方法额问题,LitePal默认使用无参构造方法

guolindev commented 4 years ago

LitePal不是默认使用无参数构造方法,而是会找寻最合适的一个构造方法,如果找不到就会抛出上面的异常。但是我很难能理解为什么会找不到最合适的构造方法,因为正常情况下一个类必然会有构造方法。

所以我才说让你贴一下你的实体类到底是定义成什么样子的,主要是便于我定位问题。当然这个问题已经过去这么久了,你找不到当初的代码也正常。我在新版的LitePal当中在这处地方加了很多日志,如果以后再发生这样的问题,我就能明白为什么会找不到合适的构造方法。

那么这个问题我就先关闭掉了。

yuanzhiyong668 commented 3 years ago

我也遇到了这个问题,要怎么修改实体类呢 image 我的实体类 data class Province( val adcode: String, val center: String, val citycode: Any, val districts: List, val level: String, val name: String ) : LitePalSupport() 调用findAll就报错了

amosxb commented 2 years ago

我也遇到了这个问题,要怎么修改实体类呢 image 我的实体类 data class Province( val adcode: String, val center: String, val citycode: Any, val districts: List, val level: String, val name: String ) : LitePalSupport() 调用findAll就报错了 需要给参数添加默认值

guolindev commented 2 years ago

我先将这个问题重新打开,这个问题其实很尴尬,是个Kotlin的非空机制和反射初始化时暂时置空的机制冲突导致的。

LitePal反射初始化的机制是有瑕疵的,后面我准备改成类似GSON的反射初始化机制,到时候可以规避掉现在遇到的这种情况。

如果是想要通过修改实体类的方式来解决这个问题,一个办法是你说的给参数添加默认值,另一个办法就是给这些类型的后面加上?,让它们可以为空。