Java构造函数用户输入在主构造函数中以Null结尾

Java构造函数用户输入在主构造函数中以Null结尾,java,input,constructor,null,Java,Input,Constructor,Null,正如您可能推断的那样,我对Java是新手 我使用一个Java主构造函数和相关的构造函数来计算面积、周长和半径。我用静态值计算出来的 我正在使用一个输入,从中它的值被发送到构造函数,首先作为字符串,然后我能够将其转换为双精度。在特定位置使用println()可以看到字符串,然后是casted double,然后是Null 删除的值发生在Cercle1(构造函数)的第14行和第23行之间。 在搜索了在线示例并修改了它们的Java代码之后,下面是我所拥有的 主要内容: 承包商: public clas

正如您可能推断的那样,我对Java是新手

我使用一个Java主构造函数和相关的构造函数来计算面积、周长和半径。我用静态值计算出来的

我正在使用一个输入,从中它的值被发送到构造函数,首先作为字符串,然后我能够将其转换为双精度。在特定位置使用println()可以看到字符串,然后是casted double,然后是Null

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

主要内容:

承包商:

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)
输入半径:1
Cercle1 rad2线路14:1.0
Cercle line17 rad:1
Cercle1 rad2第23行:空
线程“main”java.lang.NullPointerException中出现异常
在Cercle1。(Cercle1.java:22)
在Cercle.main(Cercle.java:20)
我看到在Cercle1的第17行和第23行之间,我的双rad2变为空。 我尝试了许多方法将值从公共类Cercle1{…}传递到Cercle1(),但没有成功

问:你能解释一下我在这里遗漏了什么吗?
感谢

快速的问题是,在无参数构造函数中,您试图将双rad2(对象)分配给双半径(原语)。rad2尚未初始化,因此为空。当Java尝试取消对Double的装箱时,您将得到null指针异常。在尝试将rad2指定给radius之前初始化rad2

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

快速的问题是,在无参数构造函数中,您试图将Double rad2(对象)分配给Double radius(原语)。rad2尚未初始化,因此为空。当Java尝试取消对Double的装箱时,您将得到null指针异常。在尝试将rad2指定给radius之前初始化rad2

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

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

主要内容:

//-----------------------------
建造师

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);
    }
}

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

主要内容:

//-----------------------------
建造师

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);
    }
}

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

当你这么做的时候

Cercle1 pi = new Cercle1();
Cercle1 radius= new Cercle1();
Cercle1 circle= new Cercle1();
Cercle1 perimeter = new Cercle1();
创建4个新的
Cercle1
对象,这些对象没有半径。因此,当您尝试进行任何涉及半径(直径、周长、面积)的计算时,您会得到一个
NullPointerException
,因为半径没有定义(它是null)

您要做的是创建一个带有半径的
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不必在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, 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());
    }
}

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

当你这么做的时候

Cercle1 pi = new Cercle1();
Cercle1 radius= new Cercle1();
Cercle1 circle= new Cercle1();
Cercle1 perimeter = new Cercle1();
创建4个新的
Cercle1
对象,这些对象没有半径。因此,当您尝试进行任何涉及半径(直径、周长、面积)的计算时,您会得到一个
NullPointerException
,因为半径没有定义(它是null)

您要做的是创建一个带有半径的
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不必在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, 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());
    }
}

错误在无参数构造函数中。您正在将实例变量
radius
设置为实例变量
rad2
,该变量仍然为空,因为您尚未初始化它。我相信您没有意识到您的构造函数创建的单个实例不共享其实例变量。或者您错误地认为
rad2
是静态的。这是拙劣的设计。如果您希望得到这样的效果,那么在构造所有实例时应该删除此构造函数并传递相同的参数。您不需要两个radius变量。错误在no args构造函数中。您正在将实例变量
radius
设置为实例变量
rad2
,该变量仍然为空,因为您尚未初始化它。我相信您没有意识到您的构造函数创建的单个实例不共享其实例变量。或者您错误地认为
rad2
是静态的。这是拙劣的设计。如果您希望得到这样的效果,那么在构造所有实例时应该删除此构造函数并传递相同的参数。你不需要两个半径变量。即使这样做有效,你也不应该创建所有这些圆。看一看我的答案,希望它能把它弄清楚。尽管这样做有效,但它似乎不正确,你不应该创造所有这些圆圈。看一看我的答案,希望它能澄清我感谢你花时间解释这一点。非常有帮助。我感谢你花时间解释这件事。非常有用。