为什么即使计算是正确的,方法仍返回nan?

4xrmg8kj  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(403)

**结束。**此问题需要详细的调试信息。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。

13天前关门了。
改进这个问题
我试图用两个不同的jtextfield来制作一个gui,计算一个egfr值需要这个输入。在方法中打印egfr时 calcAndSetTotal() ,我得到了正确的计算结果(egfr的值),但是当我返回egfr并调用 calcAndSetTotal() 在main中并尝试打印它,即使我将所有输入值都传递到double中,也会得到值“egfr=nan”。

package NyreFunktion;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JTextField;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class calculation {
    public JFrame frame;
    public JTextField textField;
    public JTextField textField_1;

    public double højde;
    public double kreatinin;
    double eGFR=0;

    public static void main(String[] args) throws InterruptedException {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    calculation window = new calculation();
                    window.frame.setVisible(true);
                    double value=window.eGFR;
                    System.out.println(value);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

        calculation cl= new calculation();
        cl.initialize();
        cl.calcAndSetTotal();
        System.out.println("test=" +cl.calcAndSetTotal());
    }

    public calculation() {
        initialize();
    }

    public void initialize() {
        frame = new JFrame();
        frame.getContentPane().setBackground(Color.WHITE);
        frame.setBounds(100, 100, 450, 450);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

        textField = new JTextField();
        textField.setBounds(121, 114, 130, 26);
        frame.getContentPane().add(textField);
        textField.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                 højde =Double.parseDouble(textField.getText());
               System.out.println("Højde: " + højde);
                  calcAndSetTotal();
            }
        });

        textField_1 = new JTextField();
        textField_1.setBounds(121, 188, 130, 26);
        frame.getContentPane().add(textField_1);
        textField_1.setColumns(10);
        textField_1.addActionListener(new ActionListener() {
           public void actionPerformed(ActionEvent eventt) {
             kreatinin =Double.parseDouble(textField_1.getText());
              System.out.println("kreatinin: " + kreatinin);
              calcAndSetTotal();
            }
        }); 
    }

    double calcAndSetTotal() {
           eGFR = højde/kreatinin;
           System.out.println("GFR" + " " + "=" + " " + eGFR);

           return eGFR;
    }
}
gwo2fgha

gwo2fgha1#

(我假设在您的真实代码中 public class calculation { 后一行 import 声明。)
真正的问题是您的代码使用了 calculation 班级。
第一个 calculation 在中创建的示例 run() 方法并将其设置为可见。
第二个 calculation 在中创建的示例 main 方法本身,不要将其设置为可见。
第一个示例是在gui中输入文本时正在更新的示例,等等。
第二个示例是您用来获取 eGFR 你正在打印的。但由于这个示例从来都不可见:
无法调用其文本框的操作侦听器,因此
højde 以及 kreatinin 字段不能更改其默认值;即 0.0 以及 0.0 ,因此
你计算 0.0 / 0.0 因此 NaN 在中写入标准输出 main .

oug3syen

oug3syen2#

你的代码有点问题。
首先,我认为你在计算中犯了一个错误,忘记了计算 public calculation() 使用类定义

public class calculation {
    public JFrame frame;
    public JTextField textField;
    public JTextField textField_1;

    public double højde = 1;
    public double kreatinin = 1;
    double eGFR = 0;

    public calculation() {
        initialize();
    }

    public void initialize() {...}

    double calcAndSetTotal() {...}
}

你不需要打电话

calculation cl= new calculation();
cl.initialize();
cl.calcAndSetTotal();
System.out.println("test=" +cl.calcAndSetTotal());

现在有两个示例运行在同一个类中而不可见。这也是导致 NaN 因为你被零除了。我可以给你一个提示,就是检查用户输入的除法。
希望这有帮助

编辑

在对问题有了更好的理解之后,这更像是一种行为

public class calculation {

    public JFrame frame;
    public JTextField textField;
    public JTextField textField_1;

    /*
        when calling calcAndSetTotal() without changing this 
        values first you will get a Nan since højde, kreatinin 
        are both initialised with zero
    */
    public double højde;
    public double kreatinin;
    double eGFR=0;

    static calculation window;

    public static void main(String[] args) throws InterruptedException {

        ((Runnable) () -> {
            try {
                window = new calculation();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }).run();
       /*
           Will output NaN since højde, kreatinin are still zero
       */
       System.out.println(window.calcAndSetTotal());

    }

    public calculation() {...}

    public void initialize() {...}

    double calcAndSetTotal() {...}
}

相关问题