You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何乘法运算符与BigInteger配合时抛出IllegalAccessException,其他运算符正常?

为什么BigInteger使用乘法运算符会抛出IllegalAccessException?

嘿,这个问题我之前也碰到过,咱们来好好唠唠到底是咋回事!

你提到的现象特别典型:用Kotlin处理BigInteger时,加法、减法、除法、取模甚至幂运算都能正常用运算符实现,唯独乘法(*)会抛出IllegalAccessException异常。先把你的示例代码贴出来更直观:

// 这些都能正常运行
val plus = BigInteger("10000000000000000000") + BigInteger("100") // 结果:10000000000000000100
val minus = BigInteger("10000000000000000000") - BigInteger("100") // 结果:9999999999999999900
val div = BigInteger("10000000000000000000") / BigInteger("100") // 结果:100000000000000000
val mod = BigInteger("10000000000000000000") % BigInteger("100") // 结果:0
val pow = BigInteger("10000000000000000000") ** 2 // 结果:100000000000000000000000000000000000000

// 唯独这行会抛出IllegalAccessException
val star = BigInteger("10000000000000000000") * BigInteger("100")

问题根源:运算符重载的访问权限差异

这本质是Kotlin标准库对BigInteger运算符重载的设计细节问题:

  • 加法(+)对应plus()、减法(-)对应minus()、除法(/)对应div()、取模(%)对应rem()、幂运算(**)对应pow()——这些方法都是public访问权限,外部代码可以直接调用,所以用运算符时编译器能正常映射到这些方法,不会有问题。
  • 但乘法对应的times()方法,在早期Kotlin版本中是internal访问修饰符!这个修饰符意味着它只能在Kotlin标准库内部被调用,咱们自己的代码属于外部,直接用*运算符会触发JVM的访问权限检查,从而抛出IllegalAccessException。

解决办法

有两个简单的方案可以搞定这个问题:

  1. 直接调用times()方法替代运算符:不用*,改成显式调用方法,比如:
    val star = BigInteger("10000000000000000000").times(BigInteger("100"))
    
  2. 升级Kotlin版本:在较新的Kotlin版本(大概从1.5.x之后),官方已经把BigInteger的times()方法改成public了,升级后就能正常用*运算符了。

你可以自己去查看依赖的kotlin-stdlib里的BigInteger类源码,确认times()方法的访问修饰符——如果是internal,那肯定是版本问题,升级就好;如果已经是public,那可能是项目配置的小问题,但大概率还是版本的锅。

内容的提问来源于stack exchange,提问作者Jean Bob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:52:32