# Java Programm, das kleine Buchstaben in einem String zählen soll und bei großen Buchstaben oder Sonderzeichen abbrechen soll



## f61 (24. Dezember 2020)

```
public class CountLetters {
   static int count_lower_case_letters(String s){
     int zaehler=0;
     int i=0;

        
        while (Character.isLowerCase(s.charAt(i))||(Character.isUpperCase(s.charAt(i)))){
            
          
        if (Character.isLowerCase(s.charAt(i)>Character.isUpperCase(i))){
            zaehler++;
            
        
        }else if(Character.isUpperCase(s.charAt(i))){
            return zaehler;
        }
        i++;
    }
        return zaehler;
  
}
    public static void main(String[] args) {
        String s="bszhdufhisdhifheis";
       System.out.println(count_lower_case_letters(s));
    }
}
```

Das hier ist mein Ansatz. Etwas klappt aber noch nicht ganz ich würde mich sehr über eure Hilfe freuen.


----------



## melmager (25. Dezember 2020)

Da du ja scheinbar nur Kleinbuchstaben zählen willst muss deine while schleife nur ausgeführt werden wenn einer vorliegt und abbrechen wenn das letzte zeichen vorliegt.


```
while (Character.isLowerCase(s.charAt(zaehler)) && zaehler < s.length()) {
   zaehler++;
}
```


----------



## f61 (27. Dezember 2020)

melmager hat gesagt.:


> Da du ja scheinbar nur Kleinbuchstaben zählen willst muss deine while schleife nur ausgeführt werden wenn einer vorliegt und abbrechen wenn das letzte zeichen vorliegt.
> 
> 
> ```
> ...


Ich danke dir. Jedoch besteht ein Problem, dass ich bis jetzt noch nicht lösen konnte und zwar erscheinen folgende Meldungen sobald ich nur kleine Buchstaben in meinen String eingebe: 
Exception in thread "main" java.lang.StringIndexOutOfBoundsException
        at java.base/java.lang.String.charAt(String.java:1325)
        at CountLetters.count_lower_case_letters(CountLetters.java:6)
        at CountLetters.main(CountLetters.java:15)
Diese Meldungen erscheinen überraschenderweise nur dann wenn ich nur kleine Buchstaben eingebe, sobald ich einen großen Buchstaben eingebe tut das Programm was es tun soll.

Ich würde mich über deine Hilfe freuen.


----------



## melmager (28. Dezember 2020)

Bei der Meldung will er ausserhalb der Stringlänge zugreifen


```
zaehler <= s.length()
```

er zählte also zu weit hoch, mit der Änderung sollte es passen

oder

```
s.length() > zaehler
```


----------



## f61 (28. Dezember 2020)

melmager hat gesagt.:


> Bei der Meldung will er ausserhalb der Stringlänge zugreifen
> 
> 
> ```
> ...


Ich bedanke mich vielmals. Die Meldungen erscheinen dennoch.


----------



## ComFreek (29. Dezember 2020)

Dann debugge dein Programm doch mit dem Debugger 
Den Debugger muss man als Programmierer so oder so irgendwann beherrschen.


----------



## f61 (29. Dezember 2020)

ComFreek hat gesagt.:


> Dann debugge dein Programm doch mit dem Debugger
> Den Debugger muss man als Programmierer so oder so irgendwann beherrschen.


Danke für den Tipp. Das ganze führt jedoch zum gleichen Ergebnis.


----------



## melmager (29. Dezember 2020)

```
while (s.length() > zaehler && Character.isLowerCase(s.charAt(zaehler))) {
   zaehler++;
}
```

wenn dann immer noch der fehler auftritt gebe ich auf - die version sollte das "und" abbrechen wenn die länge des strings erreicht ist

"abc" hat ja die länge 3 ; charAt darf max  mit 2 arbeiten - wenn also der zähler 3 ist darf das nicht mehr ausgewertet werden.

wenn c dran ist : zaehler ist 2; also hoch um 1 = 3; dann ist aber length bein nächsten while lauf nicht mehr grösser zaehler und der zweite teil von && wird nicht mehr ausgewertet

Wir lernen : reihenfolge in auswertungen ist nicht egal und > bzw >= bzw < kann zum fallstrick werden


----------



## f61 (29. Dezember 2020)

melmager hat gesagt.:


> ```
> while (s.length() > zaehler && Character.isLowerCase(s.charAt(zaehler))) {
> zaehler++;
> }
> ...


Es hat jetzt geklappt. 
Ich danke dir für deine Bemühungen, ich habe das ganze jetzt auch verstanden.
Viele Grüße.


----------



## ComFreek (30. Dezember 2020)

f61 hat gesagt.:


> Danke für den Tipp. Das ganze führt jedoch zum gleichen Ergebnis.


Das verstehe ich nicht. Welches Ergebnis meinst du?
Hast du Breakpoints gesetzt? Hast du Watches erstellt?


----------

