ECLIPSE / Java - Debugger erzeugt einen Fehler

Hallo Debuggte,

früher oder später kommt man ja immr an den Punkt, wo man das erste mal den Debugger einsetzen muss/darf/kann/will. die allgemeinen Schwierigkeiten dabei sind mir aus 30 Entwickler-Jahren in den unterschiedlichsten Umgebungen durchaus

bekannt. Jetzt habe ich aber das Problem, dass der Debugger verhindert, dass ich bis zu der Stelle komme, an der mein eigentliches Problem auftritt.

Die fraglichen Zeilen:
1 String FN = aFileName; // Enthält einen gültigen Pfad
2 File F = new File(FN);
3 JFileChooser OD = new JFileChooser(F, null);

42 if (OD.showOpenDialog(null) != JFileChooser.APPROVE_OPTION)

Starte ich das Programm mit STRG+F11 - also ohne Debugger - wird der Öffnen-Dialog angezeigt. Es läuft also sicher bis zu der Zeile, die ich hier mit 42 gekennzeichnet habe.

Starte ich das Programm aber mit Debugger (F11), so wirft die Zeile 3

JFileChooser OD = new JFileChooser(F, null);

eine

java.lang.NullPointerException

über die ich nichts weiter herausfinden kann.

Mein System:

  • Windows 7-64
  • Eclipse IDE for Java Developers - Version: Luna Service Release 2 (4.4.2) - Build id: 20150219-0600
  • Java 8 Update 25
  • Java SE Development Kit 8 Update 25

zu schön um die Gelegenheit auszulassen:
vielleichten diesen ‚Debugger‘ mal mit anständigen Mitteln debuggen :wink:

es gibt doch sicher trotzdem noch eine Konsole oder irgendeine normale Möglichkeit, etwas vom Programm zu erfahren,
→ gib mit dem (fast) unbestechlichten unfehlbaren Hauptbefehl des Universums, System.out.println(),
die Variablen F, FN, aFileName usw. kurz vor der NullPointerException aus,
über Debugger anschauen ist freilich auch erlaubt

evtl. auch aufwendig vorher in separate final-Variablen kopieren, extra try/catch und im catch nochmal Variableninhalt nachschauen,
im catch auch den kompletten StackTrace ausgeben, falls ihn dir der Debgger verwehrt und du ihn nicht nur aus Sparsamkeit wegläßt,
an welcher Stelle genau in der API kommt die Exception falls feststellbar?

hast du Quellcode der API vorliegen, was vielleicht nötig ist damit genaue Zeile angegeben wird?

kannst du das zu einem fertigen main-Programm zusammenstellen?

    public static void main(String[] args)     {
        String FN = ".";
        File F = new File(FN);
        JFileChooser OD = new JFileChooser(F, null);
        if (OD.showOpenDialog(null) != JFileChooser.APPROVE_OPTION)  {
            System.out.println("no no");
        }
    }
}

wird der Debugger doch wohl nicht auch anmeckern?
womit wird es zum Problem, oder nur in großen unpostbaren Programm?


Ziel:
dass es normal läuft und mit Debugger zum Fehler ist eine Sache, mag ja so sein,
nun wäre eben interessant zu debuggen, an welcher Stelle der Ablauf abweicht, reagiert nur JFileChooser anders oder schon vorher was mit Pfaden, weil Programm anders ausgeführt

Manchmal sitzt der Fehler einfach auch hinter dem Bildschirm.

In diesem Falle lag das ganze wohl am JDK 1.8.25, weil nach dem Update auf 1.8.72 tut der Debugger jetzt, was er soll.

Tropsdem besten Dank an SlaterB :slight_smile:

Die sachen mit den extra Variablen hatte ich schon gemacht.

Nur um’s noch mal gesagt zu haben:

Hätte man UnitTests, bei denen man den JFC weg gemockt hätte, wäre wohl gar kein Debugging notwendig gewesen…

naja: hätte hätte Fahrradkette…

bye
TT

Hallo, damit hätte sich testen lassen können:


import java.awt.*;
import java.io.*;
import javax.swing.*;

/**
 * @author
 */
public class Temp {
    
    public static void main(String[] args) {
        String file_name = ""; // Enthält einen gültigen Pfad
        File file = new File(file_name);
        JFileChooser jfc = new JFileChooser(/* file, null */) { // mocken wie TT sagt
            @Override
            public int showOpenDialog(Component parent) throws HeadlessException {
                return JFileChooser.APPROVE_OPTION;
            }
            @Override
            public File getSelectedFile() {
                return new File("123");
            }
        };
        if (jfc.showOpenDialog(null) != JFileChooser.APPROVE_OPTION) {
            System.out.println("keine Datei gewählt");
            return;
        }
        File selected = jfc.getSelectedFile();
        System.out.println("file_name = " + file_name);
        System.out.println("file      = " + file);
        System.out.println("selected  = " + selected);
    }
}```

Die Ausgabe ist dann auch: selected = 123

Funktionalität von jfc wird einfach etwas verändert, damit alles mit dem Debugger klappt.

gRüße
TheRealUnreg

Nur als Randbemerkung: Deine Variablennamen sind suboptimal. Zum einen sollten sie in Java mit einem kleinen Buchstaben beginnen, zum anderen sollten sie (imho auch in Testcode) sprechende Namen haben.