Problem beim GUI

Hi Leute,
Ich bin noch neu in sachen GUI und habe mir folgenden code zusammengebastelt(mit eclipse).
Dieses Programm soll aus einer txt Wokabeln auslesen und eine zufällige abfragen.
Fehler werden keine angezeigt doch wenn ich das programm starten will gibt es eine riesige fehlermeldung! Ich verstehe bloß das Problem am code nicht, vlt. könnte mal jemand drüber schauen und mich verbessern.

Schonmal Danke McCrafterIV

Java:
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.util.Random;
import java.awt.event.ActionEvent;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

@SuppressWarnings("serial")
public class main extends JFrame {


   private JPanel contentPane;
   private JTextField textField;
   protected BufferedReader in;
   public String Vocfile = "voc1.txt";

   public static void main(String[] args) {
       EventQueue.invokeLater(new Runnable() {
           public void run() {
               try {
                   main frame = new main();
                   frame.setVisible(true);
               } catch (Exception e) {
                   e.printStackTrace();
               }
           }
       });
   }

   /**
    * Create the frame.
    */
   public main() {
       
       
       //Zeilen gezählt
       long l = System.currentTimeMillis(); // Systemzeit merken => Dauer berechnen!
       try {
           @SuppressWarnings({ "unused", "resource" })
           BufferedReader in = new BufferedReader(new FileReader("voc1.txt"));
       } catch (FileNotFoundException e1) {
           // TODO Auto-generated catch block
           e1.printStackTrace();
       }
         int counter = 0;
         try {
           while ( in .readLine() != null ) {
               counter++;
             }
       } catch (IOException e1) {
           // TODO Auto-generated catch block
           e1.printStackTrace();
       }
         System.out.println("Anzahl: " + counter);
         System.out.println("Dauer: " + (System.currentTimeMillis()-l)); // Dauer ausgeben.
       
         //Zufallszeile berechnet
       int Zahl = counter -1;
       Zahl = Zahl / 2;
       Random r = new Random();
       int zfzahl = r.nextInt(Zahl); //alle zahlen 0+1+2.....+49 beachte: 50 ist nicht inbegriffen
       
       //Zeile einlesen
       try {
           String Vocdeu = getLineNumber(Zahl, Vocfile);
       } catch (IOException e2) {
           // TODO Auto-generated catch block
           e2.printStackTrace();
       }
       int Zahl2 = Zahl+1;
       try {
           String Vocausl = getLineNumber(Zahl, Vocfile);
       } catch (IOException e2) {
           // TODO Auto-generated catch block
           e2.printStackTrace();
       }
       
       
       
       setResizable(false);
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       setBounds(100, 100, 288, 164);
       contentPane = new JPanel();
       contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
       setContentPane(contentPane);
       
       JButton btnNewButton = new JButton("next");
       btnNewButton.setBounds(42, 91, 81, 23);
       btnNewButton.addActionListener(new ActionListener() {
           public void actionPerformed(ActionEvent arg0) {
               
               //MACHEN
               //Zeilen gezählt
               long l = System.currentTimeMillis(); // Systemzeit merken => Dauer berechnen!
               try {
                   BufferedReader in = new BufferedReader(new FileReader("voc1.txt"));
               } catch (FileNotFoundException e1) {
                   // TODO Auto-generated catch block
                   e1.printStackTrace();
               }
                 int counter = 0;
                 try {
                   while ( in .readLine() != null ) {
                       counter++;
                     }
               } catch (IOException e1) {
                   // TODO Auto-generated catch block
                   e1.printStackTrace();
               }
                 System.out.println("Anzahl: " + counter);
                 System.out.println("Dauer: " + (System.currentTimeMillis()-l)); // Dauer ausgeben.
               
                 //Zufallszeile berechnet
               int Zahl = counter -1;
               Zahl = Zahl / 2;
               Random r = new Random();
               int zfzahl = r.nextInt(Zahl); //alle zahlen 0+1+2.....+49 beachte: 50 ist nicht inbegriffen
               
               //Zeile einlesen
               
               String voc1 = textField.getText();
               try {
                   String lös = getLineNumber(zfzahl, "voc1.txt");
                   if(voc1 == lös){
                       JOptionPane.showMessageDialog(main.this, "Richtig!");
                   }else{
                       JOptionPane.showMessageDialog(main.this, "Falsch! es wäre " + lös + " gewesen!");
                   }
               } catch (IOException e) {
                   // TODO Auto-generated catch block
                   e.printStackTrace();
               }
           }
       });
       contentPane.setLayout(null);
       contentPane.add(btnNewButton);
       
       JLabel label = new JLabel("");
       label.setBounds(305, 21, 0, 0);
       contentPane.add(label);
       
       JButton btnClose = new JButton("close");
       btnClose.setBounds(150, 91, 81, 23);
       contentPane.add(btnClose);
       btnClose.addActionListener(new ActionListener() {
           
           @Override
           public void actionPerformed(ActionEvent e) {
               System.exit(EXIT_ON_CLOSE);
               }
       });
       
       textField = new JTextField();
       textField.setBounds(57, 60, 162, 20);
       contentPane.add(textField);
       textField.setColumns(10);
       
       JLabel lblBitteGibDie = new JLabel("Bitte gib die Gesuchet Wokabel ein");
       lblBitteGibDie.setBounds(42, 22, 203, 14);
       contentPane.add(lblBitteGibDie);
       
       try {
           JLabel voc = new JLabel(getLineNumber(Zahl, Vocfile));
           voc.setBounds(77, 44, 107, 14);
           contentPane.add(voc);
       } catch (IOException e1) {
           // TODO Auto-generated catch block
           e1.printStackTrace();
       }
       
   }
   
   public static String getLineNumber(int num, String file) throws IOException{
          @SuppressWarnings("resource")
       LineNumberReader reader = new LineNumberReader (new FileReader(file) );
          for(int i = 0; i<num-1; i++)
             reader.readLine();
          return reader.readLine();       
   }
}
und hier die Fehlermeldung
Java:
java.io.FileNotFoundException: voc1.txt (Das System kann die angegebene Datei nicht finden)
   at java.io.FileInputStream.open0(Native Method)
   at java.io.FileInputStream.open(Unknown Source)
   at java.io.FileInputStream.<init>(Unknown Source)
   at java.io.FileInputStream.<init>(Unknown Source)
   at java.io.FileReader.<init>(Unknown Source)
   at main.<init>(main.java:52)
   at main$1.run(main.java:33)
   at java.awt.event.InvocationEvent.dispatch(Unknown Source)
   at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
   at java.awt.EventQueue.access$500(Unknown Source)
   at java.awt.EventQueue$3.run(Unknown Source)
   at java.awt.EventQueue$3.run(Unknown Source)
   at java.security.AccessController.doPrivileged(Native Method)
   at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
   at java.awt.EventQueue.dispatchEvent(Unknown Source)
   at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
   at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
   at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
   at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
   at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
   at java.awt.EventDispatchThread.run(Unknown Source)
java.lang.NullPointerException
   at main.<init>(main.java:59)
   at main$1.run(main.java:33)
   at java.awt.event.InvocationEvent.dispatch(Unknown Source)
   at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
   at java.awt.EventQueue.access$500(Unknown Source)
   at java.awt.EventQueue$3.run(Unknown Source)
   at java.awt.EventQueue$3.run(Unknown Source)
   at java.security.AccessController.doPrivileged(Native Method)
   at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
   at java.awt.EventQueue.dispatchEvent(Unknown Source)
   at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
   at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
   at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
   at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
   at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
   at java.awt.EventDispatchThread.run(Unknown Source)
 
Steht ja im Stacktrace wo das Problem liegt.

Wo befindet sich die Datei denn relativ zum Projekt gesehen?
 
Steht doch da: java.io.FileNotFoundException: voc1.txt (Das System kann die angegebene Datei nicht finden)

Stelle sicher, dass es die Datei voc1.txt auch gibt. Erwartet wird die Datei, da der Pfad relativ angegeben wurde, im selben Verzeichnis wie dein Projekt. Welcher konkrete Pfad angezeigt wird, kannst du mit

Code:
String filePath = new File("").getAbsolutePath();
ermitteln und deine Datei dahin verfrachten. Normalerweise legt man Dateien aber unter src/main/resources oder src/test/resources ab, je nachdem, ob die Datei für Testzwecke oder für den Betrieb gedacht ist.
 
gut der fehler ist behoben aber da ist immernoch die Meldung(war ich aber auch doof.. :D)
Java:
java.lang.NullPointerException
   at main.<init>(main.java:59)
   at main$1.run(main.java:33)
   at java.awt.event.InvocationEvent.dispatch(Unknown Source)
   at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
   at java.awt.EventQueue.access$500(Unknown Source)
   at java.awt.EventQueue$3.run(Unknown Source)
   at java.awt.EventQueue$3.run(Unknown Source)
   at java.security.AccessController.doPrivileged(Native Method)
   at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
   at java.awt.EventQueue.dispatchEvent(Unknown Source)
   at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
   at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
   at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
   at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
   at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
   at java.awt.EventDispatchThread.run(Unknown Source)
 
Code:
       try {
           @SuppressWarnings({ "unused", "resource" })
           BufferedReader in = new BufferedReader(new FileReader("voc1.txt"));
       } catch (FileNotFoundException e1) {
           // TODO Auto-generated catch block
           e1.printStackTrace();
       }
         int counter = 0;
         try {
           while ( in .readLine() != null ) {
               counter++;
             }
       } catch (IOException e1) {
           // TODO Auto-generated catch block
           e1.printStackTrace();
       }
Benutzt du keine IDE? Wo genau tritt die NP Exception auf? Ich glaube das liegt daran, dass die Zeile

while ( in .readLine() != null ) {

nicht weiß, was in bedeutet, da du das Objekt weiter Objekt außerhalb des Scopes erstellst. Achte auf deine Blockstellungen ({...}).
 
Packe die Schleife
Code:
while ( in .readLine() != null )
in den try catch Block wo du die Variable in initialisierst.
Counter muss dann natürlich vor den try catch Block hin.
 
das war mir zuviel.. :D kannst du mir den code mal senden
Vom Smartphone sicher nicht. ;) Du hast doch den Code verschiebe den besagten Code einfach.

Siehe letzten Post von @Kababär

Aber auch Vocdeu, Vocdeu1 sollte außerhalb von den try catch Block erstellt werden.

Erstelle eine Methode die dir die Anzahl der Zeilen zurück gibt. Du verwendest sehr viel doppelten Code.

Die Ausgabe der Dauer ergibt auch kein Sinn. Aktuell Zeit minus Start Zeit wäre sinnvoller.
 
Zuletzt bearbeitet:
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben