【问题标题】:How to call a specific object from a list in JAVA in calling a constructor?如何在调用构造函数时从 JAVA 列表中调用特定对象?
【发布时间】:2017-10-05 10:45:15
【问题描述】:

所以我有这个

public class Client {

    private String name;
    private List<Product> purchase = new ArrayList<Product>();

    Client (){}

    Client (String name, List<Product> purchase ){
        this.name = name;
        this.purchase = purchase;
    }

}

在 Main 我想创建一个新客户端并将其放入数据库中。

public class Main {

    public static void main(String[] args) {

        InterDao daoProduct = new ProductDAOImpl();
        Product product1 = new Product(12,"waffle","2017-05-03",5);
        Product product2 = new Product (5,"fff","2017-05-08",7);

        List<Product> products = new ArrayList<Product>();

        products.add(product1);
        products.add(product2);
        daoProduct.create(product1);

        InterDao daoClient = new ClientDAOImpl();
        Client client1 = new Client("John", product1);

        daoClient.create(client1);

    }

}

显然,

Client client1 = new Client("John", product1);

不起作用。我尝试了很多方法来调用特定产品,但都没有奏效。请给我一些想法。

这给了我这个错误:

线程“main”java.lang.Error 中的异常:未解决的编译问题: 构造函数 Client(String, Product) 未定义

【问题讨论】:

  • 我想你想要Client client1 = new Client("John", products);
  • 这样它不是underliend而是给出这个错误:Invalid argument value: java.io.NotSerializableException

标签: java list arraylist call


【解决方案1】:

要么将产品作为第二个参数传递,要么您需要更改构造函数的签名,以将第二个参数作为产品的实例。

您能否具体说明您的解决方案的意图。是在单个呼叫中为每个客户保存一个产品还是为每个客户保存产品列表?

【讨论】:

  • 我想创建客户并添加购买的特定产品。在我的数据库中,我有表产品(id、项目、数量、日期)和表客户端(产品中所有列的名称、外键)
  • 那么您只需要更改您的客户端类。实例变量应该是 Product 实例而不是列表。其次,您的构造函数应该采用两个参数 - 名称、产品。
【解决方案2】:

您必须将 List&lt;Products&gt; 传递给您的构造函数,而不是 Product 对象(实例),否则您必须将构造函数修改为:

Client (String name, Product purchase ){
    this.name = name;
    this.purchase.add(purchase);
}

【讨论】:

  • 我这样做了,但仍然给我 SQL 错误。 Invalid argument value: java.io.NotSerializableExceptionCaused by: java.io.NotSerializableException: project.Product
  • 你能告诉我'daoClient.create'函数体吗? ...而且我认为您必须检查您的 SQL INSERT 或存储过程参数
  • public void create(Client obj) { try{ Connection myConn = DriverManager.getConnection("jdbc:mysql://localhost:3306/project" , "root" , "pass"); PreparedStatement myStmt = myConn.prepareStatement("insert into client "+ "(name , cl_id, cl_item, cl_quantity,cl_date)" + " values (?,?,?,?,?)"); myStmt.setString(1, obj.getName()); myStmt.setObject(2,obj.getProduct(obj)); myStmt.executeUpdate(); System.out.println("insert complete"); } catch (Exception exc){ exc.printStackTrace(); } }
  • 缺少很多代码,所以我无法清楚地了解错误具体发生在哪里,但您必须检查该错误及其相关代码:myStmt.setObject(2, obj.getProduct (对象)); ...希望您能找到问题所在。
【解决方案3】:

您的构造函数采用 list 产品。 你必须像这样改变它:

Client (String name,Product purchase ){
    this.name = name;
    products.add(purchase);
}

【讨论】:

  • 在客户中我没有声明产品。我做了这个而不是Client (String name, Product purchase ){ this.name = name; addProduct(0, purchase); }
  • 但在 Main 我得到了这个Invalid argument value: java.io.NotSerializableException
  • 你必须在你的类产品中实现接口可序列化。你也可以看这里link
  • 我应该做一个新接口,然后产品必须实现它?
  • 不存在可序列化的接口。你只需要在你的类中实现它。
猜你喜欢
  • 1970-01-01
  • 2020-12-07
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
相关资源
最近更新 更多