2015-12-12 63 views
1

我有以下3種方法:(JAVA)計劃在點忽略掃描器我想輸入一個字符串

  1. 方法:將一個文本和分裂,特別字符串的話,並把它們放入一個字符串陣列。

    public static String[] generateStringArray(String text) { 
        if (text.isEmpty()) { 
         throw new IllegalArgumentException(MSG_STRING_EMPTY); 
        } 
    
        // split pattern for all non word characters 
        return text.trim().split("\\W+"); 
    } 
    
  2. 方法:計數在僅由出大寫或小寫字母的字符串數組的量。

    public static int countLowerUpperCaseStrings(String[] stringArray) { 
        if (stringArray.length == 0) { 
         throw new IllegalArgumentException(MSG_ARRAY_LENGTH_ZERO); 
        } 
    
        String convertedString; 
        int counter = 0; 
        char a; 
        char b; 
    
        for (int i = 0; i < stringArray.length; i++) { 
         a = stringArray[i].charAt(0); 
         b = stringArray[i].toLowerCase().charAt(0); 
    
         if (a == b) { 
          convertedString = stringArray[i].toLowerCase(); 
         } else { 
          convertedString = stringArray[i].toUpperCase(); 
         } 
    
         if (stringArray[i].compareTo(convertedString) == 0) { 
          counter++; 
         } 
        } 
        return counter; 
    } 
    
  3. 方法:實際的方法,通過掃描儀輸入文本並調用其他方法。

    public void numberOfUpperLowerCaseStrings() { 
        String text; 
        String[] stringArray; 
    
        System.out.println("Enter a text:"); 
        text = input.nextLine(); 
        stringArray = Algorithmen.generateStringArray(text); 
    
        System.out.println(Algorithmen.countLowerUpperCaseStrings(stringArray)); 
    } 
    

注意Algorithmen是其中定義的前兩個(靜態)方法的類的名字。

我測試了前兩種方法,它們工作得很好。

現在,問題就會起作用,如果我打電話給第三種方法首先通過Scanner生成文本。但是不知何故,代碼只是跳過文本= input.nextLine();並拋出異常(MSG)字符串爲空。文本「輸入文本:」被執行,緊接着是異常。但我無法輸入任何文字。

如果我將input.nextLine();更改爲input.next(),我可以輸入文本,但在此之後,最終會陷入無限循環的異常。

那麼爲什麼我不能輸入文字?

我有另外兩種方法input.nextLine工作得很好。

+0

您可能先前調用過input.nextInt()或其他東西,並且錯誤地認爲它讀取整數後面的EOL字符。因此,nextLine()的後續調用只讀取行的結尾,並返回一個空字符串。刪除所有經過測試並找到的無關代碼。向我們展示掃描儀定義和使用的代碼。 –

+1

你在哪裏初始化'input'掃描儀?在此之前,你最可能讀的是其他東西,比如整數。 –

+0

可能是http://stackoverflow.com/questions/16040601/why-is-nextline-returning-an-empty-string –

回答

0

我能想到的這種行爲的唯一原因是您可能使用相同的掃描儀對象來掃描前面的整數(未在代碼中顯示)。

如果你沒有,

  • 只是放置一個input.nextLine()input.nextInt()後清除緩衝區

  • input.nextInt()Integer.parseInt(input.nextLine())取代。

+0

**注:**就個人而言,我更喜歡後者的做法。嘗試一下,讓我知道結果。 – user3437460

+0

是的,這可能是問題所在。當我以靜態方式定義Scanner變量時,所有其他方法共享此變量。當我爲該方法專門定義了一個新的掃描儀變量時,它開始正常工作。 – Strict

+0

後一種方法與前者不一樣。前者讀取本地整數,而不讀取後者。例如,在美國的語言環境中,輸入123,456對前者可以正常工作,但對後者不起作用。 –