【问题标题】:How to create an if statement for a String variable in Java?如何在 Java 中为 String 变量创建 if 语句?
【发布时间】:2015-04-15 00:08:17
【问题描述】:

所以我的代码在 if 语句中告诉我,我需要插入 != null 检查。为什么它会告诉我这个以及如何为 String 变量创建 if 语句?我是初学者,感谢您的帮助,但请在您的回答中留下解释,因为如果没有具体细节,我并不总是确切地知道自己在做什么。非常感谢!

import java.util.Scanner;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.Ellipse2D;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Game2 extends JPanel {

public void paint(Graphics g) { //creates a void in order to paint
    Graphics2D g2d = (Graphics2D) g; //creates 2D graphics
    g2d.setColor(Color.YELLOW); //sets color
    g2d.fillOval(350, 15, 25, 70); //draws oval
    g2d.fillOval(400, 15, 25, 70); //draws
    g2d.setColor(Color.RED); //sets color
    g2d.fillRect(350, 120, 77, 25); //draws rectangle

    Scanner game = new Scanner (System.in); //creating a new scanner
    String mood, Happy, Satisfied, Sad, Nervous; //creates string

    System.out.println("How are you feeling today? Pick one of the                      following:");
    System.out.println("");
    System.out.println("Happy");
    System.out.println("Satisfied");
    System.out.println("Sad");
    System.out.println("Nervous");
    mood = game.nextLine();

    if (mood = Satisfied) { //I NEED HELP WITH THIS. IT TELLS ME I NEED TO        "Insert '!= null' check". WHY? THANKS IN ADVANCE!
        g2d.setColor(Color.YELLOW); //sets color
        g2d.fillOval(350, 15, 25, 70); //draws oval
        g2d.fillOval(400, 15, 25, 70); //draws oval
        g2d.setColor(Color.RED); //sets color
        g2d.fillRect(350, 120, 77, 25); //draws rectangle
        }



    }

    public static void main(String[] args) { //sets this class as main
        JFrame frame = new JFrame("Ping Boom"); //sets title
        frame.add(new Game2());
        frame.setSize(800, 500); //sets size of window
        frame.setVisible(true); //sets visibility as a boolean
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //sets the   ability for the window to close on command


     }

}

【问题讨论】:

    标签: java string if-statement


    【解决方案1】:

    您已将moodSatisfied 都声明为String 对象,但您只为mood 赋值,因此Satisfied 将始终未赋值

    另外,检查字符串是否相等的方法是使用String.equals (otherString) 方法

    试试

    String satisfied = "Satisfied";
    ....
    
    if (mood.equals (satisfied )) {
    ...
    }
    

    【讨论】:

      【解决方案2】:

      在创建String的行中,也定义它们的内容,所以不是

      String mood, Happy, Satisfied, Sad, Nervous; //creates string
      

      只声明没有值的变量,请执行以下操作:

      String happy = "Happy";
      String satisfied = "Satisfied";
      String sad = "Sad";
      String nervous = "Nervous";
      

      对于字符串比较,使用.equals.equalsIgnoreCase 而不是=。顺便说一句,比较的正确运算符是====.equals 的区别请参考this question

      if (mood.equalsIgnoreCase(happy)) {
          // do happy things
      } else if (mood.equalsIgnoreCase(satisfied)) {
          // do satisfied things
      }
      

      作为说明,这种“固定数量的事物”最好用枚举来表示:

      enum Mood {
          Happy, Satisfied, Sad, Nervous;
      }
      

      以后可以使用switch声明:

      Mood mood;
      // codes here to assign mood
      switch (mood) {
          case Happy:
              // do happy things
          case Satisfied:
              // do satisfied things
          case Sad:
              // do sad things
          case Nervous:
              // do nervous things
      }
      

      一个 enum 教程可以帮助您开始阅读 enum: https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

      【讨论】:

        【解决方案3】:

        为了检查心情是否等于满意:

        改变:

        if (mood = Satisfied)
        

        到:

        if (mood.equals(Satisfied))
        

        【讨论】:

          【解决方案4】:

          首先,关于 Java(以及类似的语言)如何工作的一些信息:

          一般情况下,当您将 1myvariable = value1(任何地方)放入时,就好像您调用了一个函数,将 myvariable 的值分配给 value。但请记住,函数可以返回值。因此,当您进行赋值时,会调用“赋值函数”将给定值赋给给定变量,并返回具有新值的变量。这就是为什么你可以做类似a = b = c = d;

          您可能知道 if 语句通过将括号中的内容评估为 true 或 false 来工作,如果该值为 true,则执行 if 语句的主体。这只是部分正确。在一切之下,布尔(真/假)值只是数字。 0 为假,其他为真。那么if语句检查的是如果括号中的值不等于0,那么它将执行循环体

          Java 中的所有对象都通过引用进行跟踪。 Java 中的引用是内存地址,其中null 等于 0,所有表示非空对象的引用都等于正十六进制数。 String 是一个对象,您正在通过变量 mood 跟踪 String。用于跟踪一个对象的变量是一个引用,它只是一个内存地址,本质上只是一个数字。

          在 if 语句中,您将 Satisfied 的值分配给变量 mood,就像它不在 if 语句中一样。但请记住我之前所说的。赋值就像函数调用,返回带有新值的变量。所以在你的if语句中,你当前做的赋值计算为赋值后变量mood的值,也就是StringSatisfied的内存地址,其实只是一个数字。

          Satisfied是一个存在的对象,所以很明显不是null,null就相当于0,或者false。因此,如果某些东西不是假的,那么它一定是真的,因此你的 if 语句会执行它的主体。

          您收到错误的原因是这种类型的构造,其中赋值发生在评估为布尔值的语句中,被认为是糟糕的编程,因为您不知道只有一个等号是意外还是程序员实际上打算这样做。 Java 同意这种逻辑,因此默认情况下,它不会让您测试引用是否为 0 (null),而是通过强制您输入 @987654335 来强制您承认这是您的实际意图@之后。在这样做时,您明确地说“是的,我的意思是做那个作业而不是比较”。

          在我假设的这种情况下,您的意思是比较两个字符串,而不是分配它们。在处理对象(以及引用)时,== 运算符比较引用本身,而不是它们所代表的对象(因为引用只是内存地址,也就是数字)。所以在这种情况下你想要的是:

          if (mood.equals(Satisfied)) 
          {
              // do stuff
          }
          

          .equals() 方法对引用所代表的对象进行比较,为您提供所需的内容。

          【讨论】:

            【解决方案5】:

            在字符串中你不能使用 = 符号如果你匹配字符串你可以使用 .equals 或者您可以使用 .contains,因为您的问题 .equals 会起作用。

            如果(心情。等于(满意))

            你也可以使用 .equalsIgnoreCase(anotherString)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-07-11
              • 1970-01-01
              • 1970-01-01
              • 2014-01-07
              • 2015-07-26
              • 2014-04-11
              • 1970-01-01
              • 2015-12-03
              相关资源
              最近更新 更多