package rps;
import java.util.Random;
import java.util.Scanner;
public class Rps
{
public static void main(String[] args)
{
int rock, paper, scissors;
int compa;
String Computer;
String Human;
Scanner keyboard = new Scanner(System.in);
System.out.println("Rock, paper, or scissors?");
Human= keyboard.nextLine();
System.out.println("You chose");
System.out.println(Human);
try
{
int HC = Integer.parseInt(Human.trim()); // i know this part is wrong
}
catch (NumberFormatException nfe)
{
Random generator = new Random();
compa=generator.nextInt(3);
switch(compa){
case 0:
rock=0;
System.out.println("I choose Rock");
if (Human.equals(2));
System.out.println("Rock crushes scissors, i win");
if(Human.equals(0));
System.out.println("You must be psychic, i chose rock too!");
if (Human.equals(1));
System.out.println("paper covers rock, you lost");
break;
case 1:
paper=1;
System.out.println("I chose paper");
if (Human.equals(0));
System.out.println("Paper covers rock, you lose");
if (Human.equals(1));
System.out.println("It's a tie!");
if (Human.equals(2));
System.out.println("Paper covers rock, i lost");
break;
case 2:
scissors=2;
System.out.println("I chose scissors");
if (Human.equals(1));
System.out.println("scissors cut through paper, i win.");
if (Human.equals(2));
System.out.println("We both chose scissors");
if (Human.equals(0));
System.out.println("Rock smashed scissors, i lost");
break;
}
}
我想将字符串Human转换为一个整数,这是我的教师告诉我在插入try / catch之前要做的事情
由于人类不像(123)这样的值,因此我认为try catch适用于数字格式异常。
在我的原始代码中,我没有使用HC作为变量,我继续使用Human 但它仍然列出了所有答案,而不是将人与计算机进行比较
答案 0 :(得分:2)
这一行有两个很大的错误,代码中有很多类似的行:
if (Human.equals(2));
第一个错误是分号错了。 Java(像C和其他语言)有一个"空"声明只是一个没有别的分号,它什么也没做。你实际做的是
if (Human.equals(2))
/* do nothing */ ;
System.out.println("Rock crushes scissors, i win");
if
无效,println
无论if
是否为真都会发生if
。摆脱分号。此外,最好养成为if (Humans.equals(2)) {
System.out.println("Rock crushes scissors, i win");
}
的身体使用花括号的习惯,如
if
Java并不需要括号,但最好始终使用它们。一些公司和风格检查员确实需要括号。当您认为某个陈述是String
的一部分而且它不是时,它们有助于防止出现的错误。
第二个是您将Human
(false
)与整数(2)进行比较,但这不起作用。无论Human
是什么,这都将始终返回false
。 Java将允许您比较不同类的两个对象,但结果总是equals
,除非您已经编写了自己的自定义int
,可以比较两个不同类的对象(通常不是一个好主意) ,除非他们是同一祖先类的子类。)
看起来您想要将输入字符串解析为整数,给出int
,然后使用try
{
int HC = Integer.parseInt(Human.trim()); // i know this part is wrong
}
catch (NumberFormatException nfe)
{
进行比较。 (这对用户来说有点混乱,因为你还没有告诉他们输入一个号码。但是我会同意它,因为它让我做了几个其他重点。)这是你尝试了什么:
catch
其余逻辑位于Human
内,这意味着只有当catch
不有效整数时它才会执行,这可能不是什么你要。 try
块中的代码仅在发生异常时执行。您可以通过将其余逻辑移动到HC
块(花括号之间)来解决此问题,然后该代码可以比较Human
而不是if (HC == 2) {
System.out.println("Rock crushes scissors, i win");
}
,如下所示:
catch
您可以做的另一件事是先关闭int HC;
try
{
HC = Integer.parseInt(Human.trim()); // i know this part is wrong
}
catch (NumberFormatException nfe)
{
HC = -1;
}
块。你可以这样做:
int HC = Integer.parseInt(Human.trim());
我不建议以这种方式处理异常,但我这样做是为了说明问题。如果您在try
,的花括号内说catch
,则只能在那些花括号中看到它。因此,HC
块下方的逻辑无法看到HC
。通过将catch
的声明移到这些花括号之外,现在if (Human.equals(2))
块之后的逻辑可以看到它。那么你可以再次将if (HC == 2)
更改为
$countries = $_POST['countries'];
$user_id = $_SESSION['user_session'];
$countriesValues = implode(',', $countries);//store country values as a set
$count = $trade_info->update_supplier_last_financial_count($user_id, $countriesValues);
答案 1 :(得分:0)
从代码的开关部分看,您接受用户输入为整数吗?
如果是这种情况,为什么不使用nextInt()
来读取int输入而不是nextLine()
?
答案 2 :(得分:0)
我建议给用户一个菜单,提示他们输入一个可以轻松用来与随机整数进行比较的整数,而不是笨拙的try / catch块,例如:
Scanner keyboard = new Scanner(System.in);
System.out.println("Make Selection:");
System.out.println("1) Rock");
System.out.println("2) Paper");
System.out.println("3) Scissors ");
int choice = keyboard.nextInt()-1;
如果你需要接受一个字符串是你的赋值的一部分,那么使用equals方法将字符串转换为if语句的整数。
int choice;
string human= keyboard.nextLine();
if(human.equals("Rock")){
choice = 0;
}else if(human.equals("Paper"){
choice = 1;
}else if(human.equals("Scissors"){
choice = 2;
}else{
System.out.print("Invalid Selection");
}
您的代码中还有其他错误(请注意注释),但这至少应该为您提供一些选项来克服将用户输入转换为程序可以轻松使用的内容。
答案 3 :(得分:0)
首先,我想记下原始代码中导致一些错误的问题。
}
以关闭课程。if
语句的末尾不应该有分号,而应该在if语句之前有一个左括号{}
。现在有人说你可以不使用括号,但只有if
语句前面的行才会嵌套在if
语句>下。try...catch
应该用于捕获程序中的任何错误并正确处理它们。对于您的代码,您使用它来帮助运行程序;这是不好的做法,应该尽可能避免。现在,为了解决您的问题,我无法使用您在此处显示的逻辑看到这样做的方法。在您的算法中:
这里的错误是,根据您期望的输入,您将始终失败try/catch
并且永远不会将用户的输入实际转换为数字。这会导致以后出现错误,因为if
语句正在检查Human
的值,看它是不是数字,而不是。
正如在不同的答案中所提到的,您可以将输入更改为接受并期望数字而不是字符串(即“输入数字:Rock = 0,Paper = 1,Scissors = 2:”)。这将从一开始就处理数字问题,并有助于简化代码。
解决它的另一种方法是,如果你更愿意坚持使用文本输入而不是数字,那么将包括一个简单的开关来将用户的输入转换为数字。例如:
int humanNumber = -1;
int rock = 0;
int paper = 1;
int scissors = 2;
switch(Human) {
case 'rock':
humanNumber = rock;
break;
case 'paper':
humanNumber = paper;
break;
case 'scissors':
humanNumber = scissors;
break;
default:
System.out.println("Invalid input");
}
执行此操作将允许输入保留为文本,将文本转换为数字并处理任何不需要的输入。
我想建议使用的最终解决方案是:
public static void main(String[] args) {
int rock = 0, paper = 1, scissors = 2;
int computer = -1, human = -1;
String input;
Scanner keyboard = new Scanner(System.in);
System.out.println("Rock, paper, or scissors?");
input = keyboard.nextLine();
System.out.println("You chose " + input);
switch(input.toLowerCase()) {
case "rock":
human = rock;
break;
case "paper":
human = paper;
break;
case "scissors":
human = scissors;
break;
default:
System.out.println("Invalid input");
}
if (human >= 0) {
Random generator = new Random();
computer = generator.nextInt(3);
System.out.println(human + " " + computer);
switch(computer) {
case 0:
System.out.println("I chose Rock");
if (human == scissors)
System.out.println("Rock crushes scissors, i win");
else if (human == rock)
System.out.println("You must be psychic, i chose rock too!");
else
System.out.println("paper covers rock, i lost");
break;
case 1:
System.out.println("I chose Paper");
if (human == rock)
System.out.println("Paper covers rock, you lose");
else if (human == paper)
System.out.println("It's a tie!");
else
System.out.println("Paper covers rock, i lost");
break;
case 2:
System.out.println("I chose scissors");
if (human == paper)
System.out.println("scissors cut through paper, i win.");
else if (human == scissors)
System.out.println("We both chose scissors");
else
System.out.println("Rock smashed scissors, i lost");
break;
}
}
}