Unbekannter Fehler

Lucaaa

Bekanntes Mitglied
Hallo!
Habe ein Programm geschrieben, dass Text mit der Rotationsverschlüsselung (auch bekannt als Cäsar-Verschlüsselung) verschlüsseln soll. Ich habe eine GUI und wollte nun die Methoden zum verschlüsseln schreiben. Erstmal um zu sehen ob es Funktioniert, habe ich gleich im Code den Text der Verschlüsselt werden soll definiert. (Später wenn es funktioniert dann mit Textfeldeingabe.) Ich habe nun folgendes Problem: Habe den Code, in eclipse wird auch kein Fehler angezeigt, aber wenn ich es starten will, wird in der Konsole irgendwas von exeption at line 14 und line 68 angezeigt.
Bitte um Hilfe, finde einfach keinen Fehler.

Code:
Java:
package de.luca.java.rotcrypt;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class gui extends JFrame{
  private JTextField textfield;
  private JTextField textfield2;
  private JTextField textfield3;
 
 public static void main(String[] args) {
   new gui();
  }
  
  public gui(){
   super("Rotationsverschlüsselung");
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    getContentPane().setLayout(null);
    setResizable(false);
    setAlwaysOnTop(true);
   textfield = new JTextField();
    textfield.setBounds(5, 30, 290, 25); // geht bis 300
    getContentPane().add(textfield);
    
  textfield2 = new JTextField();
    textfield2.setBounds(305, 30, 285, 25);
    getContentPane().add(textfield2);
    
    
    
   textfield3 = new JTextField();
    textfield3.setBounds(270, 60, 30, 20);
    getContentPane().add(textfield3);
    textfield3.setText("2");
    textfield.setText("test");
   JButton button = new JButton("Text v*erschlüsseln");
    button.setBounds(335, 60, 225, 20);
    getContentPane().add(button);
   JLabel label = new JLabel("Zu verschlüsselnden Text eingeben:");
    label.setBounds(45, 5, 280, 20);
    getContentPane().add(label);
   JLabel label2 = new JLabel("Verschlüsselter Text");
  label2.setBounds(380, 5, 280, 20);
  getContentPane().add(label2);
    
   JLabel label3 = new JLabel("Um wie viele Stellen soll verschoben werden?");
    label3.setBounds(5, 60, 280, 20);
    getContentPane().add(label3);
   
   
   
   
    setLocation(50, 50);
    setSize(600, 117);
    setVisible(true);
    
    verschlüsselung();
  }
  
      String text = textfield.getText();
      String verschiebung = textfield3.getText();
      int offset = Integer.parseInt(verschiebung);
  
   public  void verschlüsselung() {
    if (offset >= 1 && offset <= 127) {
    char[] meinArray = text.toCharArray();
    char[] meinNeuesArray = verschluesseln(offset, meinArray);
    
    for (int i = 0; i < meinNeuesArray.length; i++) {
     System.out.println(meinNeuesArray[i]);
    }
    }
    
    
    
    
   }
   
   
   public static char[] verschluesseln(int offset, char[] charArray) {
   char[] cryptArray = new char[charArray.length];
   for (int i = 0; i < charArray.length; i++) {
    int verschiebung = (charArray[i] + offset) % 128;
    cryptArray[i] = (char) (verschiebung);
   }
   return cryptArray;
  }

}
 
So müsste es klappen 🙂
Java:
public class gui extends JFrame {
  private static final long serialVersionUID = 1L;

  private JTextField textfield;
  private JTextField textfield2;
  private JTextField textfield3;

  private String text;
  private String verschiebung;
  private int offset;

  public static void main(String[] args) {
    new gui();
  }

  public gui() {
    super("Rotationsverschlüsselung");
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    getContentPane().setLayout(null);
    setResizable(false);
    setAlwaysOnTop(true);
    textfield = new JTextField();
    textfield.setBounds(5, 30, 290, 25); // geht bis 300
    getContentPane().add(textfield);

    textfield2 = new JTextField();
    textfield2.setBounds(305, 30, 285, 25);
    getContentPane().add(textfield2);

    textfield3 = new JTextField();
    textfield3.setBounds(270, 60, 30, 20);
    getContentPane().add(textfield3);
    textfield3.setText("2");
    textfield.setText("test");
    JButton button = new JButton("Text v*erschlüsseln");
    button.setBounds(335, 60, 225, 20);
    getContentPane().add(button);
    JLabel label = new JLabel("Zu verschlüsselnden Text eingeben:");
    label.setBounds(45, 5, 280, 20);
    getContentPane().add(label);
    JLabel label2 = new JLabel("Verschlüsselter Text");
    label2.setBounds(380, 5, 280, 20);
    getContentPane().add(label2);

    JLabel label3 = new JLabel("Um wie viele Stellen soll verschoben werden?");
    label3.setBounds(5, 60, 280, 20);
    getContentPane().add(label3);

    setLocation(50, 50);
    setSize(600, 117);
    setVisible(true);

    verschlüsselung();
  }

  public void verschlüsselung() {
    verschiebung = textfield3.getText();
    offset = Integer.parseInt(verschiebung);
    if (offset >= 1 && offset <= 127) {
      text = textfield.getText();
      char[] meinArray = text.toCharArray();
      char[] meinNeuesArray = verschluesseln(offset, meinArray);

      for (int i = 0; i < meinNeuesArray.length; i++) {
        System.out.println(meinNeuesArray[i]);
      }
    }

  }

  public static char[] verschluesseln(int offset, char[] charArray) {
    char[] cryptArray = new char[charArray.length];
    for (int i = 0; i < charArray.length; i++) {
      int verschiebung = (charArray[i] + offset) % 128;
      cryptArray[i] = (char) (verschiebung);
    }
    return cryptArray;
  }

}
 
Das Problem war, hier:
String text = textfield.getText();
String verschiebung = textfield3.getText();
int offset = Integer.parseInt(verschiebung);
Du hast diese Felder außerhalb einer Methode definiert, das heißt das was hinter dem gleich steht wird sofort nach dem Aufruf der Klasse gemacht. Da deine Textfelder zu dem Zeitpunkt aber noch nicht definiert waren (gui() wurde noch nicht aufgerufen) sind die Felder noch null.

EDIT: Desswegen schreibt man Felder (Variablen außerhalb von Methoden) immer ganz nach oben. Da sieht man sie auf den ersten Blick 😀
 
Okay aber in line 70 bei der for-Schleife gibt es irgendeinen Fehler. Außerdem möchte ich die Ausgabe im Textfield2 und nicht als System.out.println().
 
gibt es irgendeinen Fehler
Das ist keine Fehlerbeschreibung. So kann dir auch keiner helfen.
Was genau kommt denn dort für ein Fehler? Der Code sieht richtig aus..

Wenn du die Ausgabe im TextFeld möchtest, dann musst du ihm das auch noch sagen.

Am besten also deinem Button einen ActionListener hinzufügen und dort die Methode verschlüsselung() aurufen.
In der Methode verschlüsseln musst du ihm dann mittels textField2.setText(String t); sagen was in das TextFeld rein soll.

Um aus einem char[] Array ein String zu machen kannst du ganz einfach die String#valueOf(char[] a); Methode nehmen.
Hier mal ein kleines Beispiel:

Java:
button.addActionListener(new ActionListener(){
     @Override
     public void actionPerformed(ActionEvent e)
     {
          verschlüsselung();
     }
});

  public void verschlüsselung() {
    ...
    if (offset >= 1 && offset <= 127) {
      ...
      char[] meinNeuesArray = verschluesseln(offset, meinArray);
      textfield2.setText(String.valueOf(meinNeuesArray));
    }

  }

Gruß
Robert
 
Moin,
wenn ich es starten will, wird in der Konsole irgendwas von exeption at line 14 und line 68 angezeigt
BTW - Tipp für die Zukunft: in solchen Fällen ist es immer sinnvoll, die auftretenden Fehler auch zu benennen, sprich: den Stacktrace zu posten!

Zudem: der Verweis auf irgendwelche Zeilennummer macht auch nur dann sie, wenn man diese im geposteten Code aus erkennt !!

"irgendwas von exeption" sagt nun wirklich kaum was aus und zu Ratespielen hat hier keiner Lust !!

Gruß Klaus
 
gut soweit habe ich das. Jetzt habe ich nur noch das Problem, dass wenn ich in das Textfeld etwas eingebe, und auf den Button Klicke, nur die Textfelder geleert werden, und weiter nichts.

Java:
package de.luca.java.rotcrypt;
import java.awt.Color;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class gui extends JFrame {
   
 
 
 
 private JTextField textfield;
  private JTextField textfield2;
  private JTextField textfield3;
 
 public static void main(String[] args) {
   new gui();
  }
  
  public gui(){
   super("Rotationsverschlüsselung");
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    getContentPane().setLayout(null);
    setResizable(false);
    setAlwaysOnTop(true);
   textfield = new JTextField();
    textfield.setBounds(5, 30, 290, 25); // geht bis 300
    getContentPane().add(textfield);
    
  textfield2 = new JTextField();
    textfield2.setBounds(305, 30, 285, 25);
    getContentPane().add(textfield2);
    
    
    
   textfield3 = new JTextField();
    textfield3.setBounds(270, 60, 30, 20);
    getContentPane().add(textfield3);
    
   
    ActionButton handler = new ActionButton();
    
    
   JButton button = new JButton("Text v*erschlüsseln");
    button.setBounds(335, 60, 225, 20);
    button.setBackground(Color.CYAN);
    button.addActionListener((ActionListener) handler);
    getContentPane().add(button);
   JLabel label = new JLabel("Zu verschlüsselnden Text eingeben:");
    label.setBounds(45, 5, 280, 20);
    getContentPane().add(label);
   JLabel label2 = new JLabel("Verschlüsselter Text");
  label2.setBounds(380, 5, 280, 20);
  getContentPane().add(label2);
    
   JLabel label3 = new JLabel("Um wie viele Stellen soll verschoben werden?");
    label3.setBounds(5, 60, 280, 20);
    getContentPane().add(label3);
   
   
   
    
   
    setLocation(100, 100);
    setSize(600, 117);
    setVisible(true);   
  }
  
  public  void verschlüsseln() {
   String textinput = textfield.getText();
  String anzahlStellen = textfield3.getText();
     int offset = Integer.parseInt(anzahlStellen);
  
   if (offset >=1 && offset <=127){
    char[] meinArray = textinput.toCharArray();
   char[] meinNeuesArray = verschluesseln(offset, meinArray);
   String output = String.valueOf(meinNeuesArray);
   textfield2.setText(output);
   }
   
  }
   public static char[] verschluesseln(int offset, char[] charArray) {
    char[] cryptArray =new char[charArray.length];
   for (int i = 0; i < charArray.length; i++) {
    int verschiebung = (charArray[i] + offset)%128;
    cryptArray[i] = (char) (verschiebung);
   }
   return cryptArray;
   }
    
  
   
  
 

 }
 
ActionButton ist die Klasse für den ActionListener vom Button.
Hier der Code:
Java:
package de.luca.java.rotcrypt;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ActionButton implements ActionListener {
 @Override
 public void actionPerformed(ActionEvent e) {
  gui guiclass = new gui();
  guiclass.verschlüsseln();
  
 }
}
 
Und da ist das Problem. In dem Listener machst du jedes mal wenn dein Button geklickt wird eine neue Instanz von deiner GUI. Damit erstellt er auch die Felder neu --> Sie sind leer.

Am besten ist, wenn du deinm ActionButton einem Konstruktor gibst, der eine Instanz von gui erwartet. Über diese Instanz kannst du dann deine Methode aufrufen. Damit erstellst du kein neues Objekt sondern übergibst das "momentane" Objekt einfach an deinen Handler, der damit weiter arbeiten kann 🙂

Zum Bleistift:

Java:
public class Foobar
{
      public static void main(String[] args)
     {
           new Foobar();
     }

     public Foobar() {
           FoobarHandler handler = new FoobarHandler(this);
     }
   
     public void doSomething();
}







public class FoobarHandler implements ActionListener
{
      private Foobar foobar;

     public FoobarHandler(Foobar foobar)
     {
           this.foobar = foobar;
     }

    public void actionPerformed(ActionEvent e)
    {
           foobar.doSomething();
    }
}

Gruß
Robert
 
Ehm.. hab ich dir doch geschrieben? 😀

Da ist doch sogar ein Codebeispiel.. was genau verstehst du denn von oben nicht?
Fände es nicht sehr hilfreich dir jetzt den Code vorzukauen..
 
Du musst das hier:
gui guiclass = new gui();
loswerden, weil du ja sonst, wie Robat sagte ein neues Objekt erstellst und nich das alte benutzt 🙂

Also solltest du einen Konstruktor in deinen ActionButton einbauen mit dem du aus der gui-Klasse dein gui Objekt mitgibst.
Kleiner Tipp noch, auf das aktuelle Objekt kann man mit this zugeifen
 

Zurück
Oben