Java连接MySQL查询返回<包名>.<类>@哈希码及增删改功能异常求助
问题1:界面显示java2assignment3.DVD@5e0010bc类格式内容
这不是乱码,是你直接把DVD对象塞入界面展示组件时,Java默认调用Object类原生toString()方法输出的对象内存地址格式,核心原因是你没有在DVD类中重写toString()方法。
解决方法:在DVD类中添加重写的toString方法,自定义要展示的内容即可,示例如下:
@Override public String toString() { // 可根据需求调整展示格式,比如显示标题+年份+收藏标记 return title + " (" + year + ")" + (favourite ? " ★" : ""); }
修改后界面就会显示你定义的字符串内容,而非对象内存地址。点击对象时后缀变化是因为每次加载数据都会生成新的DVD对象,内存地址自然会随之更新。
问题2:IDE提示sql变量从未被读取
你的条件判断逻辑存在语法错误:两个if是独立判断逻辑,不是if-else链式结构。
原代码逻辑:
if (sortOrder==1) { sql = "SELECT * FROM dvds ORDER BY title"; } // 此处为全新独立if判断,不是else if if (sortOrder==2) { sql = "SELECT * FROM dvds ORDER BY dvds.id"; } else { sql = "SELECT * FROM dvds ORDER BY dvds.year"; }
当sortOrder等于1时,第一个if会给sql赋值,但第二个if判断1不等于2,会直接走else分支把sql重新覆盖为年份排序的语句。IDE的数据流分析判定第一个if中给sql赋的值永远会被后续逻辑覆盖,因此提示赋值的sql从未被读取。
解决方法:把第二个if修改为else if即可:
if (sortOrder==1) { sql = "SELECT * FROM dvds ORDER BY title"; } else if (sortOrder==2) { sql = "SELECT * FROM dvds ORDER BY dvds.id"; } else { sql = "SELECT * FROM dvds ORDER BY dvds.year"; }
额外优化点:你在try块中已经调用了closeConnection(conn),finally块又重复调用了一次关闭连接的逻辑,直接删除try块中的关闭连接代码即可,finally块会不管是否出现异常都执行关闭逻辑,不会漏关连接。
问题3:新增DVD失败返回报错、编辑删除功能不可用
新增DVD走报错分支是因为service.addDVD(newDVD)返回了null,排查方向如下:
- 先在
addDVD方法的catch块中添加ex.printStackTrace()打印异常栈,就能看到具体报错原因,大概率是数据库字段约束不满足,比如必填字段为空、主键重复、字段类型/长度不匹配。 - 确认插入数据后是否正确返回了生成的DVD对象,比如插入后有没有把自增主键id赋值给返回的DVD实例,有没有直接返回null的逻辑。
编辑、删除功能不可用和第一个问题直接相关:界面展示的是对象地址,选中逻辑无法把显示内容和对应的DVD实体做匹配,改完toString()的问题后,给列表组件的选中逻辑绑定实际的DVD对象而非显示字符串,就能正常选中操作了。
内容的提问来源于stack exchange,提问作者crab_attack
相关产品推荐
相关产品推荐

