bigInt报错(Exception in thread “main“ java.lang.NullPointerException: Cannot invoke “java.math.BigInt)

空指针异常,不太会用BigInteger,以为初始化和int一样,直接等于就行了

看了一下源代码,初始化赋值只有下面几种情况智能赋值这几个,而且必须用对应的英文来表示

-1 0 1 2 10 

2.斐波那契数列最大公约数 - 蓝桥云课

一开始用int 来初始化数组,我还没有意识到问题的严重性,直到结果返回-1我才意识到好像没有那么简单,我丢,然后我把前2020个斐波那契数一个一个打印出来(用long 打印的)结果我发现后面的全是负数,我就知道,这绝对溢出了,我丢,然后就用bigInteger

发现还不会用

我一开始的代码如下

给bigInteger类直接也是用上加号了【捂脸】

ackage Lanqiao;

import java.math.BigInteger;

/**
 * @author zb
 * date2025/3/20 21:05
 */
public class L1006 {
    public static void main(String[] args) {
        BigInteger f[] = new BigInteger[2030];
        f[1] = BigInteger.valueOf(1);
        f[2] = BigInteger.valueOf(1);
        for (int i = 3; i <= 2020 ; i++) {
           f[i].add(f[i-1]);
           f[i].add(f[i-2]);
        }
        for (int i = 1; i <=2020 ; i++) {
            System.out.println(f[i]);
        }
        System.out.println(f[520].gcd(f[2020]));
    }


}

从初始化 第一个斐波那契数和第二个斐波那契数的时候也可以这样初始化

 f[1] = new BigInteger("1");
        f[2] = new BigInteger("1");

1. BigInteger 是一个类,不是基本数据类型

  • 基本数据类型(如 intlong)可以直接使用算术运算符进行运算。例如
  • int a = 5;
    int b = 3;
    int c = a + b; // 直接使用 + 运算符

    BigInteger 是一个对象类型,它封装了大整数的值,并提供了专门的方法来进行运算。例如

BigInteger a = new BigInteger("5");
BigInteger b = new BigInteger("3");
BigInteger c = a.add(b); // 使用 add() 方法进行加法

2. 为什么不能直接使用 + 运算符?

  • 运算符重载的限制:Java 不支持对自定义类(如 BigInteger)的运算符重载。因此,+ 运算符只能用于基本数据类型,而不能用于对象类型。
  • BigInteger 的不可变性BigInteger 是不可变类,每次运算都会返回一个新的 BigInteger 对象,而不是修改原有对象。这与基本数据类型的运算方式不同。

3. 正确使用 BigInteger 进行运算

BigInteger 提供了专门的方法来进行算术运算,例如:

  • 加法add(BigInteger val)
  • 减法subtract(BigInteger val)
  • 乘法multiply(BigInteger val)
  • 除法divide(BigInteger val)

4. 为什么在斐波那契数列中不能用 f[i] = f[i-1] + f[i-2]

在斐波那契数列的计算中,如果 f 是一个 BigInteger 数组,直接使用 + 运算符会导致编译错误,因为 + 不能用于 BigInteger 对象。

5. 总结

特性基本数据类型(如 intBigInteger
类型基本数据类型类(对象类型)
运算方式直接使用 +- 等运算符使用 add()subtract() 等方法
精度有限(如 int 最大 2³¹-1)任意精度(无上限)
适用场景小规模整数计算大规模整数计算(如斐波那契数列)

因此,BigInteger 不能直接使用 + 运算符,必须通过其提供的方法进行运算。这种方式虽然稍显繁琐,但能够确保处理超大整数时的精确性和可靠性。

executorService.execute(()->{ projectDataMapper.updateProjectData(pd); });Exception in thread "pool-1-thread-11" org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: ### Error updating database. Cause: java.lang.NullPointerException ### The error may exist in file [D:\work2024\xiaom-product-admin\ruoyi-system\target\classes\mapper\system\ProjectDataMapper.xml] ### The error may involve com.ruoyi.system.mapper.ProjectDataMapper.updateProjectData ### The error occurred while executing an update ### Cause: java.lang.NullPointerException at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:96) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441) at com.sun.proxy.$Proxy109.update(Unknown Source) at org.mybatis.spring.SqlSessionTemplate.update(SqlSessionTemplate.java:288) at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:64) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:148) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) at com.sun.proxy.$Proxy147.updateProjectData(Unknown Source) at com.ruoyi.system.service.impl.LuckysheetServiceImpl.lambda$pasteSave$52(LuckysheetServiceImpl.java:2162) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: org.apache.ibatis.exceptions.PersistenceException: ### Error updating database. Cause: java.lang.NullPointerException ### The error may exist in file [D:\work2024\xiaom-product-admin\ruoyi-system\target\classes\mapper\system\ProjectDataMapper.xml] ### The error may involve com.ruoyi.system.mapper.ProjectDataMapper.upd
最新发布
03-28
### SQL 查询中 `ClassCastException` 的原因分析 当遇到错误提示 `java.lang.String cannot be cast to java.lang.Integer` 时,表明应用程序试图将字符串类型的对象强制转换为整数类型。这种异常通常发生在数据处理过程中,特别是在数据库查询结果被映射到 Java 对象时。 #### 数据库字段与实体类属性不匹配 如果数据库中的某个字段存储的是字符串形式的数据(例如 `'1'`, `'abc'`),但在对应的 Java 实体类中定义为 `Integer` 类型,则在执行查询并尝试将该字段赋值给实体类属性时会抛出此异常[^1]。 ```sql -- 假设有一个表 t_user, 其中 age 字段实际存有 '25', 而不是数值 25. SELECT * FROM t_user WHERE id = ? ``` 对于上述情况,在获取记录后将其映射至 User.java 中: ```java public class User { private Integer age; // 应用程序期望这里接收 int 或者 Integer 类型 } ``` 此时就会发生类型转换失败的情况。 ### 解决方案 为了有效解决此类问题,可以采取以下措施之一或者组合使用这些方法来确保正确性和稳定性。 #### 方法一:调整数据库设计 最根本的办法是从源头解决问题——即修改数据库结构使得各列的数据类型与其所代表的意义相吻合。比如把原本保存年龄信息却用了 VARCHAR(255) 这样的字符型改为 TINYINT/SMALLINT/MEDIUMINT/BIGINT 等适合表示数字范围内的合适类型[^2]。 #### 方法二:自定义类型处理器 另一种方式是在应用层面上通过编写自定义的 TypeHandler 来实现更灵活地控制如何解析来自 JDBC 驱动返回的结果集。MyBatis 提供了这样的机制让用户能够指定特定情况下应该如何完成从 ResultSet 到目标 POJO 属性之间的转换逻辑。 ```xml <!-- mybatis-config.xml --> <typeHandlers> <typeHandler handler="com.example.MyCustomTypeHandler"/> </typeHandlers> ``` 以及相应的 Java 文件: ```java package com.example; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class MyCustomTypeHandler extends BaseTypeHandler<String> { @Override public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException { try { ps.setInt(i, Integer.parseInt(parameter)); } catch (NumberFormatException e) { throw new RuntimeException("Failed to convert string '" + parameter + "' into integer.", e); } } @Override public String getNullableResult(ResultSet rs, String columnName) throws SQLException { return String.valueOf(rs.getInt(columnName)); } @Override public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return String.valueOf(rs.getInt(columnIndex)); } @Override public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return String.valueOf(cs.getInt(columnIndex)); } } ``` 这种方法允许开发者针对具体场景定制化处理流程而不必改变底层架构。 #### 方法三:验证输入合法性 无论何时都应该对外部传入参数做必要的校验工作以防止非法值进入系统内部引发不必要的麻烦。可以通过正则表达式或者其他手段确认待操作项确实满足预期格式后再继续后续动作;另外也可以考虑利用框架自带的功能简化这部分开发成本,如 Spring Validation 注解等工具可以帮助快速构建起一套完整的约束体系[^3]。 ### 总结 综上所述,面对 `java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer` 错误,应该先定位其产生的根源在于哪一层级出现了不当的操作行为,再依据实际情况选用合适的策略加以应对。无论是优化数据库模式还是增强业务代码健壮性都是可行的选择方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值