为了账号安全,请及时绑定邮箱和手机立即绑定

java创建对象问题

/ 猿问

java创建对象问题

半度幽殇 2017-07-02 14:17:20
public class Yuanzhu {
	public static void main(String args[]){
		Circle cir=new Circle(2);
		Volume vol=new Volume(cir,5);
	}
}

class Circle{
	double radius;
	public Circle(double r){
		radius=r;
	}
	double getArea(){
		return 3.14*radius*radius;
	}
}

class Volume{
	double heigh;
	Circle circle;
	public Volume(Circle c,double h){
		circle=c;
		heigh=h;
	}
	
	double s=circle.getArea();//s为底面积
	
	public void getVolume(){
		double volume=s*heigh;
		System.out.println("体积是"+volume);
	}
}

三个类计算圆柱体积,Circle类创建底面圆对象,有个方法返回圆面积,Volume类计算圆柱体积,并打印输出,主函数在Yuanzhu类中。但是运行后提示空指针异常是怎么回事?double s=circle.getArea();这个报错了

查看完整描述

1 回答

已采纳
?
qq_Kero_1

首先你要明白一个类的初始化顺序,先初始化类中的属性(如果是基础数据类型初始化为0,如果是引用类型,初始化为null。),再执行该类的构造函数,如果构造中有初始化属性的代码,会对属性进行第二次初始化。


当执行到 Volume vol=new Volume(cir,5);语句时,系统会最先初始化Volume类中所有的属性,依次执行heigh=0,circle=null, 当执行到double s=circle.getArea();时,发现是一个赋值的表达式,这时候系统会先执行右边的表达式,会调用circle.getArea(), 问题就出在这里,因为这时circle=null, 空值的引用是不能调用任何方法的,只有实例对象才能调用相应的方法,所以就抛出了异常。在java中,对一个类初始化的时候,有时并不是按照代码的写书顺序来执行的,你将double s=circle.getArea();写到程序的最后,它还是会在构造方法之前得到执行。

知道了为什么出错,解决起来就简单了,你可以先定义一个double s; 然后定义一个方法,在方法中调用 s=circle.getArea();  如下面的代码:

class Volume{
    double heigh;
    Circle circle;
    double s;
    
    public Volume(Circle c,double h){
        circle=c;
        heigh=h;
    }
    public double area(){
        s = circle.getArea();   
    } 
 }

当然你也可以在构造函数当中对 s 进行初始化,如下面的代码:

class Volume{
    double heigh;
    Circle circle;
    double s;
    
    public Volume(Circle c,double h){
        circle=c; //这里circle已经得到正确的初始化
        heigh=h;
        s=circle.getArea();//所以这里可以调用相应的方法
    }
         
    public void getVolume(){
        double volume=s*heigh;
        System.out.println("体积是"+volume);
    }
}

总之一句话,在使用circle之前必须保证circle得到了正确的初始化。

查看完整回答
1 反对 回复 2017-07-02

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信