Java 这段代码多次调用同一个构造函数是错误的吗

Java 这段代码多次调用同一个构造函数是错误的吗,java,Java,构造函数在下面的代码中创建的对象可以被多次调用。我是否因为这样做而编写了糟糕的代码?我希望它是按照正确的约定编写的 import java.util.Scanner; /** * this class uses the scanner to take input from the keyboard * test if the input is a variable of type double if it is store in a * variable called numOne th

构造函数在下面的代码中创建的对象可以被多次调用。我是否因为这样做而编写了糟糕的代码?我希望它是按照正确的约定编写的

import java.util.Scanner;
/**
 * this class uses the scanner to take input from the keyboard
 * test if the input is a variable of type double if it is store in a 
 * variable called numOne then take next input test again for type double
 * store in variable numTwo, then add the two variables together in the form
 * of variable answer and return to the screen. The user then is asked for
 * continuation as Y/N then appropriate action is taken
 */

public class Calc {

    /**
     * this constructer does not throw InputMismatchException
     */

    public Calc() {
    Scanner in = new Scanner(System.in);  // create scanner object

        System.out.println("please enter 1st " 
            + "number then press enter"
                + "\nthen enter 2nd number then " 
            + "press enter again");

        /*test for a double returns true */
        boolean myBool = in.hasNextDouble();

        /*the actual test for a double*/
        if(myBool == false) {    
                System.out.println("wrong format");

           /**
            * call constructer and instantiate as new object
            * by creating a new object i hope to have overwriten
            * the original object stored in memory there by getting
            * around the problem of hasNextDouble not allowing the
            * scanner to advance
            */

                Calc c = new Calc();

        } else {                   // 1st else
                double numOne = in.nextDouble();       // keyboard input

            /*test for a double returns true */
                boolean myBool2 = in.hasNextDouble();

        /*the actual test for a double*/
        if(myBool2 == false) {
                System.out.println("wrong format start again");

           /**
            * call constructer and instantiate as new object
            * there by removing need for InputMismatchException
            */

                Calc c = new Calc();

        } else {                   // 2nd else
                double numTwo = in.nextDouble();       // keyboard input

                double answer = numOne + numTwo;       // the maths

        for(int i = 0; i<35; i++) {            // print pattern
                System.out.print("*");
        }
        System.out.println("\n****  " 
            + "Your 1st number is " 
            + numOne + "   ****");

        System.out.println("****     "        // print operator
            + "                   " + "+" 
            + "   ****");

        System.out.println("****  " 
            + "Your 2nd number is " 
            + numTwo + "   ****");

        System.out.println("****     "       // print line
            + "               ______  ****");

        System.out.println("****       " 
            + "The answer is " 
            + answer + "   ****");

        for(int i = 0; i<35; i++) {         //print pattern
                System.out.print("*");
        }
        System.out.println("\nDo you have " 
            + "more calculations Y or N");

        String reply = in.next();                //keyboard input

        if(reply.equalsIgnoreCase("Y")) {
                Calc c = new Calc();
        } else {
                System.out.println("OK bye then");
                in.close();             //close scanner
        }               //end else
        }   // end 1st else
        }   // end 2nd else
        }   // end constructor

    public static void main(String[] args) {
        Calc c = new Calc();            // call constructor
    }  // end main
}    // end class

// just in case i do something wrong thanks in anticipation  Simon.  
import java.util.Scanner;
/**
*此类使用扫描仪从键盘获取输入
*测试输入是否为double类型的变量(如果它存储在
*名为numOne的变量,然后对类型double再次进行下一次输入测试
*存储在变量numTwo中,然后将两个变量添加到表单中
*选择变量回答并返回屏幕。然后要求用户提供
*是否继续,然后采取适当的措施
*/
公共类计算{
/**
*此构造函数不会抛出InputMismatchException
*/
公共计算(){
Scanner in=new Scanner(System.in);//创建Scanner对象
System.out.println(“请输入第一个”
+“编号,然后按enter”
+“\n然后输入第二个数字”
+“再次按回车键”);
/*双精度测试返回true*/
布尔myBool=in.hasNextDouble();
/*实际测试为双精度*/
如果(myBool==false){
System.out.println(“格式错误”);
/**
*调用构造函数并实例化为新对象
*通过创建一个新对象,我希望已覆盖
*通过获取存储在内存中的原始对象
*围绕hasNextDouble问题不允许
*扫描器前进
*/
计算量=新计算量();
}else{//1st else
double numOne=in.nextDouble();//键盘输入
/*双精度测试返回true*/
布尔myBool2=in.hasNextDouble();
/*实际测试为双精度*/
if(myBool2==false){
System.out.println(“重新启动错误格式”);
/**
*调用构造函数并实例化为新对象
*通过消除输入不匹配异常的需要,可以实现这一点
*/
计算量=新计算量();
}其他{//2其他
double numTwo=in.nextDouble();//键盘输入
双答案=numOne+numTwo;//数学

for(int i=0;i从同一个构造函数中调用构造函数,并且不带任何参数,看起来是获得无限循环和堆栈溢出的可靠方法。因此,是的,这是错误的


并且因为看起来您在构造函数中创建的所有代码“<代码> > Calc < /C> >都没有意义。

在构造函数中执行任何与实例化该对象不直接相关的工作通常被视为不好的做法。请考虑将您的逻辑移到<代码中的另一个方法中)。>Calc
。这样,您就可以使用
Calc
的单个实例,并且使用该实例上的字段,您可能会更好地覆盖您的注释提到的要覆盖的值

正如Ern所提到的,您当前的模式使用递归调用,如果不正确的话,它很容易出现堆栈溢出。我不会说递归调用总是一件坏事,但是您应该仔细考虑这是否是您正在做的最好的模式。

尽管您(可能)不会出错,这在很多方面都是不好的做法

首先,您不应该在构造函数中执行这些操作。构造函数应该创建一个对象或引发一个异常,就是这样。如果构造函数需要任何输入,请提前阅读并将其作为参数传递给构造函数。构造函数不是为用户交互而创建的

下一点是错误处理。如果用户输入无效,则绝对不需要使用递归。当然,您不会得到StackOverflowerError(除非您的用户失败数千次),但循环是更好的解决方案

System.out.print("Enter a double please: ");
while(!scanner.hasNextDouble()) {
    System.out.print("Invalid input. Please try again: ");
    scanner.next(); //discard invalid input
}
double input = scanner.nextDouble();

请把更多的精力放在格式化你的代码上。它现在到处都是……然后再把更多的精力放在提出一个问题上。你已经包含了很多代码,但只是笼统地谈论了“由构造函数创建的对象”-哪一个对象?哪一个构造函数?这似乎是一个非常可怕的想法。我不知道它在技术上是“错误的”但是我认为很多人在生产代码中会说它是错误的。如果我们忽略无限循环,问题是:为什么整个程序都在构造函数中?WTF。构造函数应该用来创建对象,而不是执行程序。嗨,伙计们,我对任何类型的编码都是相当陌生的,我非常欣赏每个人的输入。现在@Jon Skeet您能否更具体地评论一下整个地方,因为这对我和其他人都有很大帮助,您能否指出所有其他构造函数,因为我真的认为只有一个“public Calc()”被“new Calc()”调用“首先是main方法,如果且仅当用户没有输入double时,再重复两次。@Marco Acierno,你能指出无限循环吗?因为我没有看到一个循环,你能详细说明一下程序的执行情况吗?因为我认为这是由main方法完成的。我把它放在一个构造函数中,这样我就可以从另一个类调用它。你能解释一下吗请告诉我如何把它变成一个方法。嗨,我为什么回忆public Calc(),如果用户没有输入double,我将无法通过。hasNextDouble,因为扫描仪似乎没有推进输入。因此,我创建了一个新对象并重新开始。请指出可能的循环。@SimonRemington将所有这些代码放在构造函数中根本没有意义,因为您并不是真正在构造对象,您只是在重复我把所有的代码放在一个静态方法中,而不是递归调用,把所有的代码放在一个while循环中-
boolea