ich habe folgende Frage. Wir haben gelernt, einen Datenstrom einzulesen, von der Tastatur. Und zwar mit der Klasse Scanner. In jedem Tutorial lese ich aber, dass man Eingaben und Ausgabeströme mittels IO macht.
das funktioniert nicht wirklich bei mir. es kommt dort folgendes:
>javac Konto.java
Konto.java:27: unreported exception java.io.IOException; must be caught or declared to be thrown
FileWriter ausgabeStrom = new FileWriter("Konto.java");
^
1 error
nun frage ich mich aber generell, was denn nun 'richtiger' ist. Ich würde natürlich gerne das 'richtigere' nehmen. Aber was ist denn von beiden 'besser'?
Kannst du mir noch beantworten was 'besser' ist? Ich möchte es gern von Anfang an richtig lernen. Sollte ich lieber die Geschichte mit IO nehmen oder doch den Scanner? Wozu ist eigentlich der Scanner genau da?
Scanner ist glaube ich nur zum Einlesen von der Konsole (also das, was du da an der Konsole via Tastatur eingibst). Da das eigentlich immer Funktioniert, wird da eigentlich nie eine Exception geworden.
Wenn du andere Datenströme verwendest (netzwerkmäßig oder beim Zugriff auf Dateien; also dort wo die nativen Methoden der Plattform angesprochen werden) können des Öfteren Fehler passieren, deswegen musst du da dann Exceptions abfangen.
Ich hoffe, ich hab mich verständlich ausgedrückt :wink: .
Ja, das hab ich schon verstanden. Also werde ich statt dem Scanner die IO Sache benutzen. Ich finde es auch in vielen Tut's so. Anscheindend habe ich das mit dem try/catch nicht so ganz gelesen oder gesehen. Vielen Dank!
Hm, ja, das stimmt wohl. Ich blicke hier nämlich gerade nich durch mit dem Eingeben von etwas / dem Einlesen. Mein Code-Schnipsel:
Code:
try{
FileWriter ausgabeStrom = new FileWriter("Konto.java"); //Ausgabestrom
PrintWriter ausgabe = new PrintWriter(ausgabeStrom); //Objekt zum Ausgeben von Daten
BufferedReader eingabe = new BufferesReader(eingabeStrom); //Einlesen der Daten
System.out.println("Hallo! Bitte gib deinen Namen ein!");
name = eingabe.readLine();
}
catch(IOException ex){
System.out.println("Fehler!");
}
}
}
und was er dazu sagt:
>javac Konto.java
Konto.java:31: cannot resolve symbol
symbol : class BufferesReader
location: class Konto
BufferedReader eingabe = new BufferesReader(eingabeStrom); //Einlesen der Daten
^
Konto.java:31: cannot resolve symbol
symbol : variable eingabeStrom
location: class Konto
BufferedReader eingabe = new BufferesReader(eingabeStrom); //Einlesen der Daten
^
Konto.java:34: cannot resolve symbol
symbol : variable name
location: class Konto
name = eingabe.readLine();
^
3 errors
>Exit code: 1
Er hat bei mir auch schon rumgemeckert, dass er Scanner nicht finden kann. Aber ich habe doch Java 1.6 installiert. Oder wo kann ich das zufällig in Scite nachsehen / einstellen? Da das mit dem Scanner auf keinem meiner Rechner geht, wollte ich auch das mit IO nehmen. Scheint aber auch nicht zu funktionieren. Oder mache ich etwas falsch?#
Aber wenn ich mir das so durchlese, wäre es vielleicht sinnvoller, den Scanner zu verwenden, oder? Zudem bin ich auch noch Anfänger.
Kannst du kein Englisch? Der Compiler sagt dir doch klipp und klar wo die Fehler liegen:
1.) Du hast BufferesReader geschrieben (muss BufferedReader heissen)
2.) Erübrigt sich nach dem Korrigieren von 1.
3.) Die Variable name muss zunächst definiert werden, bevor sie initialisiert werden kann
Um Scanner und IO zu nutzen, musst du die zugehörigen Packages auch importieren:
Schreib vor deiner Klassendefinition
Code:
import java.util.*; //Oder import java.util.Scanner, wenn du nur Scanner aus dem Util-Packet verwenden möchtest
import java.io.*; //Enthält alle (fast) alle IO-Klassen
ja, das habe ich bereits gemacht. Aber er findet es immer noch nicht. Habe es eingefügt.
import java.util.*;
import java.io.*;
Aber wie gesagt, anscheinend findet er es nicht. Auf dem T60 habe ich heraugefunden, dass er sich die ganze Zeit die 1.4er Version genommen hat. Auf meiner Linux-Kiste hier ist aber 1.6 drauf. Zumindest wird mir das Angezeigt. Auf dem T60 habe ich den Java-Editor, den man (vom Nibis-Server glaub ich) auch so runterladen kann. Jedoch möchte der Java-Editor einen Jikes-Compiler haben. Ich weiß aber gar nicht, wie die Datei heißt.
Hm, Scite ist ja quasi so etwas in der Art. Da ist ja kaum was grafisches dran an dem Ding. Normalerweise muss man dort auch nichts einstellen, sprich: Er nimmt sich eben das was da ist. Allerdings habe ich die Vermutung, dass er es doch nicht so richtig hinbekommt. Ich versuch es nochmal im normalen Texteditor, wobei, dort finde ich es wesentlich unübersichtlicher und ich komme oft durcheinander.
Zudem dauert es auch länger, da man erst wieder in die Konsole wechseln muss und so weiter. Zudem mag ich die grafische hervorhebung der Schlüsselwörter zB, oder die Klammern (ich bin ein Kandidatin die häufig die Klammern vergisst.). Auch mit Einrücken bekomme ich nicht so eine schöne Übersicht hin.
Ich bin der Meinung, dass man erst auf eine IDE oder den Java-Editor umsteigen sollte, wenn man auch ohne die Übersicht zu verlieren mit einem Texteditor und der Konsole programmieren kann.
Ja, können tu ich es schon, das ist kein problem. Ich kenne Sowohl die Syntax(en) dafür in meiner Konsole, auch kann ich gut mit dem Editor umgehen. Ist eine reine Geschmackssache. Mit Scite erspare ich mir viele Fehler durch die Hervorhebung von Klammern zB, wie oben angedeutet.
:~$ javac Einlesen.java
Einlesen.java:5: cannot resolve symbol
symbol : class Scanner
location: class Einlesen
Scanner tastatur=new Scanner(System.in);
^
Einlesen.java:5: cannot resolve symbol
symbol : class Scanner
location: class Einlesen
Scanner tastatur=new Scanner(System.in);
^
2 errors
und 1.6 hat schon den Scanner mit drinnen. Ab 1.5 müsste der Standartmäßig dabei sein.
Das Programm:
import java.util.*;
public class Einlesen{
public static void main (String[] args){
Scanner tastatur=new Scanner(System.in);
String wort;
wort=tastatur.nextLine();
System.out.println(wort);
int zahl;
zahl=tastatur.nextInt();
System.out.println(zahl);
}
}
hm, das wüsst ich ja gerne auf was zugegriffen wird. Ich habe 1.6 drauf, sowie 5 und 6 (JRE, JDK). Das ist auf dem Rechner (Desktop) worauf ich gerne Programmieren möchte.
Auf dem Notebook (das hab ich in der Schule mit zum Programmieren) befinden sich 1.4, 1.5 sowie 1.6. Bei 1.4 gibt es erst mal in den Konfigurationseinstellungen keine Probleme. Jedoch findet er dort natürlich die Klasse Scanner u. a. nicht. Stelle ich ein, dass er doch bitte 1.6 nehmen soll, fängt er an was von einem Jikes-Compiler zu faseln, welchen ich gar nicht kenne, noch nicht mal das Wort an sich. Somit kann er nur compilieren, aber keine Ausgabe liefern. Es kommt nur die Meldung: Erfolgreich compiliert. Aber nichts anderes.
Dann führ das Programm doch wenigstens über den 1.6-Interpreter aus.
Irgendwo in deinem Projektordner (falls es mit diesem Programm sowas überhaupt gibt :wink: ) müssten die kompilierten CLASS-Dateien liegen.
hm, wie kann ich es denn über den Interpreter aufrufen? Ich habe keinen Projektordner, den lege ich manuell an. Wie gesagt, das mit dem Interpreter habe ich noch nie gemacht.
Ich vermute mal, einach nur den Bytocode ausführen, oder? Klappt aber auch nicht, wieder das Klassenproblem...
Konsole ==> In Projektordner wechseln ==> "java -version" ausführen, um die JRE-Version rauszufinden ==> "java <Klassenname mit Paketangabe>" ausführen um dein Programm zu starten.
Hm. Das habe ich doch schon gemacht. Aber wie gesagt, funktioniert nicht. Wie oben auch schon angegeben habe ich Java 1.6. Dort sollte die Klasse Scanner schon enthalten sein. Er sagt immer noch er kann sie nicht finden.
Edit
===
Ich hab immer noch ziemliche Probleme mit Java. Auf dem T60 (Notebook) lief es mal einwandfrei. Dort habe ich gerade versucht ein Programm mit dem Java-Editor zu schreiben. Das Programm ist aus einer Lehrvorlage und enhält keine Fehler. Wenn ich es nun kompilieren möchte, poppt nur ein Fenster von Java auf, wo ich dann Einstellungen vornehmen kann. Ich gehe dann immer auf abbrechen, da die Sachen absolut uninteressant sind, die darinnen stehen (von wegen ob 'Java immer nach Updates suchen soll' etc.). Er kompiliert aber nichts. Immer nur dieses Fenster. Dort ist Java 1.6 drauf, und er erkennt wieder einmal die Klasse Scanner nicht. Ich komm mit den Problemen absolut nicht mehr weiter. Ich möchte nur dass das endlich funktioniert, egal auf welchem Rechner, damit ich endlich weiter üben kann... Ich arbeite nebenbei auch noch und kann nicht 5 Stunden mit dem Suchen der Einstellungen verbringen.
Tja, deine Beschreibungen sind leider zu wage als das ich mir ein Bild von deinem System machen könnte. Erläutere mal genau wie du jetzt welche Programme auf welche Art und Weise auf welchem System benutzt.
T60-Notebook (da ist aus Test- und beruflichen Gründen Win XP drauf)
=========
Java-Editor
SCite
DevC++ (spielt aber keine Rolle denk ich)
Java 1.6 (laut java -version)
Ich möchte Scite benutzen, da ich nicht nur Java programmiere und mir Scite sehr gut gefällt.
Hm. Scite kenne ich nicht, um ehrlich zu sein. Deshalb nehme ich an, dass der Fehler irgendwo in der Bedienung des Programms liegt. Ich werd's mir heut abend eventuell mal anschauen.
Also ich hab mir SciTE jetzt runtergeladen und bin sehr zufrieden. Ich kann die Quelltexte schön formatieren, dann kompilieren und anschließend sogar ausführen. Und die Scanner-Klasse kennt er auch.
Ich rate dir, einfach mal alles javamäßige von deinem System runterzuschmeissen (auch SciTE) und neu zu installieren.
hab ich gemacht. Ich habe dann SCiTe neu aufgespielt, alle Java-Pakete entfernt und mal nur das Java 6 draufgespielt. Wenn ich in der Konsole jedoch java -version eingebe, zeigt er mir an ich hätte version 1.6 (Wobei da gab es doch dieses Versionskaos, oder? Das 1.6 auch gleich 6 war.). Aber:
Code:
>
>javac Einlesen.java
>Exit code: 0
>java Einlesen
Exception in thread "main" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Scanner.java:1516)
at Einlesen.main(Einlesen.java:7)
>Exit code: 1
Btw: Hier mal das Programm:
Code:
import java.util.*;
public class Einlesen{
public static void main(String[] args){
Scanner tastatur=new Scanner(System.in);
String wort;
wort=tastatur.nextLine();
System.out.println(wort);
int zahl;
zahl=tastatur.nextInt();
System.out.println(zahl);
}
}
Also ich bekomme es nur mit Eclipse hin. Ist jedoch recht nervig, da mit Eclipse zu umständlich ist. Er ruft a) immer das alte Projekt auf, wenn ich auf Run gehe, muss mein altes erst löschen... sprich: vorher sicherheitskopie anlegen, etc.. 2. Nun hab ich ein neues Projekt, will es ausführen, geht aber nicht, da ich irgendwo (wo auch immer in dem Icon-Dschungel) einstellen muss dass es ne Java-Aplication sein muss. Da wo man es eintellen kann steht nur grau hinterlegt none...