# Wo ist mein Fehler?



## Karl Hermann (14. Feb 2011)

Könnt ihr mir mal sagen, wo mein Fehler liegt? Das Programm zeigt mir einen error!!!


```
import java.util.Scanner;
/**
  *
  * Dieses Programm prüft, ob es sich dei dem eingegeben Wort
  * um ein Palindrom handelt. Palindrome sind Wörter, wie Uhu,
  * Lagerregal, Rentner, Rotor, Otto oder Reittier. Die Eingabe
  * erfolgt über die Konsole.
  *
  * @version 1.0 vom 14.02.2011
  * @author Karl Hermann
  */

public class Palindrom{
   public static void main(String[]args){
   Scanner sc = new Scanner(System.in);
      int lenge,i,leeranz=0,k=0;
      //Wort eingeben
      System.out.print("Eingabe: ");
      char[]wort = sc.nextChar();
      lenge=wort.length;
      boolean Palindrom=true;

      for(i=0;i<wort.length;i++){ //Prüft ob Leerzeilen Vorhanden sind und zählt sie mit
         if(wort[i]>=65&&wort[i]<=91||wort[i]>=97&&wort[i]<=123){

         }else{
            leeranz++;
         }
      }

      if(leeranz==0){ //Ohne leerzeilen das wort auf palindrom prüfen

         System.out.print("Das Wort lautet:\t");

         for(i=0;i<wort.length;i++){
            System.out.print(wort[i]);
            //Großbuchstaben in Kleinbuchstaben umwandeln
            if(wort[i]>=65&&wort[i]<=91){
               wort[i]=(char)(wort[i]+32);
            }
            //wenn das erste Wort != dem letzten Wort->Palindrom=false
            if(wort[i]!=wort[wort.length-(i+1)]){
               Palindrom=false;
            }
         }

         //Ausgabe
         if(Palindrom==false){
            System.out.print("\n\t\t->Es ist kein Palindrom!");
         }else{
            System.out.print("\n\t\t->Es ist ein Palindrom!");
         }
      }

      if(leeranz>0){//Mit leerzeilen den Satz in ein anderes Array schreiben, und die Leerzeilen bzw. sonderzeichen auslassen

         System.out.print("Der Satz lautet:\t");
         for(i=0;i<wort.length;i++){  //Satz in Urzustand ausgeben
          System.out.print(wort[i]);
         }

         char[]wort2=new char[wort.length-leeranz];
         for(i=0;i<wort.length;i++){ //Satz ohne Sonderzeichen in eigenes Array
            if(wort[i]>=65&&wort[i]<=91||wort[i]>=97&&wort[i]<=123){
               wort2[k]=wort[i];
               k++;
            }
         }
         System.out.println();
         for(i=0;i<wort2.length;i++){//Großbuchstaben auf Kleinbuchstaben machen
          if(wort2[i]>=65&&wort2[i]<=91){
        wort2[i]=(char)(wort2[i]+32);
          }
         }
         for(i=0;i<wort2.length;i++){//Prüfen wie ein Wort
          if(wort2[i]!=wort2[wort2.length-(i+1)]){
               Palindrom=false;
          }
         }

         System.out.println();
         if(Palindrom==true){//Ausgabe ob Palindrom oder nicht
          System.out.println("----> Ist ein Palindrom");
         }else{
          System.out.println("----> Ist kein Palindrom");
         }
      }
   }
}
```


----------



## C.Hermanos (14. Feb 2011)

Hi,
schau mal wie schön man hier Java Codes anzeigen kann:


```
System.out.println("");
```

Wieso machst du das nicht auch so?


----------



## HoaX (14. Feb 2011)

Dann verrate uns doch einfach welchen Fehler er ausspuckt?!


----------



## Karl Hermann (14. Feb 2011)

Hier die Fehlermeldung!!!


```
Compiliere h:\Java Anwendungen\Palindrom.java mit Java-Compiler
Palindrom.java:19:22: cannot find symbol
symbol  : method nextChar()
location: class java.util.Scanner
      char[]wort = sc.nextChar();
                     ^
1 error
```


----------



## Gonzo17 (14. Feb 2011)

Es gibt nunmal schlicht und ergreifend keine Methode 
	
	
	
	





```
nextChar()
```
 in der Klasse 
	
	
	
	





```
java.util.Scanner
```
. Stattdessen kannst du zB einfach 
	
	
	
	





```
next()
```
 verwenden, das liefert dir einen String.


----------



## Karl Hermann (14. Feb 2011)

Ok, hab ich geändert, jetzt zeigt er mir aber so etwas:


```
Compiliere h:\Java Anwendungen\Palindrom.java mit Java-Compiler
Palindrom.java:19:27: incompatible types
found   : java.lang.String
required: char[]
      char[]wort = sc.next();
                          ^
1 error
```


----------



## tfa (14. Feb 2011)

next() liefert einen String. Den kann man nicht in eine Variable vom Typ char[] stecken.


----------



## Gonzo17 (14. Feb 2011)

Naja ein bisschen musst du ja auch mitdenken. Du erwartest ein char-Array, aber die Methode gibt einen String zurück. Ist doch klar, dass es da knallt. Solltest dir überlegen ob du entweder den String in ein char-Array umwandelst (gibt sogar eine Methode, die das für dich macht) oder gleich mit einem String statt einem char-Array arbeitest.


----------



## Karl Hermann (14. Feb 2011)

Ach ist das Kompliziert.
Ich will doch nur die Eingabe über die Konsole haben.


```
import java.util.Scanner;
/**
  *
  * Dieses Programm prüft, ob es sich dei dem eingegeben Wort
  * um ein Palindrom handelt. Palindrome sind Wörter, wie Uhu,
  * Lagerregal, Rentner, Rotor, Otto oder Reittier. Die Eingabe
  * erfolgt über die Konsole.
  *
  * @version 1.0 vom 14.02.2011
  * @author Karl Hermann
  */

public class Palindrom{
   public static void main(String[]args){
   Scanner sc = new Scanner(System.in);
      int lenge,i,leeranz=0,k=0;
      //Wort eingeben
      System.out.print("Eingabe: ");
      String wort = sc.next();
      lenge=wort.length;
      boolean Palindrom=true;

      for(i=0;i<wort.length;i++){ //Prüft ob Leerzeilen Vorhanden sind und zählt sie mit
         if(wort[i]>=65&&wort[i]<=91||wort[i]>=97&&wort[i]<=123){

         }else{
            leeranz++;
         }
      }

      if(leeranz==0){ //Ohne leerzeilen das wort auf palindrom prüfen

         System.out.print("Das Wort lautet:\t");

         for(i=0;i<wort.length;i++){
            System.out.print(wort[i]);
            //Großbuchstaben in Kleinbuchstaben umwandeln
            if(wort[i]>=65&&wort[i]<=91){
               wort[i]=(char)(wort[i]+32);
            }
            //wenn das erste Wort != dem letzten Wort->Palindrom=false
            if(wort[i]!=wort[wort.length-(i+1)]){
               Palindrom=false;
            }
         }

         //Ausgabe
         if(Palindrom==false){
            System.out.print("\n\t\t->Es ist kein Palindrom!");
         }else{
            System.out.print("\n\t\t->Es ist ein Palindrom!");
         }
      }

      if(leeranz>0){//Mit leerzeilen den Satz in ein anderes Array schreiben, und die Leerzeilen bzw. sonderzeichen auslassen

         System.out.print("Der Satz lautet:\t");
         for(i=0;i<wort.length;i++){  //Satz in Urzustand ausgeben
          System.out.print(wort[i]);
         }

         char[]wort2=new char[wort.length-leeranz];
         for(i=0;i<wort.length;i++){ //Satz ohne Sonderzeichen in eigenes Array
            if(wort[i]>=65&&wort[i]<=91||wort[i]>=97&&wort[i]<=123){
               wort2[k]=wort[i];
               k++;
            }
         }
         System.out.println();
         for(i=0;i<wort2.length;i++){//Großbuchstaben auf Kleinbuchstaben machen
          if(wort2[i]>=65&&wort2[i]<=91){
        wort2[i]=(char)(wort2[i]+32);
          }
         }
         for(i=0;i<wort2.length;i++){//Prüfen wie ein Wort
          if(wort2[i]!=wort2[wort2.length-(i+1)]){
               Palindrom=false;
          }
         }

         System.out.println();
         if(Palindrom==true){//Ausgabe ob Palindrom oder nicht
          System.out.println("----> Ist ein Palindrom");
         }else{
          System.out.println("----> Ist kein Palindrom");
         }
      }
   }
}
```


----------



## Sonecc (14. Feb 2011)

offtopic: den großen roten hinweistext zu ignorieren ist in den seltensten Fällen sinnvoll


----------



## ARadauer (14. Feb 2011)

```
char[] wort = sc.next().toCharArray();
```


----------



## Gonzo17 (14. Feb 2011)

Jetzt denkst du schon wieder nicht nach.
So wie du es gemacht hast kann es natürlich nicht funktionieren. Du behandelst die Variable 
	
	
	
	





```
wort
```
 wie ein char-Array, aber hast sie zu einem String gemacht. Ist doch irgendwie klar, dass das nicht funktionieren kann, oder?



Karl Hermann hat gesagt.:


> Ach ist das Kompliziert.
> Ich will doch nur die Eingabe über die Konsole haben.



Naja so kompliziert ist das nicht. Hier gehts eigentlich auch garnicht darum, die Eingabe einzulesen, sondern um grundlegende Dinge, wie du mit Variablen umgehst usw. Das "einfachste" (damit du an deinem Code nicht viel ändern musst) wäre wohl den String in ein char-Array umzuwandenln. Schau dir an welche Methode dafür geeignet wäre. Sinnvoll wärs aber denke ich gleich mit einem String zu arbeiten, denn Dinge wie Überprüfen auf Gleichheit von Strings (sogar mit oder ohne Beachtung von Groß-/Kleinbuchstaben) oder Strings "umdrehen" (Stichwort reverse) gibts schon.


----------



## despikyxd (14. Feb 2011)

oar ich glaub es nicht wie dumm sich einige echt anstellen ...

@TE

entweder bist du einfach noch nich so weit mit java um die gestellte aufgabe elegant zu lösen oder euer lehrer / tutor / was weis denn ich was sich der westen noch so alles für diesen einen simplen begriff ausgedacht hat ?=! > stellt euch aufgaben zu denen er euch noch nicht das grundwissen vermittelt hat
und nebenbei ... folgendes solltest du ab sofort IMMER offen haben wenn du programmierst
Java Platform SE 7 b120
und komm dann hier nicht angeheult : aber da steht was und es geht nicht ... ja junge ... dann lad dir Java7 ... und mach das deinem obermakka da klar das er euer veraltetes system updaten soll
ja ... ich habs erlebt das erst im jahr 2010 eine uni in ihrem INFO-kurs JAVA lehrt und dafür v1.4.2 nutzt ...
da hätte ich absichtlich alles in v7 compiled um 1) möglichkeiten neuer versionen aufzuzeigen und 2) aus trotz gegen diese ober-assi-ich-bin-uralt-aber-hier-immer-noch-der-boss-volln4p-ITs die einfach zu blöd , zu faul oder einfach nur nach ihren vorschriften zu loyal sind um mit der zeit zu gehen

und hier jetzt mal ein absoluter NOOB-code der dir das was du willst checkst ...
weil die aufgabe ist nicht mehr und nicht weniger als : IST DER ANFANGS- UNE ENDBUCHSTABE GLEICH + EGAL OB GROß ODER KLEIN *man man man ich fass es nich wie jemand der sowas scheinbar studiert *ich kenne kein gym das im info-unterricht solche grundlagen und aufgaben hat wie diese* zu dumm is die aufgabe zu erfassen und sie mal kurz und bündig aufn punkt zu bringen anstatt einfach abzuschreiben


```
public class test {
	public static void main(String[] args) throws Exception { new test(); }
	public test() throws Exception	{
		java.util.Scanner sc=new java.util.Scanner(System.in);
		String s=sc.next();
		System.out.println(s.substring(0, 1).equals(s.substring(s.length()-1, s.length())));
	}
}
```

da hast dus ... 8 zeilen ... wenn man alles hintereinander packen würde und das Scanner.next() im println() unterbringt kommt man auf 5 zeilen ... ich weiß echt nich warum ihr da alle solche riesen codes baut

und nicht zu vergessen : deinen mist mit den leerzeichen : soweit ich weis bezieht sich dieser lateinische fachbegriff auf EIN wort ... nicht auf MEHRERE ... darum kannst du mit Scanner.next() völlig richtig arbeiten ... denn es wird nur die erste ZUSAMMENHÄNGENDE zeichenkette wiedergegeben ... auch ein hinzufügen von anführungszeichen bringt nichts weil diese als teil des strings gelten und nicht als makierung das eine zeichenkette mit leerzeichen als eine zusammenhängende interpretiert werden soll


----------



## despikyxd (14. Feb 2011)

EDIT : muss natürlich equalsIgnoreCase sein .. nich nur equals ... mein fehler ...


----------



## Illuvatar (14. Feb 2011)

Von jemand der schon so rumpflaumt sollte man eigentlich nicht nur eine richtige* sondern auch eine gute** Lösung erwarten. Hier ist leider weder noch erfüllt.

Und nebenbei, warum sollte ein Anfänger ein Draft-Build von Java 7 verwenden? Wie wahrscheinlich ist es, dass er irgendwelche der neuen Klassen verwenden wird?
Das mit API immer offen haben ist trotzdem eine gute Idee, aber dann wohl doch eher die.

*Palindrom bedeutet nicht Anfangs- und Endbuchstabe gleich...
**Code Conventions nicht eingehalten, allen Code in irgendeinen Konstruktor gesteckt, "throws Exception", ... und das alles in 8 Zeilen

;(


----------



## nrg (14. Feb 2011)

despikyxd hat gesagt.:


> und nicht zu vergessen : deinen mist mit den leerzeichen


es gibt auch Satzpalindrome



despikyxd hat gesagt.:


> soweit ich weis bezieht sich dieser lateinische fachbegriff auf EIN wort ... nicht auf MEHRERE ...


das ist erstens nicht lateinisch und zweitens heisst es „rückwärts laufend“. solltest erstmal wikipedia fragen, bevor du anfängst zu flamen .

Aber gut. Im inet geht sowas immer recht einfach von der Lippe 

achja. auch ein Scanner hat ne close()-Methode.

@TO: Probiers mal mit der Methode:

```
private static String swap(String s) {
		StringBuilder sb = new StringBuilder();
		for (char c : s.toCharArray())
			sb.insert(0, c);
		return sb.toString();
	}
```

edit: besser gehst du noch von hinten durch. append ist wesentlich performanter als insert

```
private static String swap(String s) {
		StringBuilder sb = new StringBuilder();
		for (int i = s.length()-1; i >= 0; i--)
			sb.append(s.charAt(i));
		return sb.toString();
	}
```


----------



## Tomate_Salat (15. Feb 2011)

@despikyxd
Das Thema Konventionen hatten wir ja schonmal, vllt glaubst du es mir iwann mal, wenn dich das halbe Forum drauf angesprochen hat. Warum du den TE so anmachen musst ist mir auch nicht ganz klar. Halte dich mal zurück. Ist ja schon peinlich hier einen Anfänger so runterzuputzen und selbst solche Fehler zu begehen (mal von den Konventionen abgesehen).


----------



## despikyxd (19. Feb 2011)

ich bin ich und progge wie ich es will und für richtig empfinde ... wenn ihr alle ach diesem schwachsinn geiert *z.b. der müll hier
	
	
	
	





```
public static void main(String[] args) {
//TO-DO
}
```
 wobei das hier echt einfacher zu lesen ist 
	
	
	
	





```
public static void main(String[] args)
{
<TAB>//TO-DO
}
```
* dann ist das echt euer problem ...
und warum ich euch hier so anmache : weil ihr mich eben mit genau so etwas stresst
und die viele ach so tollen info-lehrer die meinen ihren studis java beibringen zu wollen und dann alles mit char[] und haste nich gesehen zu machen anstatt gleich auf einfach strings zurückzugreifen die stressen mich noch n tick mehr ...
mein gott .. hab halt etwas schnell drüber gelesen und die funktions-weise halt nich ganz erfasst ...

simpelste lösung : ne mehtode implementieren die den string reversed und dann mit equalsIgnoreCase gegenchecken ... wenns treu ergibt isses nu ma n palindrom und wenn false dann halt nich
also on-the-brain lösung fürs reverse würde mir jetzt spontan sowas hier einfallen *ohne checken*

```
public String reverseString(String input)
{
	StringBuilder sb=new StringBuilder();
	for(int i=input.length()-1; i>-1; i--)
	{
		sb.append(input.substring(i, i+1));
	}
	return sb.toString();
}
```
wie gesagt ... ob da jetzt so funzt weiß ich nich weil ich hier auf dem rechner kein JDK hab ...
is ja auch wurst ... schematischer ablauf : main > Scanner.next > reverseString > equalsIgnoreCase > ausgabe

und wenn ihr jetzt gerne die diskusion anfangen wollt : man sollte erstmal wissen wie strings zusammengesetz sind nämlich intern als char-array ... bitte ... ohne mich ... weil für mich gehört sowas zum punkt : muss man selber rausbekommen und sich in schädel hämmern ... wenn man alles vorgekaut bekommt is der lerneffekt == 0


----------



## nrg (19. Feb 2011)

oh mein Gott. einfach nur peinlich, was du hier von dir gibst... die Methode hatte ich den TO btw schon vor 2 wochen gepostet. aber wie schon gesagt: nimm erstmal den gatewayumhang ab und flame dann weiter..


----------



## Volvagia (19. Feb 2011)

Ich bin jetzt nicht richtig im Thread mitgekommen, aber ich frage mich, warum das so kompliziert gemacht wird:


```
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class PalindromChecker
{
	public static void main(String[] args)
	{
		System.out.println("Bitte die Zeichenfolge eintippen: ");
		String input = readFromInputStream();
		
		StringBuilder builder = new StringBuilder();
		builder.append("Die Zeichenkette ist ");
		builder.append(isPalindrom(input) ? "ein " : "kein ");
		builder.append("Palendrom.");
		System.out.println(builder.toString());
	}
	private static String readFromInputStream()
	{
		String read = null;
		
		InputStreamReader reader = null;
		BufferedReader bufferedReader = null;
		try
		{
			reader = new InputStreamReader(System.in);
			bufferedReader = new BufferedReader(reader);
			read = bufferedReader.readLine();
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
		finally
		{
			try
			{
				if(bufferedReader != null)
					bufferedReader.close();
				if(reader != null)
					reader.close();
			}
			catch (IOException e)
			{
				e.printStackTrace();
			}
		}
		return(read);
	}
	private static boolean isPalindrom(String input)
	{
		String reverse = new StringBuffer().append(input).reverse().toString();
		return(reverse.equalsIgnoreCase(input));
	}
}
```

@despikyxd: Warum stressen "wir" dich? Du bist hier in den Thread gekommen, und hast jemand beleidigt, den du nicht mal kennst. Ganz zu schweigen vom TO, der hier um Hilfe gebeten hat.
Das wirkt einfach nur, als hättest du ein bischen Java gelernt, hältst dich jetzt für etwas besseres und bist hier um damit anzugeben. Vielleicht wäre Deutsch ja die bessere Alternative gewesen.

PS: Ich kenne einige Leute die Windows 98 verwenden - und das mit Erfolg.  Nur weil etwas alt ist, ist es nicht gleich schlecht. Vielleicht bist du bloß zu jung oder zu arrogant, das zu kapieren.


@"Api offenhaben": Ich würde ihm empfehlen gleich Eclipse zu verwenden. Vermeidet nerfende Flüchtigkeitsfehler, und wenn er eine Methode braucht, die er noch nicht kennt, findet er sie vermutlich sogar wesendlich schneller mit der Autovervollständigung als durch die API. Außerdem kann man imho vor allem als Anfänger damit viel besser herumexperimentieren, da man sofort sieht wo etwas falsch ist und auch Tips zur Korrektur bekommt. Ansonst würde es über kurz oder lang keinen Spaß mehr machen. Ich weiß, das viele Leute dafür sind, das man im Texteditor anfängt, aber das ist halt meine Meinung.


@nrg: Brind es überhaupt etwas, close auf System.in zu verwenden? In dem Fall kann man ja die ganze Laufzeit über nichtmehr daraus lesen, und wenn man eine GUI-Anwendung schreibt schließt man den nichtbenutzten Stream ja auch nicht explizit, oder?


----------



## nrg (19. Feb 2011)

man schliest den Stream, wenn man ihn nicht mehr braucht. halte ich für einen guten Stil auch wenn er vllt eine Sekunde ohnehin mit der vm zusammen den Bach herunter gehen würde


----------



## Tomate_Salat (20. Feb 2011)

@despikyxd: interessant dass gerade du von lernerfolg sprichst :autsch::lol:. Dir ist bewusst: in diesem Forum sind sehr viele, die Java beruflich einsetzen, keine Professoren, sondern Leute die damit Geld verdienen. Wieso hörst du nicht mal auf solche Leute? Wobei lass es einfach, dich nimmt man hier eh nicht mehr ernst, bei den peinlichkeiten die du von dir gibst. Langsam wird es richtig amüsant


----------

