2015-08-13 71 views
1

我放棄了。我想弄清楚爲什麼我的代碼返回第一個(不正確的)值。如何從掃描儀返回有效的輸入?

例如:

public static String lastName() { 

    System.out.println("Last Name: "); 
    String lastName = input.nextLine(); 
    String dataCheck = "[a-zA-Z]{1,77}"; 
    Pattern pattern = Pattern.compile(dataCheck); 
    Matcher patternMatcher = pattern.matcher(lastName); 

    if(!patternMatcher.matches()){ 
     do{ 
      System.out.println("Incorrect input:\n" 
        + "1) Shorten the first name less than 77 characters;\n" 
        + "2) Only alphabet characters are allowed (no numbers or special characters.)\n\n" 
        + "Please enter Last Name: "); 
      lastName(); 

     } 
      while (!patternMatcher.matches()); 

    } 
    return lastName; 
} 
public static void recall(String lastName){ 
    System.out.println(lastName); 
} 

會發生什麼事,如果我輸入了不正確的輸入,掃描儀「專賣店」的第一個輸入,只使用它;如果輸入正確,則繼續。迄今爲止的研究告訴我要廢除正則表達式,並使用input.hasNextLine()。任何幫助,將不勝感激。

回答

1

您正在進行遞歸調用,但沒有使用結果......因此,一旦您退出循環,您只是從最上面的堆棧框架中返回lastName變量如果更改此設置:

lastName(); 

這樣:

return lastName(); 

那麼威力工作。這並不完全清楚,因爲我的代碼結構不清楚。

從根本上說,目前尚不清楚爲什麼要遞歸同時循環。這對我來說是一個非常糟糕的主意。計算你想要在迭代中做什麼(可能:顯示選項;讀一行;檢查行),並把所有這些放在循環中。因此,像(僞代碼):

do { 
    display-menu 
    ask-for-input 
} while (test-to-check-it's-not-valid) 

此外,我想重溫你的命名 - 像getLastName()readLastName()東西將是不僅僅是lastName()方法更清晰的 - 尤其當你有一個名爲lastName內的局部變量方法。

+0

它的工作!我不知道你可以返回一種方法!我肯定有代碼修改。謝謝!! – user130110

+0

這是jon飛碟誰回答你ofc它會工作! – QuakeCore

+0

@ user130110:它不返回方法 - 它返回方法調用返回的值。如果這對你來說是新的,我會強烈建議你放下正則表達式,並且稍微學習一點這個語言的核心。即使小修改起作用,這並不意味着它是最好的方法 - 請仔細閱讀其餘答案。 –