簡體   English   中英

如何在while循環之外,在while循環中,在方法內部始終訪問字符串值

[英]How to access a string value in a while loop, outside of a while loop, all while inside a method

該程序本身應該接受用戶輸入,然后在設置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不會與我合作,盡管它不會從一個參數傳遞到另一個參數。 我需要名詞1從on = 1到on = 0進行攜帶,以便在第二次調用該方法時顯示為“對您的(插入名詞1)好一些”。 我似乎無法弄清楚如何將其保留下來。 這只是我實驗的一部分,但是如果我能弄清楚如何做到這一點,則可以將其包含在其他方法中。

您似乎有一個無限循環:

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

你叫你的方法, Noun(1)這樣on為1.您的第一個循環運行一次,然后結束,設定on為0,然后你的第二個循環將永遠運行,因為它永遠不會改變on ,但一直走,直到它被改變,這將永遠不會發生。

為了回答您的實際問題, noun1是在方法Noun()定義的,因此它是一個局部變量,不能在其他任何地方使用。 為了解決這個問題,您可以將其定義為Noun()之外的靜態變量,如下所示:

static String noun1;

另一種選擇是在您的main方法中使用從Noun()返回的值,而不是像這樣做那樣將其丟棄:

String noun1 = Noun(1);

程序的控制流程似乎有些混亂。 請記住,您的程序是一系列指令 如果您仔細地逐步跟蹤控制流,則會發現一些問題。 我將幫助您詳細說明您的程序的工作方式,然后由您自行決定。

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

我添加了注釋以標記每個語句。 您的程序始終從main方法和第一條語句開始。 這是main功能。

  • (0)on = 1呼叫Noun ,轉到(1)
  • (1)
    • 調用on = 0 Noun ,將結果存儲在tmp1
    • 將存儲在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 (1)初始化為null ,轉到(1)
  • (1)構造一個新的Scanner對象並將其存儲在input ,轉到(2)
  • (2)如果on == 1轉到(3)否則轉到(6)
  • (3)打印“請輸入名詞。”,轉到(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)on = 3, noun1 = null, input = new Scanner(System.in)

我懷疑變量范圍也會引起混淆。 這表明變量的生存期。 我將簡要地提及一下,當函數暫停(返回值或引發異常)時,在函數中聲明的變量將被破壞(超出范圍)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM