File + Item als Klasse modellieren

Folgendes Problem
Nur Fall 2 Funktioniert

I. ```

public void blabla(String x)
{
path = x; // x = rusty_dagger
}

public static File weapons = new File(“C:”+File.separator+“sys”+File.separator+“weapons”+File.separator+path+".txt");```

Wenn ich überprüfe, was für ein Pfad das insgesamt in File 1 ergibt, ist er komplett identisch mit fall II.

II. public static File weapons = new File("C:"+File.separator+"sys"+File.separator+"weapons"+File.separator+"rusty_dagger+".txt");

import java.util.ArrayList;
import java.util.Scanner;
import java.io.*;

// um in eine textdatei zu schreiben
public class WeaponsDataBase
{
    public static String name;
    public static String quote; 
    public static int maxlife;
    public static int armor;
    public static int magc_armor;
    public static int stamina;
    public static int phys_attack;
    public static int magc_attack;    
    public static int mana;
    public static int spec_ability1;
    public static int spec_ability2;
    public static int quantity;
    public static int slot;
    public static int quality;

    public static int itemsize = 1; // höchste id des letzten items

    public static String path;  

    public static ArrayList alname = new ArrayList();
    public static ArrayList alquote = new ArrayList();
    public static ArrayList almaxlife = new ArrayList();
    public static ArrayList alarmor = new ArrayList();
    public static ArrayList almagc_armor = new ArrayList();
    public static ArrayList alstamina = new ArrayList();
    public static ArrayList alphys_attack = new ArrayList();
    public static ArrayList almagc_attack = new ArrayList();
    public static ArrayList almana = new ArrayList();
    public static ArrayList alspec_abil1 = new ArrayList();
    public static ArrayList alspec_abil2 = new ArrayList();
    public static ArrayList alquantity = new ArrayList();
    public static ArrayList alslot = new ArrayList();
    public static ArrayList alquality = new ArrayList();

    public static void itemName(String x)
    {
        path = x;

    }       

    public static File weapons = new File("C:"+File.separator+"sys"+File.separator+"weapons"+File.separator+path+".txt"); // muss geändert werden  bei installation   
  
    public static void loadItems()
    {

        if (weapons.exists())
        {

            try
            {

                Scanner sc = new Scanner(weapons); 

                for (int i = 0; i < itemsize ; i++) // speist die textdatei in arraylists 
                {

                   alname.add(sc.nextLine()); // Name
                    alquote.add(sc.nextLine()); // Beschreibung
                    almaxlife.add(sc.nextLine()); // Leben
                    alarmor.add(sc.nextLine()); // Rüstung
                    almagc_armor.add(sc.nextLine()); // Schutz vor Magie
                    alstamina.add(sc.nextLine()); // Stamina
                    alphys_attack.add(sc.nextLine()); // Physischer Schaden
                    almagc_attack.add(sc.nextLine());// Magischer Schaden
                    almana.add(sc.nextLine()); // Mana
                    alspec_abil1.add(sc.nextLine()); // Spezielle Fähigkeiten
                    alspec_abil2.add(sc.nextLine()); // ""
                    alquantity.add(sc.nextLine()); // Geld Wert
                    alslot.add(sc.nextLine()); // Stelle des Equips
                    alquality.add(sc.nextLine()); // 14 ( Qualitaet)

                    System.out.println("Erfolgreich geladen");

                }
            }
            catch(FileNotFoundException e)
            {
                System.out.println("FileNotFoundException");
                // nothing to do
            }           
        }
        else
        {
            System.out.println("File: " + path + " not found.");

        }

    }

    public static void showItemStats(int x) // Id des Items ausgeben
    {
        if (alname.size() > 0)
        {
            
            System.out.println("[" + alname.get(x) + "]" );
            System.out.println("[" + alquote.get(x) + "]" );
            System.out.println("[" + almaxlife.get(x) + "]" );
            System.out.println("[" + alarmor.get(x) + "]" );
            System.out.println("[" + almagc_armor.get(x) + "]" );
            System.out.println("[" + alstamina.get(x) + "]" );
            System.out.println("[" + alphys_attack.get(x) + "]" );
            System.out.println("[" + almagc_attack.get(x) + "]" );
            System.out.println("[" + almana.get(x) + "]" );
            System.out.println("[" + alspec_abil1.get(x) + "]" );
            System.out.println("[" + alspec_abil2.get(x) + "]" );
            System.out.println("[" + alquantity.get(x) + "]" );
            System.out.println("[" + alslot.get(x) + "]" );
            System.out.println("[" + alquality.get(x) + "]" );
        }
        else 
        {
            System.out.println("Error beim auslesen der datei");
        }

    }
}```

Das kann so nicht funktionieren.
Deine Klassenvariable weapons wird initialisiert sobald die Klasse geladen (das erste mal genutzt) wird. Zu dem Zeitpunkt hat path noch den Wert null. Ob du den Wert von path nun später noch änderst spielt für weapons keine Rolle mehr.

Dein ganzes Programm ist überaus unglücklich geschrieben, hier ein paar Punkte die man verbessern sollte:

  1. In deiner Klasse ist alles static, das sollte es nicht sein!
  2. Die 15 ArrayListen sind unnötig. Schöner wäre es wenn du dir eine Klasse Weapon schreibst und hier mit einer List<Weapon> arbeitest. Stichwort Objektorientierung.

Das erstmal auf die schnelle :slight_smile:

1.0 Wie kann ich das denn ändern ?

1.1 Warum sollte es denn nicht static sein ? Ich will halt ständigen zugriff drauf haben. Für mich spielt es keine Rolle das andere darauf zugreifen könnten, falls es das ist was du meinst :).

[quote=Quiji]1.0 Wie kann ich das denn ändern ?[/quote]Einfach das Schlüsselwort static weglasen.
Natürlich musst Du dann ein Objekt Deiner Klasse erzeugen, auf dem Du dann die Methoden aufrufst.

[quote=Quiji;105742]1.1 Warum sollte es denn nicht static sein ?[/quote]Platt gesagt, weil Java eine objektorientierte Sprache ist. Wenn Du den Umgang mit Objekte vermeiden willst programmiere in C.

Nun ist Java deshalb eine OO-Sprache, weil das gewisse Vorteile hat. Der wichtigste ist (IMHO) Polyporphie.

bye
TT

1.0_re = Habe nun anhand des Objektes getan. Findet er aber immernoch nicht.
Er schmeisst mich jedes mal in

   System.out.println("File: " + path + " not found."); 

obwohl ich mir den pfad vorher ausgeben lasse.

C:\sys\weapons\rusty_dagger.txt

Danke (Y)

Bist Du sicher, dass die Datei dort ist?

bye
TT

C:\sys\weapons"path"+".txt"

C:\sys\weapons\rusty_dagger.txt

Danke (Y)

[quote=Timothy_Truckle;105746]Einfach das Schlüsselwort static weglasen.
Natürlich musst Du dann ein Objekt Deiner Klasse erzeugen, auf dem Du dann die Methoden aufrufst.[/quote]
Es ändert nichts einfach static wegzumachen, da die Variable weiterhin nur genau einmal dann gesetzt wird wenn eine Instanz erstellt wird. Das nachträgliche ändern von path hat natürlich keine Auswirkungen auf weapons.

@TO:
Was hast du umgebaut? Zeig doch mal deinen jetzigen Code.

Gibt es denn einen einfachen Weg dieses path in new File zu beeinflussen ?
Ich habe noch eine andere Methode um zu erreichen was ich möchte.
Aber ich finde diese Methode persönlich einfach “sauberer”.

public File weapons = new File("C:"+File.separator+"sys"+File.separator+"weapons"+File.separator+path+".txt");
public String path;

public void weaponName(String x)
    {
        path = x;
        path = path.toLowerCase();
        path = path.trim();
        System.out.println(path);
    }       
 public void loadWeapons()
    {

        if (weapons.exists())
        {           
            try
            {
                Scanner sc = new Scanner(weapons); 
                for (int i = 0; i < itemsize ; i++) // speist die textdatei in arraylists 
                {

                    alname.add(sc.nextLine()); // Name
                    alquote.add(sc.nextLine()); // Beschreibung
                    almaxlife.add(sc.nextLine()); // Leben
                    alarmor.add(sc.nextLine()); // Rüstung
                    almagc_armor.add(sc.nextLine()); // Schutz vor Magie
                    alstamina.add(sc.nextLine()); // Stamina
                    alphys_attack.add(sc.nextLine()); // Physischer Schaden
                    almagc_attack.add(sc.nextLine());// Magischer Schaden
                    almana.add(sc.nextLine()); // Mana
                    alspec_abil1.add(sc.nextLine()); // Spezielle Fähigkeiten
                    alspec_abil2.add(sc.nextLine()); // ""
                    alquantity.add(sc.nextLine()); // Geld Wert
                    alslot.add(sc.nextLine()); // Stelle des Equips
                    alquality.add(sc.nextLine()); // 14 ( Qualitaet)

                    System.out.println("Erfolgreich geladen");

                }
            }
            catch(FileNotFoundException e)
            {
                System.out.println("FileNotFoundException");
                // nothing to do
            }           
        }
        else
        {
            System.out.println("File: " + path + ".txt not found.");
        }

    }

  













Danke (Y)

Wie schon gesagt:

Du solltest dich nochmal mit dem Thema Objektorientierung beschäftigen. Das zu verstehen ist essenziell für die Javaprogrammierung.
Das laden deiner Waffen TXT-files könnte man bspw. so umsetzen:

public class WeaponLoader
{
    final private String basePath;

    public WeaponLoader(String basePath)
    {
        this.basePath = basePath;
    }

    public Weapon loadWeapon(String weaponName) throws FileNotFoundException
    {
        // build the full path
        File weaponFile = new File(basePath, weaponName + ".txt");

        if (!weaponFile.exists()) {
            // Fehlerbehandlung, evtl. FileNotFoundException exception werfen
        }

        Scanner in = new Scanner(weaponFile);

        // Daten auslesen und Weapon Instanz erstellen

        return new Weapon(name, description, ...);
    }
}

Nutzen tust du die Klasse dann so:

WeaponLoader weaponLoader = new WeaponLoader("C:/sys/weapons");
Weapon rustyDagger = weaponLoader.loadWeapon("rusty_dagger");

Du musst die Zuweisung
weapons= ...
natürlich nach dem setzen von path also in Zeile 9 eines letzten Codeschnipsels machen.

bye
TT

Danke, ich werde mich gleich in Ruhe durch den Code durcharbeiten. Ich hasse copy & paste.

(Y)

Also deine Idee mit der Liste, ist die das ich einmal alles reinlade und dannach wieder lösche Wenn ich die Daten verwendet habe ?
Ich sehe in der Liste keinen großen Unterschied zur ArrayList außer das ich es auf den Index aufgeteilt habe.

Ich verstehe deinen Code teilweise aber nicht wie ich die Klasse Item gestalten soll :confused:

Danke(Y)

neben all den Sprachmitteln wie Variablen, Methoden, Konstrollstrukturen (Schleifen + if)
sind die zweiten Grundlagen von Java, von objektorientierter Programmierung, das Schreiben und Verwenden von Klassen und Objekten

das solltest du in einem Grundlagenlehrbuch erlernen,
wenn schon nicht ganz ohne Fragen, dann zumindest lesen versuchen und Fragen speziell dazu stellen,
einfache Test-Programme ohne gleich 10 verschiedene Variablen, ohne aus Datei lesen usw.
Galileo Computing :: Java ist auch eine Insel - 5 Eigene Klassen schreiben

schau dir da die einfache Klasse Person an, Kassendefinition mit Variablen, Erzeugung von Objekt, Belegung, Werte wieder auslesen, alles simpel


falls von Klasse und Objekten noch nicht überzeugt:
wie würde es dir gefallen wenn du kein konkretes File-Objekt erzeugen und verwenden könntest,
sondern stattdessen in irgendeiner statischen Klasse in Listen getrennt basePath und filename ablegen und laden müsstest…

genauso mit Scanner, String und allem anderen, eben auch die Listen selber die du zur Simulation der Daten einsetzt,
was wäre wenn es keine Listen als eigenständige Objekte gäbe?

Klassen sind extrem wichtig, lernen vor allem anderen aktuell, nun da du anscheinend schon ne Menge von Strings, Schleifen & Co. weist,
Grundlagen sind da, Klassen nun überüberfällig, alles andere kann und muss warten


nebenbei: versuche JAVA- statt CODE-Tags einzusetzen, suche den entsprechenden Button oder tippe es besser ein

und ist das (Y) eine Art Signatur? dann sei es gestattet wenn es nicht ohne geht (hab ja selber auch eine :wink: )
ist aber etwas irritierend,

zumindest das ‚Danke‘ scheint ja nur sporadisch nötig zu sein, versuche doch wenigstens darauf zu verzichten,
jedenfalls mitten in der Diskussion in ständigen Postings, an einzelnen besonderen Erfolgsmomenten mag es ja angehen,
allgemein im Hin und Her hat niemand was davon, jede Störung des Leseflusses ist eher negativ

Noch so ein Hinweis (den ich vllt überlesen habe auf die schnelle). Statt permanent “File.separator” einzubauen sollte “/” auch funktionieren, da soweit ich weiß dass dann richtig aufgelöst wird je nach Betriebssystem

na das ist schon gefährlich, wozu gäbe es sonst File.separator?

aber die Umsetzung muss so wie hier nicht sein, wenn dann lieber in einer Methode verstecken :
String path = Helper.buildUp("C:","sys","weapons",path+".txt")

oder der Einfachheit kann man ja / verwenden, aber dann noch ersetzen
String path = Helper.makeSure("C:/sys/weapons/"+path+".txt")

aber all das sind höhere Aufgaben, evtl. mit (Stichwort) Varargs-Parameter, muss für den Anfang nicht sein,

in der Tat wird / meistens und gewiss hier reichen, als allgemeingültige Lösung aber eher nicht zu nennen

/ geht wirklich, zumindest kenne ich kein System dass das nicht versteht :wink:

Nebenbei, die JVM úbersetzt das nicht, machen die subsysteme vom OS

um dazu nochmal nachzusetzen :wink: ein theoretisches Problem könnte sein,
dass man aus dem File-Objekt nicht den gleichen String herausbekommt, wie hineingegeben,

unter Windows:

        String st2 = "C:/Temp";
        System.out.println(st1);
        System.out.println(st2);
        File f = new File(st2);
        System.out.println(f.getPath().equals(st1)); // true
        System.out.println(f.getPath().equals(st2)); // false, dass / ist zu \ geworden

braucht man freilich selten, in Konfigurationsdateien/ DB will man eh nur eine Form abspeichern und muss immer auf Konvertierung achten

Mit File.seperator funktioniert es perfekt. Keine Frage

Das (Y) ist ein Synonym für Daumen Hoch, wie eine Danke :).

Jetzt verstehe ich den Grund deiner Liste.
Ich kann mich jedoch nicht entscheiden ob ich für jede Waffe ein neues Objekt erzeugen will.
Das würde ja bedeutenn bei 500 Waffen 500 Objekte. Wenn ich es in der Array Lasse habe ich halt statt 500 objekte 15 Arrays mit 500 jeweils 500 geordneten Einträgen?
Oder was meint ihr.

aber die Umsetzung muss so wie hier nicht sein, wenn dann lieber in einer Methode verstecken :
String path = Helper.buildUp(„C:“,„sys“,„weapons“,path+„.txt“)

oder der Einfachheit kann man ja / verwenden, aber dann noch ersetzen
String path = Helper.makeSure(„C:/sys/weapons/“+path+„.txt“)

Gibt den Error self-reference an. :confused:
Path als neuen String zu deklarieren macht ja nicht viel sinn dann oder ?
sozusagen als;

String path = x
String path = Helper.makeSure("C:/sys/weapons/"+x+".txt")

(Y) = Danke für die Hilfe.

ein Objekt ist immer 15 Einträgen in 15 verschiedenen Arrays/ Listen zu bevorzugen, egal ob einen Eintrag oder 10 Mio., die Anzahl macht da keinen Unterschied,
oder wenn überhaupt spricht sie noch mehr für Objekte, sofern man einen gigantischen Fürspruch noch weiter erhöhen kann