【问题标题】:Exception in thread “AWT-EventQueue-0” java.lang.ClassCastException error线程“AWT-EventQueue-0”中的异常 java.lang.ClassCastException 错误
【发布时间】:2017-05-30 05:48:54
【问题描述】:

当我运行一个应该从数据库下载项目的方法时,会出现以下错误:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: com.dke.ps.Tables.Item cannot be cast to com.dke.ps.Items.Item
    at com.dke.ps.Shop.Shop.loadItems(Shop.java:161)
    at com.dke.ps.Shop.Shop.init(Shop.java:122)
    at com.dke.ps.Shop.Shop.<init>(Shop.java:60)

这是我的班级 com.dke.ps.Tables.Item -

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.dke.ps.Tables;

import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;

/**
 *
 * @author michal
 */
@Entity
@Table(name = "item")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Item.findAll", query = "SELECT i FROM Item i")
    , @NamedQuery(name = "Item.findByItemid", query = "SELECT i FROM Item i WHERE i.itemid = :itemid")
    , @NamedQuery(name = "Item.findByName", query = "SELECT i FROM Item i WHERE i.name = :name")
    , @NamedQuery(name = "Item.findByDescription", query = "SELECT i FROM Item i WHERE i.description = :description")
    , @NamedQuery(name = "Item.findByIcon", query = "SELECT i FROM Item i WHERE i.icon = :icon")
    , @NamedQuery(name = "Item.findByType", query = "SELECT i FROM Item i WHERE i.type = :type")
    , @NamedQuery(name = "Item.findByPrice", query = "SELECT i FROM Item i WHERE i.price = :price")})
public class Item implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "itemid")
    private Integer itemid;
    @Column(name = "name")
    private String name;
    @Column(name = "description")
    private String description;
    @Column(name = "icon")
    private String icon;
    @Column(name = "type")
    private Integer type;
    @Column(name = "price")
    private Integer price;

    public Item() {
    }

    public Item(Integer itemid) {
        this.itemid = itemid;
    }

    public Integer getItemid() {
        return itemid;
    }

    public void setItemid(Integer itemid) {
        this.itemid = itemid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getIcon() {
        return icon;
    }

    public void setIcon(String icon) {
        this.icon = icon;
    }

    public Integer getType() {
        return type;
    }

    public void setType(Integer type) {
        this.type = type;
    }

    public Integer getPrice() {
        return price;
    }

    public void setPrice(Integer price) {
        this.price = price;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (itemid != null ? itemid.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Item)) {
            return false;
        }
        Item other = (Item) object;
        if ((this.itemid == null && other.itemid != null) || (this.itemid != null && !this.itemid.equals(other.itemid))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "com.dke.ps.Tables.Item[ itemid=" + itemid + " ]";
    }

}

还有我的 com.dke.ps.Items.Item

**
 * General class for an item containing common information sutch as id, name,
 * description, path to an icon, price and type of an item.
 * @author valecvit
 * @author koresmi1
 */
public abstract class Item
{
    /**
     * Unique id of an item.
     */
    public int itemid;
    /**
     * Name of an item.
     */
    public String name;
    /**
     * Description of an item.
     */
    public String description;
    /**
     * Relative path to item image.
     */
    public String icon;
    /**
     * Type of an item.
     */
    public int type;
    /**
     * Price of an item.
     */
    public int price;

}

我真的不知道问题出在哪里。谁能给我解释一下这个例外吗?

顺便说一句

是getDbItems()方法:

ArrayList<Item> dbItems = new ArrayList<>();

        EntityTransaction entr=em.getTransaction();
            entr.begin();
        TypedQuery<Item> query = em.createQuery("SELECT i FROM Item i", Item.class);
        dbItems = new ArrayList<Item>(query.getResultList());
        em.getTransaction().commit();

期待显示在这个:

listOfDbItems = server.getDbItems();
        listOfUsersItems = server.getPurchasedItems(user);
        dlmItems.clear();

        int numberOfItemsInDb = listOfDbItems.size();

        for (int i = 0; i < numberOfItemsInDb; i++)
        {
            dlmItems.addElement((listOfDbItems.get(i)).name);
        }

第一个类是通过持久性 - 来自数据库的实体类创建的,第二个是我创建的。如果我将数组列表更改为 ArrayList dbItems,则会引发错误:找不到适合 ArrayList 的构造函数。构造函数 ArrayList.ArrayList(int) 不适用

感谢您的帮助!

【问题讨论】:

  • 这一行“在 com.dke.ps.Shop.Shop.loadItems(Shop.java:161)”是哪一行?
  • dlmItems.addElement((listOfDbItems.get(i)).name);
  • “dlmItems”的类型是什么?什么是“(listOfDbItems.get(i)).name”返回?
  • 私有 DefaultListModel dlmItems = new DefaultListModel();而private void loadItems() { listOfDbItems = server.getDbItems(); listOfUsersItems = server.getPurchasedItems(user); dlmItems.clear(); int numberOfItemsInDb = listOfDbItems.size(); for (int i = 0; i &lt; numberOfItemsInDb; i++) { dlmItems.addElement((listOfDbItems.get(i)).name); } } 什么也不返回,它是一个 void 方法
  • 好的,所以你不明白我的问题。基本上,例外是说您尝试将“com.dke.ps.Tables.Item”转换为“com.dke.ps.Items.Item”。 “dlmItems.addElement”是String的ArrayList吗? “(listOfDbItems.get(i)).name”正在返回字符串?强制转换是一个运行时错误,而如果您将 String 添加到非 String 的 ArrayList 中,编译器会拾取。也许正在尝试调试您的代码。

标签: java


【解决方案1】:

问题是“listOfDbItems.get(i)”返回 com.dke.ps.Tables.Item 而“dlmItems”期望“com.dke.ps.Items.Item”。您应该更改 DefaultListModel dlmItems = new DefaultListModel() 以接受 com.dke.ps.Items.Item 或者在添加到 dlmItem 之前将 Tables.Item 对象转换为 Items.Item 对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-26
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多