主结尾处的Java构造函数用户输入在构造函数中为Null

您可能会推断,我是Java的新手。

我正在使用Java Main和关联的构造函数来计算半径范围内的面积。我用静态值弄清楚了。

我正在使用将其值发送到构造函数的输入,首先将其作为字符串,然后将其转换为双精度型。在特定位置使用println(),我看到字符串,然后是强制转换的双精度字符,然后是Null。

下降的值发生在Cercle1(构造函数)的第14行和第23行之间。 在搜索了在线示例并修改了它们的Java代码之后,这就是我所拥有的。

主要:

import java.util.Scanner;

public class Cercle {

    public static void main(String[] args)
    {
        /////---------------------------------------
        /// USER INPUT
        String rad;
        Scanner ss = new Scanner(System.in);
        System.out.print("Input radius: ");
        rad = ss.nextLine();
        Cercle1 a = new Cercle1(rad);
        System.out.println("Cercle: "+rad);

        /////---------------------------------------
        Cercle1 pi = new Cercle1();
        Cercle1 radius= new Cercle1();
        Cercle1 circle= new Cercle1();
        Cercle1 perimeter = new Cercle1();

        System.out.println("PI       : "+pi.getPI());
        System.out.println("Radius   : "+radius.getRadius());
        System.out.println("Area     : "+circle.computeArea());
        System.out.println("Perimeter: "+perimeter.computePerimeter());
    }
}

建设者:

public class Cercle1 {
    public double radius;

    /////---------------------------------------
    /// PASS USER INPUT
    Double rad2;

    public Cercle1(String rad) {
        rad2 = Double.valueOf(rad);
        System.out.println("Cercle1 rad2 line14: "+rad2);
    }

    /////---------------------------------------
    Cercle1() {
        System.out.println("Cercle1 rad2 line23: "+rad2);
        radius = rad2; //1.0;
        pi =  (Math.PI);
    }
    public void setRadius(double radius) {
        rad2 = radius;
    }
    private double pi;
    double getPI() {
        return pi;
    }
    double getRadius() {
        return rad2;
    }
    public double computeDiameter() {
        return rad2*2;
    }
    double computePerimeter() {
        return pi * (2 * rad2);
    }
    double computeArea() {
        return (Math.PI * Math.pow(rad2,2));
    }
}

IntelliJ控制台中的输出:

Input radius: 1
Cercle1 rad2 line14: 1.0
Cercle line17 rad: 1
Cercle1 rad2 line23: null
Exception in thread "main" java.lang.NullPointerException
    at Cercle1.<init>(Cercle1.java:22)
    at Cercle.main(Cercle.java:20)

我看到在Cercle1的第17行和第23行之间,我的double rad2变为Null。 我尝试了多种方法将值从公共类Cercle1 {...}传递给Cercle1(),但没有成功。

问题:您能解释一下我在这里想念的明显之处吗? 谢谢

wenweiflytop 回答:主结尾处的Java构造函数用户输入在构造函数中为Null

一个快速的问题是,在no-arg构造函数内部,您试图将Double rad2(它是一个对象)分配给double radius(一个原语)。 rad2尚未初始化,因此为null。当Java尝试对Double拆箱时,您将得到null指针异常。在尝试将rad2分配给radius之前,对其进行初始化。

Cercle1() {
    System.out.println("Cercle1 rad2 line23: "+rad2);
    rad2 = 1.0;
    radius = rad2; //1.0;
    pi =  (Math.PI);
}
,

每次编写new Circle1()时,都会创建一个全新的对象,并且该对象独立于其他对象。

当您这样做

Cercle1 pi = new Cercle1();
Cercle1 radius= new Cercle1();
Cercle1 circle= new Cercle1();
Cercle1 perimeter = new Cercle1();

您创建4个新的Cercle1对象,这些对象无半径。因此,当您尝试进行任何涉及半径(直径,周长,面积)的计算时,您会得到一个NullPointerException,因为未定义半径(它为空)。

您想要做的是创建一个带有半径的Cercle并查询其getter方法。

您也不需要第二堂课Cercle1。您只需要您的Cercle

import java.util.Scanner;

public class Cercle {

    public static void main(String[] args)
    {
        // USER INPUT
        String rad;
        Scanner ss = new Scanner(System.in);
        System.out.print("Input radius: ");
        rad = ss.nextLine();
        Cercle myCercle = new Cercle(rad);

        // That's it,that's all you have to do,// you now have a circle and you can get its area and perimeter

        System.out.println("Cercle: "+rad);
        System.out.println("PI       : "+myCercle.getPI());
        System.out.println("Radius   : "+myCercle.getRadius());
        System.out.println("Area     : "+myCercle.computeArea());
        System.out.println("Perimeter: "+myCercle.computePerimeter());
    }


    private Double radius;
    private Double pi = Math.PI;

    public Cercle(String rad) {
        radius = Double.valueOf(rad);
    }

    double getPI() {
        return pi;
    }
    double getRadius() {
        return radius;
    }
    public double computeDiameter() {
        return 2 * radius;
    }
    double computePerimeter() {
        return pi * 2 * radius;
    }
    double computeArea() {
        return (pi * Math.pow(radius,2));
    }
}

现在,当您说

  

我正在使用Java Main和关联的构造函数

我不确定您是否了解它们与无关,因为main不必在Cercle类中。它们可能在2个不同的类中,在2个不同的文件中:

public class MyUserInputClass {

    public static void main(String[] args)
    {
        // USER INPUT
        String rad;
        Scanner ss = new Scanner(System.in);
        System.out.print("Input radius: ");
        rad = ss.nextLine();
        Cercle myCercle = new Cercle(rad);

        // That's it,// you now have a circle and you can get its area and perimeter

        System.out.println("Cercle: "+rad);
        System.out.println("PI       : "+myCercle.getPI());
        System.out.println("Radius   : "+myCercle.getRadius());
        System.out.println("Area     : "+myCercle.computeArea());
        System.out.println("Perimeter: "+myCercle.computePerimeter());
    }
}
public class Cercle {

    private Double radius;
    private Double pi = Math.PI;

    public Cercle(String rad) {
        radius = Double.valueOf(rad);
    }

    double getPI() {
        return pi;
    }
    double getRadius() {
        return radius;
    }
    public double computeDiameter() {
        return 2 * radius;
    }
    double computePerimeter() {
        return pi * 2 * radius;
    }
    double computeArea() {
        return (pi * Math.pow(radius,2));
    }
}

,

最后,我能够将输入传递给构造函数而不会变成Null,如上面的初始代码所示。花了我一段时间找出正确的方法。 我要感谢大家的投入,他们帮助我解决了我的问题。

主要:

import java.util.Scanner;

public class Cercle_v1 {

    public static void main(String[] args) {
        String rad;
        Scanner s = new Scanner(System.in);

        System.out.print("Input radius: ");
        rad = s.nextLine();
        System.out.println("");

        Cercle1_v1 radius = new Cercle1_v1(rad);
        Cercle1_v1 dia = new Cercle1_v1(rad);
        Cercle1_v1 peri = new Cercle1_v1(rad);
        Cercle1_v1 area= new Cercle1_v1(rad);

        System.out.println("Radius      : "+radius.getRadius());
        System.out.println("Diameter    : "+dia.getDiameter());
        System.out.println("Perimeter   : "+peri.getPerimeter());
        System.out.println("Area        : "+area.getArea());
    }
}

// -----------------------------
构造函数

class Cercle1_v1 {
    private String rad2;
    private double rad3;
    private double pi;
    private double dia;
    private double peri;
    private double area;

    Cercle1_v1(String rad) {
        pi = (Math.PI);
        rad2 = rad;
        rad3 = Double.parseDouble(rad2);
        dia = (rad3 * 2);
        peri = (pi * (dia));
        area = (pi * Math.pow((dia),2))/4;
        }

    double getRadius() {
        return (rad3);
    }
    double getDiameter() {
        return (dia);
    }
    double getPerimeter() {
        return (peri);
    }
    double getArea() {
        return (area);
    }
}
本文链接:https://www.f2er.com/3092218.html

大家都在问