Variablen Ausgabe bzw. einlese Fehler

der bobo

Mitglied
Hallo,
ich verwend Greenfoot und habe folgenden Programmcode:
Java:
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.io.*;
import javax.swing.JOptionPane;
/**
 * Write a description of class generator here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class generator extends Actor
{
    static String[] name_random;
    static String[] name_sortiert;
    static int zeilen=0;
    static boolean geklappt=false;
    /**
     * Act - do whatever the generator wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    public void act() 
    {
        String datei = JOptionPane.showInputDialog(
                null, "Geben sie das Verzeichnis und die Datei an","z.B. C:\\Users\\Public\\Documents\\namen.txt");
        zählen(datei);
        auslesen(datei);
        ausgeben();

    }   

    public void zählen(String datei){
        try {BufferedReader in = new BufferedReader(new FileReader(datei));
            while (in.readLine() != null)
            {
                zeilen++;
            } 
            name_random= new String[zeilen];
            name_sortiert= new String[zeilen];
        }
        catch (FileNotFoundException e){
            System.out.println("Datei nicht gefunden");

        }catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void auslesen(String datei){
        try {int i=0;
            BufferedReader in = new BufferedReader(new FileReader(datei));
            String zeile = null;
            while ((zeile = in.readLine()) != null) {
                name_sortiert[i]=zeile;
                i++;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void ausgeben(){
        for (int i=0;i<zeilen;i++){

            random(i);

        }
        for (int i=0;i<zeilen;i++){

            JOptionPane.showConfirmDialog(null,
                "Nächsten namen Ausgeben",
                "Ausgabe",
                JOptionPane.YES_OPTION);
            System.out.println(name_random[i]);                   

        }
    }

    public void random(int a){
        int x;
        geklappt=false;
        while (geklappt=false){
            x=Greenfoot.getRandomNumber(zeilen);
            if (name_sortiert[x]!=null){
                name_random[a]=name_sortiert[x];
                name_sortiert[x]=null;
                geklappt=true;
            }

        }
    }
}

Bei dem oben angegebenen Code soll Java eine txt-Datei zeilenweise einlesen und die eingelesenen Zeilen in zufälliger Reihenfolge ausgeben. Wenn ich das Programm allerdings ausführe wird immer "null" ausgegeben.Könnt ihr mir helfen meinen Fehler zu finden, denn ich habe trotz intensiver Suche noch nichts gefunden.
Danke schon mal im voraus Bobo.
 
Wow, welch ein kruder Code

Der Reihe nach
Java:
   static String[] name_random;
    static String[] name_sortiert;
    static int zeilen=0;
    static boolean geklappt=false;
ENTFERNE die static Modifier!

Klassennamen beginnen per Konvention mit einem Grossbuchstaben!
und diese Routine verstehe ich nicht
Java:
	public void ausgeben() {
		for (int i = 0; i < zeilen; i++) {

			random(i);

		}
		for (int i = 0; i < zeilen; i++) {

			JOptionPane.showConfirmDialog(null, "Nächsten namen Ausgeben", "Ausgabe", JOptionPane.YES_OPTION);
			System.out.println(name_random[i]);

		}
	}
 
Erstmal danke für die Antwort.
Bei der Routine die sie nicht verstehen wird zuerst über eine for-schleifen die Routine random aufgerufen und dieser der integerwert i übergeben.danach findet die eigentliche Ausgabe statt. Diese Ausgabe geschieht auch wieder mit einer for-schleife .in der schleife wird ein Dialog erstellt(Der Dialog soll verhindern, dass alle zeilen auf einmal ausgegeben werden).wenn der Dialog durch drücken eines Buttons geschlossen wird, wird eine zeile ausgegeben
 
Öhm

Java:
public void ausgeben() {
        for (int i = 0; i < zeilen; i++) {
            random(i);
        }
        for (int i = 0; i < zeilen; i++) {
            JOptionPane.showConfirmDialog(null, "Nächsten namen Ausgeben", "Ausgabe", JOptionPane.YES_OPTION);
            System.out.println(name_random[i]);
        }
    }

Das ist jetzt nicht wirklich innovativ,

Warum nicht ein Array oder eine Collection ?

Code:
Einlesen -> in Liste Speichern -> per JOptionPane ausgeben

insofern das wirklich so gewollt ist?!

zudem sollte das Ein/Auslesen der Datei in einer Separaten Klasse / oder zumindest Methode stattfinden.

z.B ( ohne Exception - Handling etc. / könnte man auch eine Utilityklasse für Schreiben )

Nur als fiktives Beispiel


Java:
public class Test {
	
	ArrayList<String> lines = new ArrayList<>();
	
	public Test() {}
	
	public void readFile(String fileName){
		BufferedReader reader;
		File file;
		
		try {
			file = new File(fileName);
			reader = new BufferedReader(new FileReader(file));
			
			readLines(reader, lines);
			
			reader.close();
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	
	private void readLines(BufferedReader reader, ArrayList<String> list) throws IOException{
		
		String line = "";
		
		while((line = reader.readLine()) != null){
			list.add(line);
		}
	}
	
	public void showDialog(){
		for (String string : lines) {
			JOptionPane.showMessageDialog(null, string);
		}
	}
	
	public static void main(String[] args) throws IOException {
		Test t = new Test();
		t.readFile("H:/Apps/Names.txt");
		
		t.showDialog();
	}
}
 
Zuletzt bearbeitet:
Ich wurde vorhin mit meinen "Kitikpunkten" unterbrochen, aber nun geht es weiter😀

Es gibt die Methode zählen. Die gibt aber void zurück und tut nicht was der Name suggeriert. Sie macht die Arrays so gross, das n-Zeilen in der Datein reinpassen. Wie kaoz schon richtig andeute, wäre eine List<String> besser geeignet, zumal diese dynamisch wachen kann.

Es gibt die Methode auslesen. Ich kann zwar ein Buch auslesen aber eine Datei? In der Methode wird auch nichts ausgelesen, sondern die Routine readLine benutzt. Und read ist für mich das Gegenteil von ausXXX, oder? Ich hätte die Method readAllLines genannt.

Zum Schluss rufst du ausgeben auf. Wieder kein Hinweis, das irgendwo Zeilen in zufälliger Reihenfolge gebracht/getauscht werden. Dazu müsste man in den Code schauen, um das zu begreifen.

Dein Exception-Handling ist ebenfalls ein bisschen merkwürdig.
In der Methode machst du
System.out.println("Datei nicht gefunden");
aber im normalen Stacktrace werden mehr Informationen gegeben, nämlich unter anderem WELCHE Datei nicht gefunden werden konnte. Daneben und das finde ich noch schwerwiegender "behandelst" du die Exception gar nicht, sondern dein Programm läuft weiter. Und natürlich gibt das im weiteren Lauf weitere Probleme. Was kannst du als Behandlung machen? Genau, nichts. Also ist es besser die Exception dem Aufrufer zu melden, der dann in diesem Fall das Programm abbrechen sollte.

Ich habe dein Programm mal umgeschrieben und die mir aufgefallenen Punkte eingearbeitet. Ist mit Sicherheit nicht perfekt, aber definitiv "besser" als deine Version.😉

Und NICHT entmutigen lassen, GENAUSO haben wir alle mal angefangen SW zu schreiben😉 Und nur, indem man Code anderer Leute sieht, lernt man dazu und kann das in seinen eigenen Programmen verwenden:idea:

Java:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.swing.JOptionPane;

/**
 * Write a description of class generator here.
 * 
 * @author (your name)
 * @version (a version number or a date)
 */
public class Generator {
	List<String> lines;
	private Random random = new Random();

	public static void main(String[] args) {
		try {
			Generator generator = new Generator();
			String dateiName = JOptionPane.showInputDialog(null, "Geben sie das Verzeichnis und die Datei an",
					"C:\\Users\\Public\\Documents\\namen.txt");
			generator.readAllLines(dateiName);
			generator.tauscheZeilen();
			generator.ausgeben("turtle.out");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	public Generator() {
		lines = new ArrayList<>();
	}

	public void readAllLines(String dateiName) throws FileNotFoundException, IOException {
		try (BufferedReader in = new BufferedReader(new FileReader(dateiName))) {
			String fileLine = null;
			while ((fileLine = in.readLine()) != null) {
				lines.add(fileLine);
			}

		}
	}

	public void tauscheZeilen() {
		int anzahlTauschen = 1000 + random.nextInt(1000);
		for (int i = 0; i < anzahlTauschen; i++) {
			int zeile1 = random.nextInt(lines.size());
			int zeile2 = random.nextInt(lines.size());
			String string1 = lines.get(zeile1);
			lines.set(zeile1, lines.get(zeile2));
			lines.set(zeile2, string1);
		}
	}

	public void ausgeben(String dateiName) {
		try (PrintWriter out = new PrintWriter(new FileWriter(dateiName))) {
			for (String line : lines) {
				out.println(line);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
 
Zuletzt bearbeitet:
hallo

wenn ich denn Code bei meinem Editor einfüge und dann compilieren will erscheint folgende Fehlermeldung
" diamond operator is not supported in -source 1.6 (use -source 7 or higher to enable diamond operator)
bei dieser zeile
Code:
lines = new ArrayList<>();


Bobo
 
....
wenn ich denn Code bei meinem Editor einfüge und dann compilieren will erscheint folgende Fehlermeldung
" diamond operator is not supported in -source 1.6 ....

Deswegen tut man Code aus Foren nicht einfach Copy&Paste in sein eigenes Program einfügen. Versuche erst den Code zu verstehen, dann weißt du auch das man hier oder da vielleicht noch Anpassungen vornehmen muss.
 
wenn ich denn Code bei meinem Editor einfüge und dann compilieren will erscheint folgende Fehlermeldung
" diamond operator is not supported in -source 1.6 (use -source 7 or higher to enable diamond operator)
bei dieser zeile
Code:
lines = new ArrayList<>();

Wenn du noch eine alte Java6-Version verwendest, dann schreib stattdessen
Code:
lines = new ArrayList<String>();
 

Zurück
Oben