Java修改List<Media>中元素available属性报错及属性不更新问题
问题原因及修复方案
你遇到的所有报错和不符合预期的情况由4处错误共同导致:
- 对List的set方法理解错误:
List<Media>的set方法签名为set(int index, Media element),要求第二个参数必须是Media类型对象,你传入boolean值必然触发类型不匹配错误,该场景不需要调用set方法,直接修改遍历得到的Media对象属性即可。 - 错误使用固定索引操作列表:你当前从文件加载的列表总长度只有2,合法索引仅为
0、1,硬编码list.get(5)必然触发索引越界。且你在遍历中已经拿到了匹配ID的Media对象,完全不需要通过索引获取对象。 - 属性修改逻辑顺序错误:你先调用
toString()打印了对象当前状态,再修改available属性,输出的自然还是修改前的true。 - setAvailable方法逻辑错误:你写的setAvailable方法忽略了传入参数,硬编码赋值为false,不符合setter方法的通用设计。
第一步:修正Media类的setter、getter方法
// 替换你原来的setAvailable方法 public void setAvailable(boolean available) { this.available = available; } // 确保你已经实现了对应的getter方法 public boolean isAvailable() { return this.available; }
第二步:修正rentMedia方法逻辑
public void rentMedia(int id) { for(Media mediaById : list ) { if(mediaById.getId() == id) { if(mediaById.isAvailable()) { // 先修改属性,再打印输出 mediaById.setAvailable(false); System.out.println("media successfully rented out "); System.out.print(mediaById.toString()); } else { System.out.println("Media with id="+id+" is not available for rent "); } // 匹配到对应ID的对象后直接终止遍历,节省性能 break; } } }
修改完成后即可实现租赁后available字段自动变为false的需求,同时不会再触发索引越界、类型不匹配等错误。
内容的提问来源于stack exchange,提问作者James Connigan
相关产品推荐
相关产品推荐

