问题描述
为此,我使用了很多嵌套的if / else语句。
我有三个主要分支(活动物,活植物,非生物),每个分支都有多个分支。 做出60个不同的决定。
我很难让它合作,并控制所有的if / else语句。 我没有太多代码,因为必须重新启动这么多,但目前我在:
System.out.println("Think of Something");
System.out.println("Is it a living animal, living plant, or non-living thing? ");
String user = get.nextLine();
if (user.equals("living animal")); {
//starts animal tree
System.out.println("Does it have feathers, fur, or neither?");
String user2 = get.nextLine();
if (user2.equals("feathers")); {
System.out.println("is it bigger than a soccer ball?");
}
} else if (user2.equals("fur")); {
System.out.println("is it domesticated?");
// end animal tree
} else if (user.equals("living plant")); {
// start plant tree
System.out.println("is it a tree?");
}
} // end method
} //end program
1楼
您正在使用以下语法编写if
语句:
if (user2.equals("feathers"));
{
System.out.println("is it bigger than a soccer ball?");
}
但是, if
块的主体将始终执行,因为您有一个分号,过早地完成语句:
if (user2.equals("feathers")); // <-- The semicolon here finishes the if statement, which means the if statement does nothing
{
System.out.println("is it bigger than a soccer ball?"); // <-- This line is ran no matter what the if statement was
}
基本上,要使if
或else if
语句正常工作,你需要做的就是删除不需要的分号。
2楼
作为一个例子,如何解决一个复杂的问题来应对。 准备好使用程序开箱即用并不是一件容易的事。
它的回答是如何在“让它合作时遇到很多麻烦并控制所有if / else语句”时简化问题。 如果你想要这种情况的策略。
我也为了示范而稍微过分了一些事情。 在实践中,你做的似乎很方便。 另外:为了简单起见,我将所有内容都设置为静态 - 在增长的应用程序中,您肯定会使用实例。
第1步:您从一个非常简单的类框架开始。 简单是关键。 不要放在里面。 只是勾勒出你想要它做的事情:
public class TwentyQuestions{
static void mainQuestioning(){
System.out.println("Is it a living animal, living plant, or non-living thing? ");
String user = get.nextLine();
switch(user){
case "living animal" :
askLivingAnimalQuestions();
break;
case "living plant":
askLivingPlantQuestions();
break;
case "non-living":
askNoneLivingQuestions();
break;
default:
handleWrongInput();
}
}
}
当然,上面的内容将无法编译,因为现在没有实现细节(缺少一些方法) - 但请注意问题如何简化了很多(没有嵌套if),并且最有可能你可以看到它应该是什么做。 保持简单,直接是关键。
第2步:现在您可以轻松创建到目前为止绘制的方法。 让我们这样做:
public class TwentyQuestions{
static void handleWrongInput(){
System.err.println("I am no longer playing with you as you don't answer my question properly");
System.exit(1);
}
static void askLivingAnimalQuestions(){
System.out.println("Does it have feathers, fur, or neither?");
String user = get.nextLine();
switch(user){
case "feathers":
askLivinAnimalWithFeathersQuestions();
break;
case "fur":
askLivinAnimalWithFurQuestions();
break;
default:
handleWrongInput();
}
}
static void askLivingPlantQuestions(){
System.out.println("is it a tree?");
String user = get.nextLine();
if("yes".equals(user)){
System.out.println("So its a tree!");
return;
}
}
static void askNoneLivingQuestions(){
System.out.println("WhateverNoneLivingQuestion ?");
String user = get.nextLine();
switch(user){
//add possible responses here.
default:
handleWrongInput();
}
}
static void mainQuestioning(){
System.out.println("Is it a living animal, living plant, or non-living thing? ");
String user = get.nextLine();
switch(user){
case "living animal" :
askLivingAnimalQuestions();
break;
case "living plant":
askLivingPlantQuestions();
break;
case "non-living":
askNoneLivingQuestions();
break;
default:
handleWrongInput();
}
}
}
现在我更加打破了这个问题。 但它仍然/不会再编译,因为有毛皮的动物和有羽毛的动物缺少方法。
第3步:实现它们:
public class TwentyQuestions{
static void handleWrongInput(){
System.err.println("I am no longer playing with you if you don't answer my question properly");
System.exit(1);
}
static void askLivinAnimalWithFeathersQuestions(){
System.out.println("is it bigger than a soccer ball?");
String user = get.nextLine();
//don't know how you want to continue;
//....
}
static void askLivinAnimalWithFurQuestions(){
System.out.println("is it domesticated?");
String user = get.nextLine();
//don't know how you want to continue;
//....
}
static void askLivingAnimalQuestions(){
System.out.println("Does it have feathers, fur, or neither?");
String user = get.nextLine();
switch(user){
case "feathers":
askLivinAnimalWithFeathersQuestions();
break;
case "fur":
askLivinAnimalWithFurQuestions();
break;
default:
handleWrongInput();
}
}
static void askLivingPlantQuestions(){
System.out.println("is it a tree?");
String user = get.nextLine();
if("yes".equals(user)){
System.out.println("So its a tree!");
return;
}
}
static void askNoneLivingQuestions(){
System.out.println("WhateverNoneLivingQuestion ?");
String user = get.nextLine();
switch(user){
//add possible responses here.
default:
handleWrongInput();
}
}
static void mainQuestioning(){
System.out.println("Is it a living animal, living plant, or non-living thing? ");
String user = get.nextLine();
switch(user){
case "living animal" :
askLivingAnimalQuestions();
break;
case "living plant":
askLivingPlantQuestions();
break;
case "non-living":
askNoneLivingQuestions();
break;
default:
handleWrongInput();
}
}
}
注意你所有嵌套的if / else如何导致你的麻烦消失了。
完成:现在如果你另外实现了缺少的问题并添加了一个在main(String [] args)中初始化的Scanner“get”,你应该在那里。 现在应该很容易。
嗯..这可能会为你提供20个嵌套问题的方法:这是由于你拥有的可能性。 你必须处理那么多问题和答案。 没办法绕过它。 更好地将它们干净地放在他们自己的专用地方,而不是在某个地方流浪(你整理并把所有东西都放在它的位置 - 你必须处理的案件/问题的数量保持不变)。
但是,在成熟的应用程序中,您可以将所有问题和答案放在像树一样的数据结构中。 有了这个,你可以避免大量的方法,并有一些通用的方法,而只是走在树上....
[你也可以创建临时方法,对你需要的东西不做任何事情(“存根”),但还没有实现,以便在你开发的时候进行编译。 ]
以下是作为完整类的示例,它编译并执行到目前为止的提问:
import java.util.Scanner;
/**
*
* @author Kai
*/
public class TwentyQuestions {
static Scanner get = new Scanner(System.in);
static void handleWrongInput() {
System.err.println("I am no longer playing with you if you don't answer my question properly");
System.exit(1);
}
static void askLivinAnimalWithFeathersQuestions() {
System.out.println("is it bigger than a soccer ball?");
String user = get.nextLine();
//don't know how you want to continue;
//....
}
static void askLivinAnimalWithFurQuestions() {
System.out.println("is it domesticated?");
String user = get.nextLine();
//don't know how you want to continue;
//....
}
static void askLivingAnimalQuestions() {
System.out.println("Does it have feathers, fur, or neither?");
String user = get.nextLine();
switch (user) {
case "feathers":
askLivinAnimalWithFeathersQuestions();
break;
case "fur":
askLivinAnimalWithFurQuestions();
break;
default:
handleWrongInput();
}
}
static void askLivingPlantQuestions() {
System.out.println("is it a tree?");
String user = get.nextLine();
if ("yes".equals(user)) {
System.out.println("So its a tree!");
return;
}
}
static void askNoneLivingQuestions() {
System.out.println("WhateverNoneLivingQuestion ?");
String user = get.nextLine();
switch (user) {
//add possible responses here.
default:
handleWrongInput();
}
}
static void mainQuestioning() {
System.out.println("Is it a living animal, living plant, or non-living thing? ");
String user = get.nextLine();
switch (user) {
case "living animal":
askLivingAnimalQuestions();
break;
case "living plant":
askLivingPlantQuestions();
break;
case "non-living":
askNoneLivingQuestions();
break;
default:
handleWrongInput();
}
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
mainQuestioning();
}
}
示例运行:
Is it a living animal, living plant, or non-living thing?
living animal
Does it have feathers, fur, or neither?
fur
is it domesticated?
yes
BUILD SUCCESSFUL (total time: 30 seconds)
3楼
你没有使用if else正确可能是适当的缩进和评论也可以帮助你在这种情况下。
System.out.println("Think of Something"); System.out.println("Is it a living animal, living plant, or non-living thing? "); String user = get.nextLine(); // start method if (user.equals("living animal")); { //starts animal tree System.out.println("Does it have feathers, fur, or neither?"); String user2 = get.nextLine(); if (user2.equals("feathers")); { System.out.println("is it bigger than a soccer ball?"); } else if (user2.equals("fur")); { System.out.println("is it domesticated?"); } } else if (user.equals("living plant")); { //starts plant tree System.out.println("is it a tree?"); } // end method