java - 主中的 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() 但没有成功。
问题:你能解释一下我在这里遗漏的明显内容吗?谢谢
解决方案
每次编写时,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));
}
}
推荐阅读
- xcode - 在 Xcode 或替代 IDE 中使用 Makefile
- http - HTTP 代理:Squid:记录:在哪里可以找到我的 http 请求和响应正文的详细信息
- python - 有效序列数
- c - 试图从存储在二进制文件中的前序遍历中构建树?
- python - 使用属性获取 XML 树中所有节点的 xpath - Python
- java - Spring项目在数据库中看不到表
- flask - 为什么在使用 Response 实例调用 abort 时不调用 HTTPException 的处理程序?
- php - 从 PHP 文件重定向到 FORM PHP
- javascript - Angular 6 生命周期钩子不在动态创建的组件上运行
- c - C 段错误:11