ubuntuusers.de

[Java] cannot find symbol

Status: Gelöst | Ubuntu-Version: Kubuntu 8.04 (Hardy Heron)
Antworten |

serenity

Avatar von serenity

Anmeldungsdatum:
31. Mai 2006

Beiträge: 5143

Wohnort: Wolfsburg

Wieso findet er die Variablen zahl1 und zahl2 nicht?

//Importieren der Klasse java.io, damit Eingaben in der Programm möglich sind
import java.io.*;

//Definition der Klasse vergleich
class vergleich
{
public static void main(String args[])
throws IOException
{

// Abfrage der Zahlen und Zuweisung 
  
   {
     BufferedReader bin = new BufferedReader(
                          new InputStreamReader(System.in));

     System.out.println("Dieses Programm vergleicht zwei Zahlen miteinander und gibt aus, ob diese gleich sind");
     
     System.out.println("Bitte erste Zahl eingeben: ");
     String zahl1 = bin.readLine();

     System.out.println("Bitte zweite Zahl eingeben: ");
     String zahl2 = bin.readLine();
   }


//Hier beginnt die wenn-dann-Funktion

//wenn
  
   if ( zahl1 == zahl2 ){

//dann
      
      System.out.println("Die Zahl " + zahl1 + " ist genauso groß wie die Zahl " + zahl2);
      System.out.println("Fertig");
      }
      
//sonst
      else
      {
      System.out.println("Die Zahl " + zahl1 + " ist nicht so groß wie die Zahl " + zahl2);
      System.out.println("Fertig");
      }
  }
       
}

Ausgabe von javac:

serenity@mangolassi:~/Desktop$ javac vergleich.java 
vergleich.java:31: cannot find symbol               
symbol  : variable zahl1                            
location: class vergleich                           
   if ( zahl1 == zahl2 ){                           
        ^                                           
vergleich.java:31: cannot find symbol               
symbol  : variable zahl2                            
location: class vergleich                           
   if ( zahl1 == zahl2 ){                           
                 ^                                  
vergleich.java:35: cannot find symbol               
symbol  : variable zahl1                            
location: class vergleich                           
      System.out.println("Die Zahl " + zahl1 + " ist genauso groß wie die Zahl " + zahl2);
                                       ^                                                  
vergleich.java:35: cannot find symbol                                                     
symbol  : variable zahl2                                                                  
location: class vergleich                                                                 
      System.out.println("Die Zahl " + zahl1 + " ist genauso groß wie die Zahl " + zahl2);
                                                                                   ^      
vergleich.java:42: cannot find symbol                                                     
symbol  : variable zahl1
location: class vergleich
      System.out.println("Die Zahl " + zahl1 + " ist nicht so groß wie die Zahl " + zahl2);
                                       ^
vergleich.java:42: cannot find symbol
symbol  : variable zahl2
location: class vergleich
      System.out.println("Die Zahl " + zahl1 + " ist nicht so groß wie die Zahl " + zahl2);
                                                                                    ^
6 errors

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

Weil zahl1 und 2 in einem Scope (=Gültigkeitsbereich) definiert wurden, der bereits beendet ist.

Der Gülltigkeitsbereich umfaßt den von geschweiften Klammern umfaßten Bereich ab der Stelle der Deklaration bis zur zugehörigen schließenden Klammer.

Außerdem kann man sagen, daß der Klassenname "Vergleich" und nicht "vergleich" sein sollte. Das ist zwar nicht zwingend so, aber erhöht die Lesbarkeit ungemein.

Der Vergleich von Objekten sollte immer mit equals erfolgen, es sei denn man will wirklich prüfen, ob man die gleiche Referenz vor sich hat:

1
2
3
4
// schlecht:
   if (zahl1 == zahl2){
// gut:
   if (zahl1.equals (zahl2)){

serenity

(Themenstarter)
Avatar von serenity

Anmeldungsdatum:
31. Mai 2006

Beiträge: 5143

Wohnort: Wolfsburg

Gesagt, getan:

//wenn
  
   if (zahl1 equals (zahl2))
   {

//dann
      
      System.out.println("Die Zahl " + zahl1 + " ist genauso groß wie die Zahl " + zahl2);
      System.out.println("Fertig");
      }
      
//sonst
      else
      {
      System.out.println("Die Zahl " + zahl1 + " ist nicht so groß wie die Zahl " + zahl2);
      System.out.println("Fertig");
      }
  }
       
}

aber javac sagt:

serenity@mangolassi:~/Desktop$ javac vergleich.java                                                                                                
vergleich.java:31: ')' expected
   if (zahl1 equals (zahl2))
            ^
vergleich.java:31: ';' expected
   if (zahl1 equals (zahl2))
                           ^
vergleich.java:41: 'else' without 'if'
      else
      ^
3 errors

gargoyle

Avatar von gargoyle

Anmeldungsdatum:
6. Oktober 2006

Beiträge: 93

Wohnort: Wiesloch, Kraichgau

Die richtige Syntax ist:

if (zahl1.equals(zahl2)) {
  // ...
}

serenity

(Themenstarter)
Avatar von serenity

Anmeldungsdatum:
31. Mai 2006

Beiträge: 5143

Wohnort: Wolfsburg

wenn ich das mache, bekomme ich wieder cannot find symbol.

gargoyle

Avatar von gargoyle

Anmeldungsdatum:
6. Oktober 2006

Beiträge: 93

Wohnort: Wiesloch, Kraichgau

serenity schrieb:

wenn ich das mache, bekomme ich wieder cannot find symbol.

Das wurde dir doch auch schon geantwortet: Du hast die beiden Symbole in einem Bereich definiert, der zum Zeitpunkt deiner if Abfrage nicht mehr gültig ist:

// Abfrage der Zahlen und Zuweisung 
   {
     String zahl1 = ...
     String zahl2 = ...
   }

Setz doch mal die Definition an den Anfang, also so:

String zahl1 = null;
String zahl2 = null;

// Abfrage der Zahlen und Zuweisung 
   {
     ...
     zahl1 = bin.readLine();
     ...
     zahl2 = bin.readLine();
   }

Wozu sollen dir die Klammern um den Block Abfrage eigentlich dienen? Notwendig sind sie jedenfalls nicht.

serenity

(Themenstarter)
Avatar von serenity

Anmeldungsdatum:
31. Mai 2006

Beiträge: 5143

Wohnort: Wolfsburg

Das war es. Danke schön.

Mirabella

Anmeldungsdatum:
16. November 2008

Beiträge: Zähle...

Ich hätte auch noch eine frage dazu und zwar bin ich auch gerade an einer if else Funktion, aber ich möchte schreiben, dass es bei den Zahlen von 14 bis 15 beispielsweise etwas bestimmtes anzeigt, aber irgendwie klappt das nicht so.... Weiß einer Rat?

import java.util.Scanner;

public class Division

{ public static void main (String[]args) { Scanner tastatur = new Scanner(System.in);

double zahl1;

double zahl2;

double zahl3;

System.out.println("Gib die erste Note ein:");

zahl1=tastatur.nextDouble();

System.out.println("Gib die zweite Note ein:");

zahl2=tastatur.nextDouble();

System.out.println("Gib die dritte Note ein:");

zahl3=tastatur.nextDouble();

double ergebnis;

ergebnis = (zahl1 + zahl2 + zahl3) / 3;

System.out.println("(" + zahl1 + " + " + zahl2 + " + " + zahl3 + " ) /3 = " + ergebnis);

//Wenn/dann-Funktion //dritte Möglichkeit

if (ergebnis < 5)

System.out.println("Notenalarm!!!!!");

if (ergebnis == 5)

System.out.println("Glück gehabt!");

if (ergebnis == 6 & ergebnis == 10)

System.out.println("Alles ok!");

if (ergebnis == 11 & ergebnis == 13)

System.out.println("PRIMA!!!!!");

if (ergebnis == 14 & ergebnis == 15)

System.out.println("Ausgezeichnet!");

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4694

Wohnort: Berlin

Du hast das "bitweise Und" (&) statt des logischen Operators (&&) verwendet. Wobei "Und" hier die falsche Wahl ist, weil so etwas wie ergebnis == 14 && ergebnis == 15 nie wahr sein kann. ergebnis kann nicht gleichzeitig 14 und 15 sein.

Mirabella

Anmeldungsdatum:
16. November 2008

Beiträge: 3

ich wollte eigentlich auch nicht "UND" Sagen, sonder von 14 bis 15 Unser lehrer hat uns erklärt, dass das irgendwie mit & machbar sein müsste, aber bei mir funktionierts eben nicht. Wie kann ich denn schreiben, dass es von bis ist?

und vielen Dank schon mal für die schnelle Antwort!!!

Gruß edit: bei mir kommt zwar kein error, d.h. das Programm lässt sich ausführen, aber ab da, wo ich "&" verwende, zeigt es den text nicht an, den es eigentlich in diesem Notenbereich anzeigen müsste...

Mirabella

Anmeldungsdatum:
16. November 2008

Beiträge: 3

ok, ich habs jetzt geschafft, das es angezeigt wird... Glück gehabt 😉

so lautet die Java Datei nun bei mir :

if (ergebnis < 5)

System.out.println("Notenalarm!!!!!");

if (ergebnis == 5)

System.out.println("Glück gehabt!");

if (ergebnis >= 6 & ergebnis ⇐ 10)

System.out.println("Alles ok!");

if (ergebnis >= 11 & ergebnis ⇐ 13)

System.out.println("PRIMA!!!!!");

if (ergebnis >= 14 & ergebnis ⇐ 15)

System.out.println("Ausgezeichnet!");

phst

Anmeldungsdatum:
24. Juni 2007

Beiträge: 527

Mirabella schrieb:

ich wollte eigentlich auch nicht "UND" Sagen, sonder von 14 bis 15 Unser lehrer hat uns erklärt, dass das irgendwie mit & machbar sein müsste, aber bei mir funktionierts eben nicht. Wie kann ich denn schreiben, dass es von bis ist?

Mit einer Ungleichung. Du hast ja schon eine (ergebnis < 0), schreibe einfach für die anderen Bedingungen auch Ungleichungen:

1
if (ergebnis >= 6 && ergebnis <= 10)

Die Bedingung ist dann erfüllt, wenn die Zahl größer oder gleich als sechs und kleiner oder gleich als zehn ist, d.h. wenn sie zwischen sechs und zehn liegt.

In deinem Fall musst du die Grenzen allerdings anpassen, da z.B. Ergebnisse zwischen 10 und 11 durch keinen Fall abgedeckt werden. Auch solltest du die Sequenz der if-Anweisungen durch if … else if ersetzen. Hier macht das zwar keinen Unterschied, aber es ist konzeptionell eindeutiger, da du nicht erwartest, dass mehr als eine Bedingung zutrifft. Wenn du else if verwendest, kannst du auch einen Teil der Bedingung immer weglassen, da er automatisch erfüllt ist:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
if (ergebnis < 5)
    System.out.println("Notenalarm!!!!!");
} else if (ergebnis <= 6) {
    System.out.println("Glück gehabt!");
} else if (ergebnis <= 10) {
    System.out.println("Alles ok!");
} else if (ergebnis <= 13) {
    System.out.println("PRIMA!!!!!");
} else if (ergebnis <= 15) {
    System.out.println("Ausgezeichnet!");
} else {
    throw new ArithmeticException("Ungültige Note");
}

edit: bei mir kommt zwar kein error, d.h. das Programm lässt sich ausführen, aber ab da, wo ich "&" verwende, zeigt es den text nicht an, den es eigentlich in diesem Notenbereich anzeigen müsste...

Klar, es wird ja auch nirgends eine Bereichsüberprüfung durchgeführt. Gleichheitstest bei Fließkommazahlen sind sowieso kritisch zu sehen, da durch Rundungsfehler unerwartete Ergebnisse auftreten können.

Noch etwas: In Java solltest du Variablen, wenn möglich, bei der Deklaration sofort initialisieren. Das vermeidet Fehler wegen uninitialisierter automatischer Variablen und sorgt für besseren Codestil. Also nicht so:

1
2
double ergebnis;
ergebnis = (zahl1 + zahl2 + zahl3) / 3;

sondern so:

1
double ergebnis = (zahl1 + zahl2 + zahl3) / 3;

(und ebenso mit allen anderen Variablen)

PS: Bitte benutze die Codetags (viertes Symbol von rechts in der Symbolleiste über dem Eingabefeld) zum Formatieren von Quellcode, sonst ist er schlecht lesbar.

Antworten |