Java 不能准确地评估字符串
我编写了一些代码,要求用户输入并将其分配给字符串skillAssign。当我尝试使用skillAssign时,不管发生什么,它都返回false。这是我的密码:Java 不能准确地评估字符串,java,string,equals,Java,String,Equals,我编写了一些代码,要求用户输入并将其分配给字符串skillAssign。当我尝试使用skillAssign时,不管发生什么,它都返回false。这是我的密码: import java.util.*; public class CharacterCustomization { public CharacterCustomization() { } public static void Customization() { Scanner key
import java.util.*;
public class CharacterCustomization
{
public CharacterCustomization()
{
}
public static void Customization()
{
Scanner keyboard = new Scanner(System.in);
int skillPoints = 100;
String skillAssign = "";
int newMaxHealth = 0;
int newMaxMagic = 0;
int newMaxStamina = 0;
int assignmentValue = 0;
boolean isDone = false;
System.out.println("Welcome to character customization, you have 100 points to allocate to your skills.");
System.out.println("To allocate points, type name of skill, followed by the points you want to assign (blank for positive, - for negative, ex. -5)");
System.out.println("Put Skill on one line, and press enter, then the value on the next line");
System.out.println("Type \"stats\" to view full stats at any time");
System.out.println("Type \"done\" to finish");
while (true)
{
while (isDone == false)
{
skillAssign = keyboard.nextLine();
if (skillPoints == 0)
{
System.out.println("Max Health: " + newMaxHealth);
System.out.println("Max Magic: " + newMaxMagic);
System.out.println("Max Stamina: " + newMaxStamina);
System.out.println("Skill points left: " + skillPoints);
System.out.println("Type \"done\"to finish");
}
if ((!(skillAssign.equals("stats"))) || (!(skillAssign.equals("done"))))
{
assignmentValue = keyboard.nextInt();
if (((skillAssign.equals("health")) || (skillAssign.equals("Health"))) && (skillPoints - assignmentValue >=0))
{
skillPoints = (skillPoints - assignmentValue);
newMaxHealth = (assignmentValue + newMaxHealth);
}
else if (((skillAssign.equals("magic")) || (skillAssign.equals("Magic"))) && (skillPoints - assignmentValue >=0))
{
skillPoints = (skillPoints - assignmentValue);
newMaxMagic = (assignmentValue + newMaxMagic);
}
else if (((skillAssign.equals("stamina")) || (skillAssign.equals("Stamina"))) && (skillPoints - assignmentValue >=0))
{
skillPoints = (skillPoints - assignmentValue);
newMaxStamina = (assignmentValue + newMaxStamina);
}
else
{
//System.out.println("Sorry, I could not read that!");
System.out.println(skillAssign == "stats");
}
}
else if (skillAssign.equals("stats"))
{
System.out.println("Max Health: " + newMaxHealth);
System.out.println("Max Magic: " + newMaxMagic);
System.out.println("Max Stamina: " + newMaxStamina);
System.out.println("Skill points left: " + skillPoints);
}
else if ((skillAssign.equals("done")) || (skillAssign.equals("Done")))
{
isDone = true;
continue;
}
else
{
System.out.println("Sorry, I could not read that!");
}
}
System.out.println("Are you sure this is the setup you want? [y] [n]");
System.out.println("Max Health: " + newMaxHealth);
System.out.println("Max Magic: " + newMaxMagic);
System.out.println("Max Stamina: " + newMaxStamina);
System.out.println("Skill points left: " + skillPoints);
//skillAssign = keyboard.nextLine();
if (((keyboard.nextLine()).equals("y")) || ((keyboard.nextLine()).equals("Y")) || ((keyboard.nextLine()).equals("yes")) || ((keyboard.nextLine()).equals("Yes")))
{
Player player = new Player(newMaxHealth, newMaxMagic, newMaxStamina);
}
else
{
isDone = false;
}
}
}
}
它不完整,但是当提示时,我正在输入统计信息,并且所有的评估都是错误的
有什么方法可以让它正确读取变量吗?如果((!(skillAssign.equals(“stats”))|(!(skillAssign.equals(“done”)))你总是会进入这个条件范围
这是因为当一个词不能通过时,另一个条件会让它通过,因为它们完全不同。
例如:
让我们以“统计数据”为例,结果将是if(false | | true)=>true。
让我们以“完成”为例,结果将是if(true | | false)=>true。
让我们以“统计数据”为例,它的结果是if(true | | true)=>true。
你无法逃避,你需要这样检查:
if(!(skillAssign.equals(“stats”)| | skillAssign.equals(“done”))
这样,我们检查逻辑表达式是否为真,然后将其更改为“否”,然后检查整个条件是否为真
p.S
A.您可以使用“abc”。equalsIgnoreCase(“abc”)代替您现在使用的内容。
B.不要为每个逻辑表达式添加括号,这会使代码更加复杂,乍一看就不清楚。问题是我使用的是|
而不是if(!(skillAssign.equals(“stats”)|(!(skillAssign.equals(“done”))中的&&
,而不是if((!(skillAssign.equals(“stats”))))|(!(skillAssign.equals(“done”))))
奥雷尔所说的都差不多。如果您使用System.out.println(skillAssign==“stats”)
评估您的skillAssign,它将始终返回false,即使它们具有相同的值。
因为比较字符串的引用而不是它们的值。
您必须使用equals()
方法。eevry您在哪里使用了equals()
,但就在打印时,您使用了==
?不相关,但equalsIgnoreCase会减少代码中IF条件的数量。修复了该问题,但当我输入“stats”时,它仍然会进入IF(!(skillAssign.equals(“stats”))|()!(skillAssign.equals(“done”))
A.您可以使用“abc.equalsIgnoreCase”(“abc”)
,而不是您现在使用的。B.不要为每个逻辑表达式添加括号,这会使代码更加复杂,乍一看就不清楚。