【问题标题】:can't cast to integer不能转换为整数
【发布时间】:2013-08-13 19:53:40
【问题描述】:

我正在编写一个 java 程序,我想在其中使用 xmlrpc 模拟与远程过程调用的客户端-服务器关系。

但是,当我尝试远程调用该方法时,我收到以下错误消息:

'JavaClient: XML-RPC Consumer Fault #java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer'

这是客户端产生错误的方法:

public String getHashsize() {

      // Execute the remote call, using the handler
         try
     {
         argHashsize = new Vector(); //see next method for comments
         argHashsize.addElement(serverURL);

         // make the call
         String callit = ("GetSize.sendHashSize");
         sizeHash =  (Integer)client.execute(callit, argHashsize );
     }
         // Use XmlRpcException errors
         catch (XmlRpcException exception) {
             System.err.println("JavaClient: XML-RPC Consumer Fault #" +
                                Integer.toString(exception.code) + ": " +
                                exception.getCause() + "" + exception.toString());
         } catch (Exception exception) {
             System.err.println("JavaClient: XML-RPC Consumer Fault #" + exception.toString());
         }
      String StrsizeHash = Integer.toString(sizeHash); // Cast sizeHash to String
     return StrsizeHash;
     }

这是我试图调用的方法:

public String sendHashSize(String getCaller) {
        // send back info to Message Broker
        sendbackserverdata = "number of staff: " + theHashtable.noStaff()
                + "  Caller: " + getCaller
                + "  Port: " + getServerPort()
                + "  " + getSendtime();
        //Store server info in Hashtable persist - could be a database
    /*persist.put("" + theHashtable.noStaff(),"" + sendbackserverdata);
         sendServerData = sendbackserverdata;
         stats.StoreinStatsHashtable("" + theHashtable.noStaff(), sendbackserverdata);*/
        return sendbackserverdata; // return to Consumer
    }

【问题讨论】:

  • 哪一行抛出异常?

标签: java xml-rpc


【解决方案1】:

您的sendHashSize 方法返回String。它甚至不是整数的字符串表示形式——它是一个以“员工人数:”开头的字符串。

我对它因异常而失败并不感到惊讶 - 您期望它能够正常工作真是令人惊讶。结果是哪个整数?

要么更改sendHashSize 以返回int/Integer(可能是theHashtable.noStaff()?),要么避免尝试将其转换为调用方的Integer

此外,此代码具有误导性:

catch (Exception exception) {
    System.err.println("JavaClient: XML-RPC Consumer Fault #" + exception.toString());
}

不是“XML-RPC 消费者错误”——您已经在上一行中发现了这些错误。您遇到了一个例外,因为您尝试将 String 转换为 Integer... 这与 XML-RPC 层无关。

【讨论】:

  • @ReverendGonzo:是的,我知道这是他试图调用的方法。但这会返回一个字符串,不是吗?
【解决方案2】:

代替:

sizeHash =  (Integer)client.execute(callit, argHashsize );

尝试:

sizeHash =  Integer.valueOf(client.execute(callit, argHashsize ));

当然,您必须确保发送 实数 整数,否则尝试将非整数字符串转换为整数时会出现异常 (NumberFormatException)。

首选方法

sendHashSize() 方法应该返回一个 int/Integer - 然后您不必强制转换为 Integer 或使用 Integer.valueOf()

【讨论】:

  • 你看到要发回的字符串了吗?真的根本不是整数……
  • @JonSkeet 耐心,亲爱的 :) 我还没写完
  • 没有迹象表明它真的是一个整数的字符串表示......如果 OP 想要返回一个整数,他应该这样做。
  • 您的编辑仍然无法正常工作。 Integer 将如何返回 valueOf "Port:... etc.."?
  • @JonSkeet 没有任何迹象表明应该返回什么 - 我们都只是假设......我同意你的评论 - 应该返回一个整数,否则他将无法使用它...作为一个整数:)
【解决方案3】:

sendHashSize() 方法应该有以下代码:

public int sendHashSize(String getCaller)
   {
    // return to Consumer
    return theHashtable.noStaff();
   }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多