【问题标题】:BigInteger throws numberFormatExceptionBigInteger 抛出 numberFormatException
【发布时间】:2020-06-12 09:38:10
【问题描述】:

编辑: 用下面的代码解决了这个问题:

    String tokenId="0x1800000000001289000000000000000000000000000000000000000000000000";

    BigInteger token1;
    if (tokenId.startsWith("0x")){
        token1=new BigInteger(tokenId.substring(2),16);

我有一个长字符串,我需要将其分配为 BigInteger 并将其传递给 Web3j 库的另一个方法。但是,我一直收到数字格式异常。有什么帮助吗?

下面是抛出异常的方法:

public void getBalance1155(String walletAddress) throws ExecutionException, InterruptedException {

    //define constant values

    Web3j web3j=Web3j.build(new HttpService("https://mainnet.infura.io/v3/<apiKey>>"));
    String contractAddress = "0xfaaFDc07907ff5120a76b34b731b278c38d6043C";
    BigInteger tokenId=new BigInteger("0x1800000000001289000000000000000000000000000000000000000000000000",16);
    NoOpProcessor processor = new NoOpProcessor(web3j);
    Credentials credentials = Credentials.create("privatekey");
    TransactionManager txManager = new FastRawTransactionManager(web3j, credentials, processor);

    //Query Blockchain to get balance of WALLETADDRESS from Contract for given TokenID

    ERC1155 token = ERC1155.load(contractAddress, web3j, txManager, DefaultGasProvider.GAS_PRICE, DefaultGasProvider.GAS_LIMIT);
    RemoteCall<BigInteger> sendCall = token.balanceOf(walletAddress, tokenId);
    BigInteger balance=sendCall.sendAsync().get();
    log.info("balance >>>>>> " +balance);
}

这里是例外:

java.lang.NumberFormatException:对于输入字符串:“0x1800000000001289000000000000000000000000000000000000000000000000” 在 java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 在 java.base/java.lang.Long.parseLong(Long.java:692) 在 java.base/java.lang.Long.parseLong(Long.java:817)

【问题讨论】:

  • 我认为你需要删除0x

标签: java biginteger web3-java


【解决方案1】:

从字符串中删除无关的0x

BigInteger's constructor 的文档说

字符串表示由一个可选的减号或加号组成,后跟指定基数的一个或多个数字序列。

[...] 字符串不能包含任何无关字符

没有提到像 0x (或 0 八进制)这样的前缀。

【讨论】:

  • 问题是,如果我删除 0x,我正在与之交互的智能合约不会识别它。这导致区块链的余额为 0,即使有足够的余额。另一个限制是智能合约只接受 BigInteger 作为输入。
  • 数字就是数字。如果需要BigInteger,则基数无关紧要。仅在谈论字符串时才重要。
  • 已修复。不确定这是否是正确的做法。但它现在有效!用解决方案编辑了我的问题。感谢您的帮助。
【解决方案2】:

您需要删除0x,您可以在BigInteger 上使用toString(16) 检索十六进制值

BigInteger tokenId=new BigInteger("1800000000001289000000000000000000000000000000000000000000000000",16);
System.out.println("tokenId.toString(16) = " + tokenId.toString(16));
System.out.println("tokenId.toString(10) = " + tokenId.toString(10));

String originalString = "0x" + tokenId.toString(16);
System.out.println("originalString = " + originalString);

输出:

tokenId.toString(16) = 1800000000001289000000000000000000000000000000000000000000000000
tokenId.toString(10) = 10855508365998423105807514254364715762064874182780947284375732482585619595264
originalString = 0x1800000000001289000000000000000000000000000000000000000000000000

【讨论】:

    【解决方案3】:

    由于您已经在使用 web3j,您可以使用 Numeric.decodeQuantity("0x1800000000001289000000000000000000000000000000000000000000000000") 将十六进制解码为 BigInteger

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-29
      • 1970-01-01
      • 1970-01-01
      • 2017-12-31
      • 1970-01-01
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多