【发布时间】: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.valueOf和Integer.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