A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 丁岩 中级黑马   /  2012-9-26 07:37  /  2992 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 丁岩 于 2012-9-26 08:15 编辑

我写了这样的一段代码为了测试Clone,但是在BookCollection上面确不知道为什么出现了空指针异常的情况,求解这是为什么,尤其请大家注意划颜色的这一段
  1. package Mych1;

  2. public class CloneMe {


  3. public static void main(String[] args)
  4. {
  5. Book c=new Book();
  6. Book b=(Book) new Book(21,"ss","tt").clone();//试试我做的book类的复制
  7. System.out.println(b.getID());
  8. System.out.println(b.getISBN());
  9. c=(Book)b.clone();
  10. System.out.println(c.getID());
  11. System.out.println(c.getISBN());
  12. BookCollection b1=new BookCollection(10);//试图复制BookCollection,但是出错了
  13. BookCollection b2=(BookCollection)b1.clone();
  14. for(int i=0;i<10;i++)
  15. {
  16. System.out.println(b2.getBooks()[i].getID());
  17. }
  18. if(b1==null)
  19. System.out.println("null");
  20. else
  21. System.out.println(b1.getBooks()[0].getID());
  22. }

  23. }
  24. class BookCollection implements Cloneable
  25. {
  26. private int number;
  27. private Book[]books=null;
  28. public BookCollection()
  29. {

  30. }
  31. public BookCollection(int number)//用对象数组,构造BookCollection,这里故意没有用集合,就是想试试
  32. {
  33. this.number=number;
  34. for(int i=0;i<number;i++)
  35. {
  36. books[i]=new Book(i+1);
  37. }
  38. }

  39. public Object clone()//重写clone函数
  40. {
  41. BookCollection re=new BookCollection();
  42. for(int i=0;i<number;i++)
  43. {
  44. re.books[i]=(Book)books[i].clone();
  45. }
  46. return re;

  47. }

  48. public Book[] getBooks()//获取books数组
  49. {
  50. return books;
  51. }


  52. }

  53. class Book implements Cloneable//图书类
  54. {
  55. private int ID;
  56. private String ISBN;
  57. private String title;
  58. public Book()
  59. {

  60. }
  61. public Book(int ID)
  62. {
  63. this.ID=ID;
  64. }
  65. public Book(int ID,String ISBN,String title)
  66. {
  67. this.ID=ID;
  68. this.ISBN=ISBN;
  69. this.title=title;
  70. }

  71. public int getID()//获取ID
  72. {
  73. return ID;
  74. }

  75. public String getISBN()//获取ISBN
  76. {
  77. return ISBN;
  78. }

  79. public String gettitle()//获取主题
  80. {
  81. return title;
  82. }


  83. public Object clone()//重写clone函数
  84. {
  85. Object obj=null;
  86. obj=new Book(ID,ISBN,title);
  87. try {
  88. obj=super.clone();
  89. } catch (CloneNotSupportedException e) {
  90. // TODO Auto-generated catch block
  91. e.printStackTrace();
  92. }
  93. return (Book)obj;
  94. }
  95. }
复制代码

11 个回复

倒序浏览
大哥,写代码的时候加点注释啊,看的好累啊!
回复 使用道具 举报
re.books=(Book)books.clone();这句有错哦应该写成 re.books[i]=(Book)books[i].clone();还有上一句
books=new Book(i+1);应该写成books【i】=new Book【i】(i+1);哥们儿你太粗心了

  
回复 使用道具 举报
史龙贤 发表于 2012-9-26 07:54
大哥,写代码的时候加点注释啊,看的好累啊!

package Mych1;

public class CloneMe {


        public static void main(String[] args)
        {
        Book c=new Book();
                Book b=(Book) new Book(21,"ss","tt").clone();//试试我做的book类的复制
    System.out.println(b.getID());
    System.out.println(b.getISBN());
    c=(Book)b.clone();
    System.out.println(c.getID());               
    System.out.println(c.getISBN());
    BookCollection b1=new BookCollection(10);//试图复制BookCollection,但是出错了
    BookCollection b2=(BookCollection)b1.clone();
    for(int i=0;i<10;i++)
    {
    System.out.println(b2.getBooks().getID());
    }
    if(b1==null)
            System.out.println("null");
    else
    System.out.println(b1.getBooks()[0].getID());
        }

}
class BookCollection implements Cloneable
{
        private int number;
        private Book[]books=null;
        public BookCollection()
        {
               
        }
        public BookCollection(int number)//用对象数组,构造BookCollection,这里故意没有用集合,就是想试试
        {
                this.number=number;
                for(int i=0;i<number;i++)
                {
                        books=new Book(i+1);
                }
        }
       
        public Object clone()//重写clone函数
        {
                BookCollection re=new BookCollection();
                for(int i=0;i<number;i++)
                {
                        re.books=(Book)books.clone();
                }
                return re;
               
        }
       
        public Book[] getBooks()//获取books数组
        {
                return books;
        }
       
       
}

class Book implements Cloneable//图书类
{
        private int ID;
        private String ISBN;
        private String title;
        public Book()
        {
               
        }
        public Book(int ID)
        {
                this.ID=ID;
        }
        public Book(int ID,String ISBN,String title)
        {
                this.ID=ID;
                this.ISBN=ISBN;
                this.title=title;
        }
       
        public int getID()//获取ID
        {
                return ID;
        }
       
        public String getISBN()//获取ISBN
        {
                return ISBN;
        }
       
        public String gettitle()//获取主题
        {
                return title;
        }
       
       
        public Object clone()//重写clone函数
        {
             Object obj=null;
            obj=new Book(ID,ISBN,title);
            try {
                        obj=super.clone();
                } catch (CloneNotSupportedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
            return (Book)obj;
        }
}
回复 使用道具 举报
柳彬 发表于 2012-9-26 08:10
re.books=(Book)books.clone();这句有错哦应该写成 re.books=(Book)books.clone();还有上一句
books=new B ...

==啊,我写了,怎么没粘贴上去啊
回复 使用道具 举报
柳彬 发表于 2012-9-26 08:10
re.books=(Book)books.clone();这句有错哦应该写成 re.books=(Book)books.clone();还有上一句
books=new B ...

我这次用插入代码的形式,粘贴上去的,应该不会给我粘漏了吧
回复 使用道具 举报
史龙贤 黑马帝 2012-9-26 08:20:18
7#
复写Object类中的clone方法时,new一个对象, 然后main中通过对象调用该方法时,又来一对象,两对象吗?我感觉是这样 ,代码比较凌乱,看的头大,麻烦解释一下吧!
回复 使用道具 举报
史龙贤 黑马帝 2012-9-26 08:23:04
8#
起的太早,困,小咪一会,晚点上来看结果,看这个代码看了10分钟脑子疼,抱歉
!!
回复 使用道具 举报
丁岩 中级黑马 2012-9-26 08:26:51
9#
史龙贤 发表于 2012-9-26 08:20
复写Object类中的clone方法时,new一个对象, 然后main中通过对象调用该方法时,又来一对象,两对象吗?我感觉 ...

我是这么想的,在BookCollecrion中,新建一个图书集合类变量,然后将他设置成与当前图书信息相同的形式,然后返回这个BookCollection re,里面用的books.clone()方法,是我在Book类中重写的clone方法,经过main方法前面的输出,可以得出,我重写的clone方法可以达到复制的作用。最后在主函数中是定义一个新对象,将这个返回的值赋予它。不矛盾啊
回复 使用道具 举报
System.out.println(b2.getBooks().getID());  告诉我这句话:b2.getBook()返回什么类型
回复 使用道具 举报
books=new Book(i+1);
是不是这样books=new Book[(i+1)];
回复 使用道具 举报
我来了,怎么解决的,讲讲你的思路啊,我也学学啊!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马