首页 > 解决方案 > 主中的 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 行之间,我的双 rad2 变为 Null。我尝试了很多方法将值从 public class Cercle1{...} 传递给 Cercle1() 但没有成功。

问题:你能解释一下我在这里遗漏的明显内容吗?谢谢

标签: javainputconstructornull

解决方案


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

当你这样做时

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

您创建了 4 个没有半径Cercle1的新对象。因此,当您尝试进行任何涉及半径(直径、周长、面积)的计算时,您会得到 a ,因为未定义半径(它为空)。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, 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());
    }
}
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));
    }
}


推荐阅读