Exception in thread "main" java.lang.ClassCastException: java.math.BigDecimal cannot be cast to ja

本文介绍了一个关于ClassCastException异常的问题,该异常发生在尝试将BigDecimal转换为Long和Integer时。文章详细展示了异常发生的代码位置,并提供了解决方案,即如何正确地进行类型转换。

错误类型提示,如下:

 

log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.Long
 at demo.spring.jdbc.dao.JDBCTemplatePersonDaoImpl.findById(JDBCTemplatePersonDaoImpl.java:26)
 at demo.spring.test.TestDataSourceInjection.main(TestDataSourceInjection.java:18)

 

根据提示找到了对应的内容,如下:

public class JDBCTemplatePersonDaoImpl implements PersonDao {
 private JdbcTemplate jdbcTemplate;
 //通过IOC注入数据源后,初始化jdbcTemplate对象
 public void setDataSource(DataSource dataSource){
  jdbcTemplate=new JdbcTemplate(dataSource);
 }
 @Override
 public Person findById(Long id) {
  //通过queryForList执行sql语句,返回结果集,结果集类型为Map
  List person=jdbcTemplate.queryForList("select * from person where id="+id.longValue());
  
  for(Iterator it=person.iterator();it.hasNext();){
   Map personMap=(Map) it.next();
   Long p_id=(Long)personMap.get("ID");
   String p_name=(String)personMap.get("NAME");
   Integer p_age=(Integer)personMap.get("AGE");
   
   Person p=new Person();
   p.setId(p_id);
   p.setName(p_name);
   p.setAge(p_age);
   
   return p;
  }
  return null;
 }

}

解决办法:修改其中两条语句,如下:

   Long p_id=((BigDecimal) personMap.get("ID")).longValue();
   Integer p_age=((BigDecimal)personMap.get("AGE")).intValue();

记住:不要忘记import java.math.BigDecimal; 

Java中,`java.math.BigDecimal` 是用于高精度数值计算的类,而 `java.lang.String` 是字符串类型,二者属于完全不同的数据类型,不能通过强制类型转换(cast)直接转换。当尝试执行如下代码时: ```java Object obj = new BigDecimal("123.45"); String str = (String) obj; ``` 会抛出 `java.lang.ClassCastException`,因为 `BigDecimal` 无法直接转换为 `String` [^1]。 ### 正确的转换方式 要将 `BigDecimal` 转换为 `String`,应使用其提供的方法或构造函数进行显式转换,而不是强制类型转换。 #### 1. 使用 `toString()` 方法 `BigDecimal` 提供了 `toString()` 方法,可以将其数值转换为对应的字符串表示形式。 ```java BigDecimal number = new BigDecimal("123.45"); String str = number.toString(); ``` #### 2. 使用 `String.valueOf()` 方法 也可以使用 `String.valueOf(BigDecimal)` 方法进行转换,其实质调用了 `BigDecimal.toString()`。 ```java BigDecimal number = new BigDecimal("123.45"); String str = String.valueOf(number); ``` #### 3. 格式化输出(可选) 若需要特定格式的字符串输出,可以结合 `DecimalFormat` 进行格式化。 ```java import java.math.BigDecimal; import java.text.DecimalFormat; BigDecimal number = new BigDecimal("123456.789"); DecimalFormat df = new DecimalFormat("#,##0.00"); String formatted = df.format(number); ``` ### 总结 - `BigDecimal` 不能通过强制类型转换为 `String`,否则会抛出 `ClassCastException` [^1]。 - 应使用 `toString()` 或 `String.valueOf()` 方法进行转换。 - 若需要格式化输出,可借助 `DecimalFormat` 实现更友好的展示效果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值