vendredi 1 mai 2015

Nullpointer im Debugger, jedoch nicht beim normalen Starten

Hallo liebe Community,

ich programmiere schon länger an einem Programm zum Serialisieren von Kopier- und Verschiebevorgängen.
Nun habe ich etwas verändert, dann wollte ich debuggen und bekomme an einer ganz anderen Stelle einen Nullpointer.
Dieser Fehler tritt jedoch nur im Debugger auf und wenn ich im Konstruktor von HauptframeSeropiep einen Brakpoint setze, funktioniert auch alles normal. Auch wenn ich vor dem Instanziieren des neuen HauptframeSeropiep Objektes eine Sekunde warte läuft alles. Wenn dieser Breakpoint jedoch die ganze VM anhält läuft es nicht. Es reicht sogar schon aus das Ganze zum Laufen zu bringen, wenn ich das Instanziieren vom neuen Objekt vor das Ändern des LookAndFeels tue.

Ich habe gegooglet und dabei kam heraus, dass es sich um einen Bug in eclipse handeln kann. Nun läuft mein eclipse aber schon seit drei Jahren stabil ohne einen einzigen Absturz (unterbrochen durch rechnerbedingtes Neuinstallieren), weshalb ich auch noch nicht auf modernere Versionen gewechselt habe. Ich benutze eclipse Galileo.

Die Exception lautet:
Java Code:

  1.  
  2. Exception in thread "main" java.lang.NullPointerException
  3. at javax.swing.MultiUIDefaults.getUIError(Unknown Source)
  4. at javax.swing.UIDefaults.getUI(Unknown Source)
  5. at javax.swing.UIManager.getUI(Unknown Source)
  6. at javax.swing.JPanel.updateUI(Unknown Source)
  7. at javax.swing.JPanel.<init>(Unknown Source)
  8. at javax.swing.JPanel.<init>(Unknown Source)
  9. at javax.swing.JPanel.<init>(Unknown Source)
  10. at javax.swing.JRootPane.createGlassPane(Unknown Source)
  11. at javax.swing.JRootPane.<init>(Unknown Source)
  12. at javax.swing.JFrame.createRootPane(Unknown Source)
  13. at javax.swing.JFrame.frameInit(Unknown Source)
  14. at javax.swing.JFrame.<init>(Unknown Source)
  15. at anzeige.HauptframeSeropiep.<init>(HauptframeSeropiep.java:26)
  16. at anwendung.Steuer.initHauptframe(Steuer.java:54)
  17. at anwendung.Steuer.<init>(Steuer.java:35)
  18. at anwendung.Steuer.main(Steuer.java:75)


Ich habe die beteiligten Klassen gekürzt, um nicht so einen riesigen Wust aus Code zu posten.
Steuer:
Java Code:

  1.  
  2. //zahlreiche Importe
  3.  
  4. public class Steuer implements ErrorListener{
  5. private static final String MAYORERRORMESSAGE = "A mayor problem occurred. Please try again later or contat the developers.";
  6. private EventMulticaster em;
  7. private HauptframeSeropiep hf;
  8. private Datenhandler dh;
  9. private JDialog errDial;
  10. private JTextArea errText;
  11.  
  12. public Steuer(){
  13. this.em = new EventMulticaster();
  14. this.dh = new Datenhandler(em);
  15. initHauptframe();
  16. initEventMulticaster();
  17. }
  18.  
  19. private void initEventMulticaster(){
  20. em.addPathChangedEventListener(hf.getDataList());
  21. em.addPathChangedEventListener(hf.getDataTree());
  22. em.addDragnDropEventListener(dh);
  23. em.addErrorListener(this);
  24. }
  25.  
  26. private void initHauptframe(){
  27. SwingUtilities.invokeLater(new Runnable() {
  28. public void run() {
  29. try {
  30. UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );
  31. } catch( Exception e ) { e.printStackTrace(); }
  32. }
  33. });
  34. hf = new HauptframeSeropiep(em);
  35. hf.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
  36. hf.addWindowListener(new WindowAdapter(){
  37. @Override
  38. public void windowClosing(WindowEvent e){
  39. if (dh.isRunning()){
  40. if (JOptionPane.showConfirmDialog(hf, RessourceManager.getText("closemessage")) == JOptionPane.OK_OPTION){
  41. System.exit(0);
  42. }
  43. } else {
  44. System.exit(0);
  45. }
  46. }
  47. });
  48. hf.setVisible(true);
  49. }
  50.  
  51. public static void main(String[] args){
  52. new Steuer();
  53. }
  54.  
  55. public void errorOccured(ErrorEvent e) {
  56. //kümmert sich um passierte Fehler
  57. }
  58.  
  59. private void zeigeErrDial(String str){
  60. //zeigt einen Dialog mit einer Fehlermeldung
  61. }
  62. }


und HauptframeSeropiep:
Java Code:

  1.  
  2. //zahlreiche Importe
  3.  
  4. public class HauptframeSeropiep extends JFrame {
  5.  
  6. private static final long serialVersionUID = 1L;
  7. private JPanel jContentPane = null;
  8. private PathTextField pathTextField;
  9. private DateiList list;
  10. private DateiBaum baum;
  11. private EventMulticaster em;
  12.  
  13. public HauptframeSeropiep(EventMulticaster em) {
  14. super(); //hier wir der Nullpointer geworfen
  15. this.em = em;
  16. initialize();
  17. }
  18.  
  19. public DateiList getDataList() {
  20. return list;
  21. }
  22.  
  23. public DateiBaum getDataTree(){
  24. return baum;
  25. }
  26.  
  27. private void initialize() {
  28. this.setSize(547, 472);
  29. this.setContentPane(getJContentPane());
  30. this.setTitle("Seropiep");
  31. this.setLocationRelativeTo(null);
  32. this.setIconImage(RessourceManager.getImage("icon"));
  33. em.addPathChangedEventListener(pathTextField);
  34. }
  35.  
  36. private JPanel getJContentPane() {
  37. if (jContentPane == null) {
  38. jContentPane = new JPanel();
  39.  
  40. pathTextField = new PathTextField();
  41. pathTextField.setColumns(10);
  42.  
  43. JButton btnRück = new JButton("<");
  44.  
  45. JButton btnVor = new JButton(">");
  46.  
  47. JScrollPane scrollPane = new JScrollPane();
  48.  
  49. JScrollPane scrollPane_1 = new JScrollPane();
  50.  
  51. Processlabel processlabel = new Processlabel();
  52. em.addProcessListener(processlabel);
  53.  
  54. //erstellen des Layouts
  55.  
  56. list = new DateiList(em);
  57. scrollPane_1.setViewportView(list);
  58.  
  59. baum = new DateiBaum(em);
  60. scrollPane.setViewportView(baum);
  61. jContentPane.setLayout(gl_jContentPane);
  62. }
  63. return jContentPane;
  64. }
  65. }


PS: Ich habe eine Zeit lang auf einem Gemisch aus Deutsch und Englisch programmiert. Nach und nach wollte ich das Programm übersetzen, also bitte nicht darüber beschweren. Falls ihr noch andere Tipps für mich habt, immer her damit.


Nullpointer im Debugger, jedoch nicht beim normalen Starten

0 commentaires:

Enregistrer un commentaire