如何在while循环之外的while循环中访问字符串值,所有这些都在方法内部

时间:2015-03-05 01:32:20

标签: java

程序本身应该接受用户输入,然后在设置Mad Lib的设置中读取它。用户键入名词,动词,形容词等,然后将其全部以故事的形式打印到控制台。

import java.util.Scanner;

public class CSFacts {

    //first method
    public static String Noun(int on)   {           //Start first user input, start with noun
        String noun1;
        Scanner input=new Scanner(System.in);
            while (on==1)   {
                System.out.println("Please enter a Noun.");     //prompt user to input a noun to be used in the main program
                noun1=input.nextLine(); 
                on=on-1;}
            while (on==0)   {
                noun1=input.nextLine(); }
            return noun1;
        //return the noun as a string to be used in the main program
    }
    public static void main(String[] args)  {
        Noun(1);
        System.out.println("Be kind to your "+Noun(0));
    }

我面临的问题是,名词1在它方面不会与我合作,不会从一个参数传递到另一个参数。我需要将noun1从on = 1转换为on = 0,这样当第二次调用该方法时,它会读取"善待你的(插入名词1)"。我似乎无法弄清楚如何携带它。这只是我实验室的一部分,但如果我能弄清楚如何做到这一点,我可以将其与其他方法联系起来。

2 个答案:

答案 0 :(得分:1)

你似乎有一个无限循环:

while (on==0)   {
    noun1=input.nextLine(); }

您使用Noun(1)调用方法,因此on为1.您的第一个循环将运行一次,然后结束,将on设置为0.您的第二个循环将永远运行,因为它永远不会改变on,但会一直持续到它发生变化,这种情况永远不会发生。

要回答您的实际问题,noun1在方法Noun()中定义,因此它是一个局部变量,不能在其他任何地方使用。要解决这个问题,您可以将其定义为Noun()之外的静态变量,如下所示:

static String noun1;

另一种选择就是使用主方法中Noun()返回的值,而不是丢弃它,就像你正在做的那样:

String noun1 = Noun(1);

答案 1 :(得分:0)

程序的控制流程似乎存在混淆。请记住,您的程序是指令序列。如果您仔细地逐步跟踪控制流程,您将发现一些问题。我将帮助详细说明您的计划所做的事情,我会留给您解释它。

public static void main(String[] args)  {
    Noun(1);                                         // (0)
    System.out.println("Be kind to your "+Noun(0));  // (1)
}

我添加了注释来标记每个语句。您的程序始终以main方法和第一个语句开头。这是main的作用。

  • (0)使用Noun致电on = 1,转到(1)
  • (1)
    • 使用Noun致电on = 0,将结果存储在tmp1
    • tmp1中存储的字符串附加到"善待您的",存储在tmp1
    • 打印存储在tmp1
    • 中的字符串

我向(1)添加了额外的详细信息,并发明了变量名称tmp1以简化说明 - 您的程序会将数据存储在某处。

重要的是要注意调用函数会产生对该函数的控制。这意味着调用者在被调用者执行了所有语句之前不会执行下一个语句。

public static String Noun(int on)   {
    String noun1;                                   // (0)
    Scanner input = new Scanner(System.in);         // (1)
    while (on == 1) {                               // (2)
        System.out.println("Please enter a Noun."); // (3)
        noun1 = input.nextLine();                   // (4)
        on = on - 1;                                // (5)
    }
    while (on == 0) {                               // (6)
        noun1 = input.nextLine();                   // (7)
    }
    return noun1;                                   // (8)
}

以下是Noun函数的作用。

  • (0)noun1初始化为null,转到(1)
  • (1)构建一个新的Scanner对象并存储在input中,转到(2)
  • (2)如果on == 1转到(3)其他转到(6)
  • (3) print"请输入名词。",转到(4)
  • (4)阅读一行输入并存储到noun1,转到(5)
  • (5)on - 1存储到on,转到(2)
  • (6)如果on == 0转到(7)其他转到(8)
  • (7)阅读一行输入并存储到noun1,转到(6)
  • (8)暂停并返回noun1
  • 的值

请注意,仅考虑Noun本身就存在一些问题。我将专注于一个,以帮助您开始。

如果on不等于0或1,则Noun将返回null,这就是您的IDE警告您的原因。为什么?要回答这个问题,我们只需要假设on既不是0也不是1的假设情况,然后手动执行Noun函数。

为简单起见,我将选择on为3.我会在函数执行时跟踪所有变量的状态。在状态的左边,我将指出我正在执行的语句,我只是通过遵循程序来决定。

  1. (0) on = 3, noun1 = null
  2. (1) on = 3, noun1 = null, input = new Scanner(System.in)
  3. (2)前往(6),因为on不等于1 on = 3, noun1 = null, input = new Scanner(System.in)
  4. (6)前往(8),因为on不等于0 on = 3, noun1 = null, input = new Scanner(System.in)
  5. (8)暂停并返回noun1 on = 3, noun1 = null, input = new Scanner(System.in)
  6. 的值

    我怀疑变量范围也存在混淆。这表示变量的生命周期。我将简要提一下,当函数暂停(返回值或抛出异常)时,函数中声明的变量将被销毁(超出范围)。