java.lang.IllegalArgumentException: Can not set xxxx field XXXX
IllegalArgumentException: 非法参数异常
产生异常的原因:
在Java与mysql交互数据时,由于定义数据类型的不一致,我们在从mysql中读取数据到Java中进行类型转换时,时常会因为数据类型的不一致而导致该异常。
解决方法:
- 以我目前的案例为例:
Book类对应mysql中的book表,类中定义了一个Year类型的publishYear变量
mysql表中定义了一个year类型变量
由于java数据类型与mysql类型的数据对应不是这两个类型,因此发生以下异常:
java.lang.IllegalArgumentException: Can not set java.time.Year field com.aluem.bean.Book.publishYear to java.sql.Date
大意为:不能将java.time.Year类型属性设置成java.sql.Date类型。
-
解决方案:
- 通过查询java数据类型与mysql类型的数据对应类型表,得知此处应该将Book类中的publishYear属性改为Date类型。如下图:
再次测试,成功得到数据。
- 通过查询java数据类型与mysql类型的数据对应类型表,得知此处应该将Book类中的publishYear属性改为Date类型。如下图:
Java数据类型和MySql数据类型对应表
类型名称 | 显示长度 | 数据库类型 | JAVA类型 | JDBC类型索引(int) | 描述 |
---|---|---|---|---|---|
VARCHAR | L+N | VARCHAR | java.lang.String | 12 | |
CHAR | N | CHAR | java.lang.String | 1 | |
BLOB | L+N | BLOB | java.lang.byte[] | -4 | |
TEXT | 65535 | VARCHAR | java.lang.String | -1 | |
INTEGER | 4 | INTEGER | UNSIGNED | java.lang.Long | 4 |
TINYINT | 3 | TINYINT UNSIGNED | java.lang.Integer | -6 | |
SMALLINT | 5 | SMALLINT UNSIGNED | java.lang.Integer | 5 | |
MEDIUMINT | 8 | MEDIUMINT UNSIGNED | java.lang.Integer | 4 | |
BIT | 1 | BIT | java.lang.Boolean | -7 | |
BIGINT | 20 | BIGINT UNSIGNED | java.math.BigInteger | -5 | |
FLOAT | 4+8 | FLOAT | java.lang.Float | 7 | |
DOUBLE | 22 | DOUBLE | java.lang.Double | 8 | |
DECIMAL | 11 | DECIMAL | java.math.BigDecimal | 3 | |
BOOLEAN | 1 | 同TINYINT | |||
ID | 11 | PK (INTEGER UNSIGNED) | java.lang.Long 4 | ||
DATE | 10 | DATE | java.sql.Date 91 | ||
TIME | 8 | TIME | java.sql.Time | 92 | |
DATETIME | 19 | DATETIME | java.sql.Timestamp | 93 | |
TIMESTAMP | 19 | TIMESTAMP | java.sql.Timestamp | 93 | |
YEAR | 4 | YEAR | java.sql.Date | 91 |