Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

23.06.2014, 13:15

Fehler tritt nur bei .jar-Datei auf

Hallo zusammen,

ich habe ein seltsames Problem bei meinem Programm. In der IDE läuft das Programm tadellos, aber wenn ich daraus eine jar erstelle und versuche sie auszuführen, bleibt das Programm nach dem Menü hängen. Ich habe inzwischen herausgefunden dass der Fehler bei dem Befehl createnewfile auftritt. Dann entsteht eine IOexception. Hat irgendjemand eine Idee warum der Fehler nur bei der jar auftritt und wie man ihn beheben kann?

Danke im Voraus,
Islandcoder

Tim Bureck

Frischling

Beiträge: 26

Wohnort: Krefeld

Beruf: Softwareentwickler

  • Private Nachricht senden

2

23.06.2014, 13:38

Ohne Stacktrace und ein bisschen Code lässt sich dazu kaum eine präzise Aussage machen.

3

23.06.2014, 13:49

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
    public Programm(int pBreite,int pHohe){
        BREITE=pBreite;
        HOHE=pHohe;
        
        SpielerBild=new Image[2];
        SpielerBildName=new String[2];
        Hund_Bild=new Image[2];
        blockiert=new boolean[160][128];
        blockiertamanfang=new boolean[160][128];
        
        derML=new Programm.ML();
        derAL=new Programm.AL();
        derAStern=new AStern();
        dieObjekte=new ArrayList();
        dasInventar=new ArrayList();
        dieOrte=new ArrayList();
        redet=false;
        
        inventar_y=-624;
        
        this.setFocusable(true);
        this.setLayout(null);
    }
    public void vorbereiten(){
        this.addMouseListener(derML);
        this.addMouseWheelListener(derML);
        this.addKeyListener(derAL);
        dieses=this;
        dasMenu = new Menu(this);
        dasMenu.start();
    }
    public void ausfuhren(JFrame pBildschirm) throws IOException{
        derBildschirm = pBildschirm;
        backBuffer = createImage(BREITE,HOHE);
        bG = backBuffer.getGraphics();
        dieGrafik=derBildschirm.getGraphics();
        Inventar_Hintergrund=Toolkit.getDefaultToolkit().getImage("Grafiken/Inventar_Hintergrund.png");
        if(Inventar_Hintergrund==null)System.exit(0);
        while(dasMenu.getButton()==0){
        }
        int db=dasMenu.getButton();

        if(db==1){

            dasMenu.entfernen(this);
            dasMenu=null;
            this.validate();
            this.repaint();
            Neues_Spiel();
        }
        else if(db==2){

            dasMenu.entfernen(this);
            dasMenu=null;
            this.validate();
            this.repaint();
            Spielstand_laden("Spielstande/Spielstand.sav");
        }
    }
    public void Neues_Spiel() throws IOException{
        String Datei=Spielstand_erstellen();

        Spielstand_laden(Datei);
    }
    
    public String Spielstand_erstellen() throws IOException{
        String Leveldatei="Level/Start.lvl";
        File file = new File("Spielstande/Spielstand.sav");
        File level = new File(Leveldatei);
        
        //Hier tritt der Fehler auf
        try {
            file.createNewFile();
        } catch (IOException ex) {
            Logger.getLogger(Programm.class.getName()).log(Level.SEVERE, null, ex);
            
            
        }


Das ist der Teil des Programms, der von Bedeutung ist. Die übergeordnete Hauptklasse ruft zuerst den Konstruktor auf, dann "vorbereiten" und dann "ausfuehren".
Wie erstellt man ein Stacktrace wenn die Datei schon eine jar ist?

EDIT: Man muss davon ausgehen dass ein neues Spiel erstellt wird, db also = 1 ist.

Tobiking

1x Rätselkönig

  • Private Nachricht senden

4

23.06.2014, 14:06

Soweit ich weiß kann man in eine Jar nicht schreiben. Und da du relative Pfade nutzt, wirst du vermutlich innerhalb der Jar landen. Es ist auch gar nicht gesagt, dass du da wo die Jar liegt Schreibrechte hast. Üblicherweise weicht man da wohl auf den AppData oder auch auf Eigene Dateien aus.

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

5

23.06.2014, 14:12

Lass dir einfach mal den Pfad ausgeben, unter dem du die Datei anlegen willst. Kann dein Programm dort überhaupt Dateien erstellen (alias Schreibrechte vorhanden)? Ist der Pfad gültig? (Existiert das Verzeichnis "Spielstande"?)

Ansonsten noch Anmerkungen zum Code:
Es werden grundsätzlich vor und nach Gleichheitszeichen (für Zuweisungen), genauso wie so ziemlich allen anderen Operatoren (+, -, *, /, %, ...) Leerzeichen gesetzt
Es ist zwar grundsätzlich deine Sache, in welcher Sprache du die Benennung der Variablen und Methoden vornimmst, nur wäre es besser, wenn du dies grundsätzlich auf Englisch machst. (Solltest du beim Deutschen bleiben, solltest du Umlaute durch "ae", "oe" oder "ue" ersetzen.)
Auch solltest du keine Artikel in Variablennamen verwenden, da diese keinen Informationsgehalt liefern.
Auch solltest du nicht einfach Abküzungen verwenden, wenn dies nicht erforderlich ist bzw. wenn die Abkürzung nicht bekannt ist. (Unter "ML" und "AL" kann ich mir gerade nichts vorstellen.)
Und du solltest bei CamelCase bleiben, wenn du dieses für die Benennung verwenden willst. Dann sollte es auch keine Ausnahmen geben, in denen Unterstriche zur Abgrenzung (invetar_y, Inventar_Hintergrund oder Spielstand_laden) verwenden.
Nur für Konstanten sollten groß-geschriebene Namen verwendet werden. ("BREITE" und "HOHE" sind keine Konstanten, da im Konstruktor eine Zuweisung stattfindet.)

Sollte die Bedingung der Schleife while(dasMenu.getButton()==0){} jemals zutreffen, hättest du eine Endlosschleife.
Wofür speicherst du die Selbstreferenz (dieses=this;)?

Ich persönlich würde keine einzeiligen Bedingungen (if([i]Bedingung[/i]) [i]Anweisung[/i]) bauen, sondern wirklich immer das entsprechende Klammernpaar einfügen und den Code auf die nächste Zeile schieben.


Nachtrag:
@Tobiking:
Wahrscheinlicher ist es, dass der relative Pfad sich auf das Ausführungsverzeichnis (sehr wahrscheinlich das Verzeichnis, in dem die JAR-Datei liegt) bezieht, es wird wohl eher weniger versucht, in die JAR-Datei zu schreiben.
Ich muss dir aber zustimmen, dass normale Programme i. d. R. nicht schreibend auf ihr Installationsverzeichnis zugreifen sollten.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

6

23.06.2014, 14:20

Die jar liegt im Ordner "dist" des Netbeans-Projekts, in dem sie standardmäßig erstellt wird. Dieses liegt in den eigenen Dateien im Ordner NetbeansProjects. Im Projektordner existieren die Ordner Level und Spielstande tatsächlich. Es bringt auch nichts wenn man die Pfade in absolute umwandelt.

ML und AL sind Mouselistener/Actionlistener, die private Klasse in der Klasse Programm sind. Dafür dient auch die Selbstreferenz, weil diese das Programm an andere Objekte übergeben müssen.

7

23.06.2014, 14:38

Die Frage ist ja auch, was bei der jar anders ist als beim in der IDE ausgeführten Programm. Hat eine jar andere Zugriffsrechte oder so?

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

8

23.06.2014, 14:52

Die Zugriffsrechte liegen am ausführenden Benutzer. Wenn du NetBeans nicht gerade mit Admin-Rechten startest, dürfte es nicht daran liegen.
Die Rechte können sich von Verzeichnis zu Verzeichnis unterscheiden. In den eigenen Dateien sollte es zwar problemlos möglich sein, evtl. wurde aber doch etwas irgendwie umgestellt.

Der Stacktrace, der dir ausgegeben wird, genauso wie der Pfad der Datei und die Ausgabe von "canWrite" wären interessant zu wissen.
Ansonsten solltest du unbedingt die Verwendung von "exists" einbauen. Eine existierende Datei muss nicht neu erzeugt werden.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

9

23.06.2014, 14:56

canWrite gibt false aus.

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

10

23.06.2014, 15:03

Dateipfad?

An dieser Stelle kannst du aber bereits gucken, ob es nicht doch besser wäre, im Benutzerverzeichnis (bspw. unter AppData, was ja bereits genannt wurde) zu arbeiten. Eine kurze Google-Suche bringt dazu auch diverse Möglichkeiten.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Werbeanzeige