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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 leoliao2008 于 2016-2-19 01:52 编辑

题目:学校有三个选修科目,每个科目学分都一不一样。如何根据科目名称自动初始化对应学分?我首先建立一个选修科目的类,含科目名称、科目学分等属性:
  1. package D16_2_2;

  2. public class Course {
  3.         private String name;
  4.         //高等数学 5分  线性数学3 离散数学4
  5.         private int score=name.equals("高等数学")?5:((name.equals("线性数学"))?3:(name.equals("离散数学")?4:0));
  6.         public String getName() {
  7.                 return name;
  8.         }
  9.         public void setName(String name) {
  10.                 this.name = name;
  11.         }
  12.         public Course(String name) {
  13.                 super();
  14.                 this.name = name;
  15.         }
  16.         @Override
  17.         public String toString() {
  18.                 return "Course [name=" + name + ", score=" + score + "]";
  19.         }
  20.        
  21. }
复制代码

然后在同一目录下新建主函数:
  1. package D16_2_2;

  2. public class Go {
  3.         public static void main(String[] args) {
  4.                 //高等数学 5分  线性数学3 离散数学4
  5.                 Course gd=new Course("高等数学");
  6.                 Course xx=new Course("线性数学");
  7.                 Course ls=new Course("离散数学");
  8.                 System.out.println(gd.toString());
  9.                

  10.         }

  11. }
复制代码

运行后显示:Exception in thread "main" java.lang.NullPointerException
提示是private int score=name.equals("高等数学")?5:((name.equals("线性数学"))?3:(name.equals("离散数学")?4:0));
这一行有误。但改了又改,只要调用的是.equals()都不行。找不出什么原因,麻烦谁告知下。

评分

参与人数 1技术分 +1 收起 理由
洋葱头头 + 1 赞一个!

查看全部评分

9 个回复

倒序浏览
这里刚好涉及在内存中如何创建对象,因为Course gd=new Course("高等数学");创建步骤如下:
1.声明一个Courese类引用gd
2.在方法区加载Course字节码
3.在堆内存创建一个new Course对象
4.对象默认初始化
5.对象显示初始化
6.加载构造方法,进行初始化
7.将对象地址赋值给gd
所以你可以发现默认初始化后 name=null.再显示初始化score,所有就变成空指针异常,这种情况最好
把这行放到构造函数里面区
  1. class Course {
  2.     private String name;
  3.     private int score;
  4.     //高等数学 5分  线性数学3 离散数学4
  5.     public String getName() {
  6.             return name;
  7.     }
  8.     public void setName(String name) {
  9.             this.name = name;
  10.     }
  11.     public Course(String name) {
  12.             super();
  13.             this.name = name;
  14.             score=name.equals("高等数学")?5:((name.equals("线性数学"))?3:(name.equals("离散数学")?4:0));
  15.     }
  16.     @Override
  17.     public String toString() {
  18.             return "Course [name=" + name + ", score=" + score + "]";
  19.     }
  20.    
  21. }
复制代码

评分

参与人数 1黑马币 +2 收起 理由
洋葱头头 + 2

查看全部评分

回复 使用道具 举报
这个问题是因为你没有将初始化的数据放到构造函数里。初始化一个对象需要调用构造函数。平时所见的形式,
Course gd=new Course(),在你的对象类里有一个默认的构造函数 public Course(String name) {  }是看不见的,但它是存在的。所以当你需要初始化某些数据时,需要手动创建一个带参数的构造函数。

评分

参与人数 1黑马币 +1 收起 理由
洋葱头头 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 leoliao2008 于 2016-2-19 17:59 编辑
j6819236 发表于 2016-2-19 09:25
这里刚好涉及在内存中如何创建对象,因为Course gd=new Course("高等数学");创建步骤如下:
1.声明一个Cour ...

谢谢!说得很详细!
回复 使用道具 举报
heimagirls 发表于 2016-2-19 10:22
这个问题是因为你没有将初始化的数据放到构造函数里。初始化一个对象需要调用构造函数。平时所见的形式,
C ...

我已经重写了public Course(String name){},系统还会再生成一个相同名称和构造的方法么?
回复 使用道具 举报
leoliao2008 发表于 2016-2-19 11:59
我已经重写了public Course(String name){},系统还会再生成一个相同名称和构造的方法么? ...

有的哦,它本身就自带了一个不带参数的构造函数,要是需要初始化数据,就要重写一个带参数的构造函数。
回复 使用道具 举报
本帖最后由 leoliao2008 于 2016-2-19 13:13 编辑
heimagirls 发表于 2016-2-19 12:42
有的哦,它本身就自带了一个不带参数的构造函数,要是需要初始化数据,就要重写一个带参数的构造函数。 ...

因为先前已经重写了        public Course(String name) {                super();
                this.name = name;
        }

如果现在系统又自动生成一个空的
        public Course(String name) {

        }
那么调用的使用系统怎么分辨该用哪个呢?
回复 使用道具 举报
leoliao2008 发表于 2016-2-19 13:09
因为先前已经重写了        public Course(String name) {                super();
                this.name = name;
        }

你写的那个是带参数的,参数就是name.无参的那个你不用管它就好了,它的形式是public Course(){}这样的。这是系统带的,你写出来也行,不写也无所谓哦。就是想告诉你这个无参构造函数是你new对象的条件。之所以能new就是因为系统有了这个函数了。你这样new    Course co = new Course();就是靠那个无参的构造函数的。但是因为现在你有了参数name.也就是Course co = new Course('数学');那你就一定要重写一个带参数的构造函数,把那个name放进去。。。表达能力不好不知道你看得懂不。。
回复 使用道具 举报
toukya 中级黑马 2016-2-19 15:13:28
9#
把报错的代码放入到getScore()方法里面
回复 使用道具 举报
heimagirls 发表于 2016-2-19 14:48
你写的那个是带参数的,参数就是name.无参的那个你不用管它就好了,它的形式是public Course(){}这样的。 ...

谢谢!讲得很清楚了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马