Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有用户从JOptionPane中选择的选项的If-then语句_Java_Swing_Joptionpane - Fatal编程技术网

Java 带有用户从JOptionPane中选择的选项的If-then语句

Java 带有用户从JOptionPane中选择的选项的If-then语句,java,swing,joptionpane,Java,Swing,Joptionpane,我正在尝试用Java创建一个程序,允许用户设置他或她想要的动物数量,然后询问用户是否希望给动物服用维生素以减少疾病。25%的动物在没有维生素的情况下会生病,20%的动物在没有维生素的情况下会生病,如果动物生病,其中10%会死亡。结果列在JOptionPane中。我有下面的代码,出于某种原因,当一个随机数在25或20以上生成时,疾病没有设置为false,它仍然设置为true,我通过创建一个isItSick变量发现了这一点,该变量显示基于随机数生成器的vitamin boolean是否设置为true

我正在尝试用Java创建一个程序,允许用户设置他或她想要的动物数量,然后询问用户是否希望给动物服用维生素以减少疾病。25%的动物在没有维生素的情况下会生病,20%的动物在没有维生素的情况下会生病,如果动物生病,其中10%会死亡。结果列在JOptionPane中。我有下面的代码,出于某种原因,当一个随机数在25或20以上生成时,疾病没有设置为false,它仍然设置为true,我通过创建一个isItSick变量发现了这一点,该变量显示基于随机数生成器的vitamin boolean是否设置为true或false

虽然计算结果不正确,但我猜我的问题在于维生素和JOption的if-then-else语句是和否方法,但我不确定如何解决这个问题

主类

import java.util.Random;
import javax.swing.JOptionPane;

import javax.swing.JOptionPane;

public class Animals {

    private String isithealthy; //Sting stating if the animals took vitamins.
    private String isItSick; //String stating if the animals became sick.
    private int rNumber; //Random number generating for chance of sickness.
    private int requestVitamins;
    private double startingSize; //Starting size of number of animals.
    private double died; //Number of animals died from sickness.
    private double finalSize; //Number of animals left after sickness test.
    private boolean vitamin = false; //If true, decreases chances of getting sick.
    private boolean sickness; //If sick, 10% of starting size of animals die off.

    public void setStartingSize()
    {
        startingSize = Double.parseDouble(JOptionPane.showInputDialog(null, "Please enter the starting size of your animal colony.",
        "Creating Your Animal Colony", JOptionPane.INFORMATION_MESSAGE));
    }

    public void setVitamin()
    {
        requestVitamins = JOptionPane.showConfirmDialog(null, "Giving your animals vitamins decreases the chance of your animals from getting sick and dying off. Would you like to give your colony vitamins?",
        "Keeping Your Animals Healthy",JOptionPane.INFORMATION_MESSAGE, JOptionPane.YES_NO_OPTION);
            if (requestVitamins == JOptionPane.YES_OPTION)
                vitamin = true;
            else
                vitamin = false;
    }

    public void setSick()
    {
        Random number = new Random();        
        rNumber = number.nextInt(100);

        if (vitamin == true && rNumber <= 20)
            sickness = true;

        else if (vitamin == false && rNumber <= 25)
            sickness = true;

        else
            sickness = false;
    }

    public void sickEffect()
    {         
        if (sickness == true)
            finalSize = startingSize*0.10;
            died = startingSize - finalSize;
    }

        public void setHealthyText()
    {
        if (vitamin == true)
            isithealthy = "Yes";
        else if (vitamin == false)
            isithealthy = "No";
    }

    public void setSickText()
    {
        if (sickness == true)
            isItSick = "Yes";
        else
            isItSick = "No";
    }

        public void getFinalDialogOutput()
    {
        JOptionPane.showMessageDialog(null, "Starting Size: " + startingSize + "\n Random Number: " + rNumber + "\n Sickness and death: " + isItSick + isithealthy + ", " + died + " died" + "\n  Final size of colony: " + finalSize, "Animal Colony Summary", JOptionPane.INFORMATION_MESSAGE);
    }
}

在一些if语句中,您使用的是应该使用的
=

if (vitamin = true && rNumber <= 20)

if(vitamin=true&&rNumber您正在条件语句中将vitamin设置为true。
=
是赋值运算符。请改用
=

因为您实际上没有显示假定调用
setHealthyText()的代码。
下面是一些技巧,可以让大家更容易地调试代码

始终对一行程序使用{}: 有太多的机会添加一行逻辑,而忘记它将始终或永远不会执行

public void setHealthyText()
{
    if (vitamin == true)
    {
        isithealthy = "Yes";
    }
    else if (vitamin == false)
    {
        isithealthy = "No";
    }
}
对于非常简洁的陈述,以下内容也是可以接受的

public void setHealthyText()
{
    if (vitamin) { isithealthy = "Yes"; }
    else { isithealthy = "No"; }
}
不要直接将布尔值与
true/false
进行比较,这是一种重复,很难解释它们是如何组合在一起的:
if(someBoolean==true)
应该是
if(someBoolean)
或者
if(!someBoolean)
来测试
false

学习使用正确的命名约定: 变量是
较低的均值
isithealthy
应该是
isHealthy

返回
boolean
的方法应命名为
isXXX
hasXXX
或其他所有格

isSick()
isHealthy()
hasVitamin()
学习使用三元语句: 这是混淆代码的噩梦,不必是:
使用==进行比较/检查,使用==分配。几乎所有的if条件都是错误的。好的,我修复了==到==,我编辑了上面的代码,但仍然得到“null”对于isithealthy变量,即使当我在JOptionPane中单击NO并使Vitavists为false时,通过单击它,isithealthy应该说NO,并且在运行时它说为null。您需要显示相关的代码,您有一堆与您的事件处理程序不相关的代码,您说应该调用此方法,当然不是,但我们c我没有告诉你为什么!好吧,我把=改为==,我编辑了上面的代码,但仍然得到“null”对于isithealthy变量,即使我在JOptionPane中单击“否”,并将Vitavists设置为false,通过单击该变量,isithealthy应表示“否”,并且在运行时表示为null。@ZionTodd我没有看到从OK调用
setHealthyText
的位置。我已将=修改为==,我编辑了上面的代码,但仍然得到“null”对于isithealthy变量,即使当我在JOptionPane中单击“否”并将其设为false时,通过单击该选项,isithealthy应表示“否”,并且在运行时表示为null
isSick()
isHealthy()
hasVitamin()
public void setHealthyText()
{
    this.isHealthy = vitamin ? "Yes" : "No";
    // variable      boolean    true   false
}
if (vitamin == true && rNumber <= 20)
    sickness = true;

else if (vitamin == false && rNumber <= 25)
    sickness = true;

else
    sickness = false;
this.sickness = vitamin && rNumber <= 20 || !vitamin && rNumber <= 25;
public static void main(final String[] args)
{
    isSick(true, 26);
    isSick(true, 24);
    isSick(false, 24);
    isSick(false, 18);
}

private static void isSick(final boolean vitamin, final int hp)
{
    System.out.println(vitamin && hp <= 20 || !vitamin && hp <= 25 ? "Sick" : "Not Sick");
}
Not Sick
Not Sick
Sick
Sick