- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个类的深拷贝。这是我尝试复制的类,最后一个方法是复制方法:
import java.util.ArrayList;
import java.util.List;
public class catalog implements Cloneable{
List<product> cat = new ArrayList<>();
int counter;
final int capacity = 2;
public void addProduct(product x){
cat.add(x);
}
public void addProduct(String name, int id, int price, int stock) throws Exception{
for(int i = 0; i < cat.size(); i++){
product temp = cat.get(i);
if(temp.name == name){
temp.stock = temp.stock + stock;
return;
}
if(temp.id == id){
System.out.println("Product with this ID already exists");
return;
}
}
if(cat.size() >= capacity){
//throw new customException("Not enough capacity");
throw new customException();
}
product temp = new product();
temp.name = name;
temp.id = id;
temp.price = price;
temp.stock = stock;
cat.add(temp);
}
public void showSelection(){
for(product temp : cat){
System.out.println("Product " + temp.name + " ID: " + temp.id
+ " Price: " + temp.price + " In stock: " + temp.stock);
}
}
public void removeFromStock(String name){
for(int i = 0; i < cat.size(); i++){
product temp = cat.get(i);
if(temp.name == name){
temp.stock = temp.stock - 1;
cat.set(i, temp);
}
}
}
public Object clone(){
catalog b = new catalog();
for(int i = 0; i <= cat.size(); i++){
product temp, temp1;
temp1 = cat.get(i);
temp = (product)temp1.clone();
b.addProduct(temp);
}
return b;
}
}
这是主要内容:
public class testMoney {
public static void main(String[] args) {
automatasklase test = new automatasklase();
test.addMoney(50);
System.out.println(test.getMoney());
product cola = new product();
cola.id = 1;
cola.price = 2;
cola.name = "Cola";
productsExpire Milk = new productsExpire();
Milk.name = "Milk";
Milk.id = 2;
Milk.price = 10;
Milk.stock = 10;
Milk.isExpired = true;
catalog menu = new catalog();
menu.addProduct(cola);
menu.addProduct(Milk);
menu.showSelection();
try{
menu.addProduct("Pepsi" ,3, 5, 108);
}catch(Exception e){
System.out.println("Exception occured = " +e);
}
try {
menu.addProduct("Cola", 1, 3, 7);
} catch (Exception e) {
System.out.println("Exception occured = " + e.getMessage());
}
menu.showSelection();
test.buyProduct(menu, 2);
System.out.println(test.getMoney());
menu.showSelection();
Milk.isAvailable();
product copyy = (product)cola.clone();
System.out.println("-------------");
System.out.println(cola.id + cola.name + cola.price + cola.stock);
System.out.println(copyy.id + copyy.name + copyy.price + copyy.stock);
// BELOW THE PROBLEM OCCURS!!!
catalog newtest = (catalog) menu.clone();
// ABOVE THE IS THE PROBLEM!!!!
}
}
问题如下:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at AutomatasA.catalog.clone(catalog.java:58)
at AutomatasA.testMoney.main(testMoney.java:46)
您会注意到,我已经在目录本身的克隆方法中克隆了产品类对象,但是您可能会注意到主类已经对其进行了测试并且它可以工作,因此类产品的克隆成功了。
你能看出问题所在吗?我知道还会有很多编码礼仪的小错误,也许还有更简单的做事方法,但我只是一个初学者。我必须实现深度复制,它必须有意义,所以克隆产品类是不够的,我想创建一种克隆整个目录的方法,所以如果机器要更换为更新的机器,你就可以使用该方法。
顺便说一下,整个项目正在为虚拟小吃机创建一个代码,就像你输入钱,按你想要的项目的数字,然后得到它的代码一样。
感谢您的帮助!
最佳答案
您的异常是由这一行引起的:
for(int i = 0; i <= cat.size(); i++){
应该是
for(int i = 0; i < cat.size(); i++){
但是你真的不应该像那样实现你自己的深度克隆。如果您想要一个副本,请为其创建一个单独的方法,或一个复制构造函数。
关于java - 克隆与仅仅赋值有何不同(为什么要费心实现 Cloneable 接口(interface))?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37288137/
我正在从 C++ 迁移到 Java,并认为自己是 Java 菜鸟。我最近一直在查看一个庞大的代码库,其中有几个类型的示例 public class Myclass implements Cloneab
class MyCls implements Cloneable { @Override protected MyCls clone() throws CloneNotSupportedExc
public class test implements Cloneable { @Override public test clone() { return (tes
class MyCls implements Cloneable { @Override protected MyCls clone() throws CloneNotSupportedExc
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
我有一个非常简单的问题(我猜!)Cloneable接口(interface)如何保护clone方法,而接口(interface)只能声明public方法? 最佳答案 Cloneable是 marker
我必须克隆一个没有实现 Cloneable 接口(interface)的对象,该怎么做。 实际上,在我的项目中,我正在使用 JCChart。现在我的类扩展了 MultiChart,我必须创建类的深拷贝
我的框架处理任何类的域对象。我需要能够浅克隆这样的域对象实例 foo,就好像它实现了 Cloneable(它没有实现)并且我调用了 Object.clone () 返回一个浅克隆。 不起作用的东西:
我已经阅读了 Object 和 Cloneable 的 javadoc,只是没有“得到”一些东西。有人可以向我解释以下两个示例的性能和/或功能差异吗: public class Widget {
假设我有这个类: public abstract class AbstractFoo implements Cloneable { public abstract Object clone()
我正在读这个answer他提到了一个link ,作者解释了为什么我们不应该使用 Cloneable。但是,仍然怀疑那里所说的内容 If I have an array of Cloneable, yo
嘿,我实际上正在使用 Java 上的自定义 Vector 类, public class Vector { private double X; private double Y;
public class Color { String color; Color(String color) { this.color=color; } } publi
在尝试克隆可变集合时,我最初的方法是对 mutable.Cloneable 特征使用 clone() 方法。但是,这取决于创建引用副本的 java.Object.clone 实现,而不是深拷贝。通过测
我不明白为什么我们不能执行以下操作: interface MyInterface extends Cloneable {} class myClazz implements MyInterface {
在尝试克隆可变集合时,我最初的方法是对 mutable.Cloneable 特征使用 clone() 方法。但是,这取决于创建引用副本的 java.Object.clone 实现,而不是深拷贝。通过测
这个问题在这里已经有了答案: Java: Rationale of the Cloneable interface (5 个回答) Why is Cloneable not deprecated? (
为什么我们不能将 Cloneable 作为抽象类而不是将其作为接口(interface)? 最佳答案 Java不支持类的多重继承。 如果Cloneable(其中抽象类)您强制整个对象树可克隆或不可克隆
要克隆类的对象,我们实现 Cloneable 接口(interface),并重写克隆方法: protected Object clone() throws CloneNotSupportedExcep
为什么以下代码在 JDK7 中抛出 CloneNotSupportedException 而在 JDK6 中不抛出? public class DemoThread extends Thread im
我是一名优秀的程序员,十分优秀!