黑马程序员技术交流社区

标题: 怎么还是报错呢? [打印本页]

作者: 张学东    时间: 2012-10-27 23:52
标题: 怎么还是报错呢?
  1. package com.itheima.fans;

  2. import java.lang.reflect.Constructor;
  3. import java.lang.reflect.InvocationTargetException;

  4. public class Demo4 {

  5.         /**
  6.          * 通过Class调用其他类中的构造函数 ,
  7.          * 也可以通过这种方式通过Class创建其他类的对象
  8.          */
  9.         public static void main(String[] args) {
  10.                 Class demo=null;
  11.                 try {
  12.                         demo=Class.forName("com.itheima.fans.Person");
  13.                 } catch (ClassNotFoundException e) {
  14.                         // TODO Auto-generated catch block
  15.                         e.printStackTrace();
  16.                 }
  17.                 Person per1=null;
  18.                 Person per2=null;
  19.                 Person per3=null;
  20.                 Person per4=null;
  21.                 //取得全部的构造函数
  22.                 Constructor<?> cons[]=demo.getConstructors();
  23.                  System.out.println(cons.length);
  24.                 try {
  25.                         per1=(Person)cons[0].newInstance();
  26.                         per2=(Person)cons[1].newInstance("zhangsan");
  27.                         per3=(Person)cons[2].newInstance(25);
  28.                         per4=(Person)cons[3].newInstance("zhangsan",25);
  29.                        
  30.                 } catch (IllegalArgumentException e) {
  31.                         // TODO Auto-generated catch block
  32.                         e.printStackTrace();
  33.                 } catch (InstantiationException e) {
  34.                         // TODO Auto-generated catch block
  35.                         e.printStackTrace();
  36.                 } catch (IllegalAccessException e) {
  37.                         // TODO Auto-generated catch block
  38.                         e.printStackTrace();
  39.                 } catch (InvocationTargetException e) {
  40.                         // TODO Auto-generated catch block
  41.                         e.printStackTrace();
  42.                 }
  43.                 System.out.println(per1);
  44.                 System.out.println(per2);
  45.                 System.out.println(per3);
  46.                 System.out.println(per4);
  47.                

  48.         }

  49. }
  50. class Person{
  51.         private String name;
  52.         private int age;
  53.         public Person() {
  54.     }

  55.     public Person(String name){
  56.         this.name=name;
  57.     }

  58.     public Person(int age){

  59.         this.age=age;

  60.     }

  61.     public Person(String name, int age) {

  62.         this.age=age;

  63.         this.name=name;}
  64.         public String getName() {
  65.                 return name;
  66.         }
  67.         public void setName(String name) {
  68.                 this.name = name;
  69.         }
  70.         public int getAge() {
  71.                 return age;
  72.         }
  73.         public void setAge(int age) {
  74.                 this.age = age;
  75.         }
  76.         public String toString(){
  77.                 return "["+this.name+" "+this.age+"]";
  78.         }
  79. }
复制代码

作者: 张学东    时间: 2012-10-28 11:30
怎么就沉了呢??
作者: 张学东    时间: 2012-10-28 16:53
..............
作者: 徐升兴    时间: 2012-10-28 17:14
本帖最后由 徐升兴 于 2012-10-28 17:18 编辑


从提示中可以看出,第一个错误是因为找不到你所要获取的字节码的类
第二个错误是是说空指针异常,先不要管
所以要改一下15行的demo=Class.forName("com.itheima.fans.Person");
把前面的包名去掉

修改完这个之后,你会发现编译没错了,但是运行会报异常
异常的意思是传入了错误的参数列表,也就是你创建对象的时候传入参数错误

作者: 李靖    时间: 2012-10-28 20:21
for(Constructor constructor:cons){
                        System.out.println(constructor);
                }
可以查看构造方法顺序是:
public Person()
public Person(java.lang.String,int)
public Person(int)
public Person(java.lang.String)
就可以发现你的构造方法的传参错了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2