【问题标题】:java: unable to cast an Integer object to Stringjava:无法将整数对象转换为字符串
【发布时间】:2018-05-02 16:57:28
【问题描述】:

我正在尝试从下面的方法“addClient”中的“数据”数组中连接一个名为“update”的字符串变量中的多个对象:

public int addClient(Object[] data) {

    try {

            if (((String)data[0]).trim().isEmpty() || ((String)data[1]).trim().isEmpty() || ((int)data[2] < 0) || ((int)data[3] <= 0)) {
                return StatusBar.ERR_INVALID_INPUT_CODE;
            }

            // the line below is causing the exception
            String update = "INSERT INTO Client VALUES(" + ((String)data[0]).trim() + "," + ((String)data[1]).trim() + "," + ((Integer)data[3]).intValue() + "," + ((Integer)data[4]).intValue() + "," + ((Boolean)data[2]).booleanValue() + "," + ((String)data[5]).trim() + ")";

            if (statement.executeUpdate(update) != 1) {
                return StatusBar.ERR_INTERNAL_CODE;
            }
     }

     catch (Exception e) {

            e.printStackTrace();

            return StatusBar.ERR_INTERNAL_CODE;
     }

     return StatusBar.ERR_SUCCESS_CODE;
}

但是当上面的代码执行时;引发异常并显示以下消息:

java.lang.ClassCastException: java.lang.Integer 无法转换为 java.lang.String 在 Model.addClient(Model.java:43)

'data'对象数组通过以下方法的调用获得:

public Object[] getFields() {
                return new Object[]{jTextFieldName.getText(), jTextFieldAddress.getText(),
                                    jComboBoxType.getSelectedIndex(),
                                    jSpinnerPhone.getValue(), jSpinnerFax.getValue(),
                                    jTextFieldWebsite.getText()};
        }

我做了很多搜索,尝试了很多方法,包括String.valueOfInteger.toString,但都没有成功..

为什么我会出现这种行为?怎么解决?

【问题讨论】:

  • 出现这种行为是因为在第 43 行,您尝试将整数转换为字符串。由于 Integer 不是 String,因此它会失败。我会彻底改变设计并停止传递对象数组。相反,传递具有命名和类型属性的定义明确的类的实例。每行放置一条指令,并使用调试器,将有助于发现问题。
  • @JBNizet 即使System.out.println(data[4].toString()); 也会导致相同的异常。我更新了问题以解释数据数组的构造方式。
  • 在进行强制转换并获得异常之前,最好检查一下您的对象是否实际上是一个字符串。您可以使用instanceof 操作符
  • 不,它没有。没有办法在对象上调用 toString() 会导致 ClassCastException 像你所拥有的那样。同样,停止使用 Object[] 来存储您的信息。创建一个具有名称、地址、号码、电话、传真和网站属性的类。传递此类的实例而不是 Object[]。
  • @JBNizet 感谢您的建议,现在通过使用已定义类的实例,事情变得更加简单。但是我注意到openjdk javac编译器不会重新编译类,除非我rm *.class .. 所以我认为类型转换问题实际上是由编译器无法检测到代码更新引起的。

标签: java object types casting type-conversion


【解决方案1】:

你有很多选择转换为字符串。
您选择了“简单”选项,该选项仅在对象确实是字符串时才有效,您只需将其(从对象)向下转换为字符串。

尝试使用以下选项之一:

  • 新字符串 (your-Integer-here);
  • (your-Integer-here).toString();
  • (your-Integer-here) + "";

让我知道它现在是否正常工作:)

【讨论】:

    【解决方案2】:

    data 数组的元素可以是任何引用类型。因此,如果不先检查它们的类型,就不能将它们转换为 String

    幸运的是,您可以直接调用他们的 toString 方法。

    改变

    ((String)data[0])
    

    data[0].toString()
    

    【讨论】:

    • System.out.println(data[4].toString()); 导致相同的异常
    • @Kais 我很难相信(除非data[4] 是一个类的实例,其toString 实现尝试将一些Integer 转换为String)。
    • 我更新了问题是为了解释数据数组是如何构造的。你怎么看?
    • @Kais 也许您没有运行您认为正在运行的代码。确保您的代码在最新更改后通过编译。
    • 我注意到openjdk javac编译器不会重新编译类,除非我rm *.class .. 所以我认为类型转换问题实际上是由于编译器无法检测到代码造成的更新。
    【解决方案3】:

    您可以在对象上调用.toString() 方法,而不是强制转换为字符串,如果这是您的意图。

    你正在投射你的对象

    if (((String)data[0]).trim().isEmpty() || ((String)data[1]).trim().isEmpty() || ((int)data[2] &lt; 0) || ((int)data[3] &lt;= 0))

    if (data[0].toString().trim().isEmpty() || (data[1].toString().trim().isEmpty() || ((int)data[2] &lt; 0) || ((int)data[3] &lt;= 0))

    假设data[3]data[2] 是整数类型。

    *PS:您还可以记录值,以确保值是什么。

    【讨论】:

      【解决方案4】:

      你可以试试下面的方法,告诉我结果如何。

      private static void concater(){
          String[] data={"abc","def","23","45","true","xyz"};
      
          String update = "INSERT INTO Client VALUES(" + ((String)data[0]).trim() + "," + ((String)data[1]).trim() + "," + Integer.parseInt(data[2]) + "," +
          Integer.parseInt(data[3]) + "," + Boolean.parseBoolean(data[4]) + "," + ((String)data[5]).trim() + ")";
      
          System.out.println(update);  //INSERT INTO Client VALUES(abc,def,23,45,true,xyz)
      
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-28
        • 2012-10-22
        • 1970-01-01
        相关资源
        最近更新 更多