Klassenaufruf und Zugriffspfade

Status
Nicht offen für weitere Antworten.

mabe75

Mitglied
Hallo,

ich habe ein (2) grundsätzliches Problem und finde dazu leider keine Lösung.

Problem1

1.) ich habe eine Main Klasse und eine Klasse DB und eine Klasse System (in Eclipse als eigene JavaClass).
In der Klasse DB werden meine Datenbankanbindung und Abfragen ausgeführt.
In der Klasse System, baue ich ein Array auf und erstelle Methoden zur internen Verwaltung von Daten (aus der DB).

Variante1
Wenn ich nun in der main meine Klasse DB und System instanziere wie folgt:

Code:
 DB initdb = new DB();
System sys = new System();

habe ich zwar Zugriff auf die Methoden der einzelnen Klassen von main aus, aber wenn ich aus DB eine Methode von der Instanz System aufrufen will, sagt mir Eclipse das er die Methode nicht finden kann.
Variante2
Ich habs gelöst in dem ich erst aus der main die DB instanziere und aus DB dann System. Warum funktioniert Variante 1 nicht?


Problem2

Das 2. Problem geht, denke ich, in die gleiche Richtung. Ich habe mit einem Programm begonnen, erst meine Datenbankanbindung geschrieben dann einen Thread in main erzeugt. In diesen Thread würde ich gerne Methoden aus DB aufrufen. Das passiert in Zeile 54. Das geht aber nicht, da er die oben erzeugte initdb nicht mehr kennt. Wie kann ich denn aus einem Thread Methoden aus einer anderen Klasse aufrufen? Ich will ja den Datenbank connect nur einmal ausführen.

Hier meine Main:

Code:
package pabschreibung;

import com.sun.corba.se.spi.activation.Server;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.SQLException;
import java.util.Vector;
import org.omg.CORBA.SystemException;

public class Main {
    public Main() {
        
    }

    public static void main(String[] args) throws SQLException, IOException {
        db initdb = new db();
        initdb.connect();
        initdb.readSystems();
        // Datenbank initialisiert und SystemNamen gelesen
        System.out.println("Datenbank initialisierung: OK");
        
        System.out.println("Anzahl Systeme in Datenbank: " + initdb.systeme.getSystemAnzahl());

            ServerSocket server = new ServerSocket(4711);
            while (true) {
            Socket arbeiter = server.accept();
            new WorkerThread (arbeiter).start();
            
            
            }
         }
            static class WorkerThread extends Thread {
            Socket arbeiter;
                public WorkerThread(Socket arbeiter) throws IOException{
                this.arbeiter=arbeiter;
                System.out.println("Mit Rechner: " + arbeiter.getInetAddress() + "Port: " + arbeiter.getPort());
                int b = arbeiter.getInputStream().read();
                int c = arbeiter.getInputStream().read();
                int d = arbeiter.getInputStream().read();
                
                switch (b)
                {
                    case '1':
                        System.out.println("Client will alle System");
                        // Code für Datensatz senden hier
                    case '2':
                        //Todo2
                        System.out.println("Auf Übertragung von System: " + c + "warten und in DB schreiben");
                    case '3':
                        System.out.println("Alle Server vom System " + c + "an Client senden");
                     //Wird nicht erkannt  
                      initdb.readSystems();
                     //Wird nicht erkannt
                    case '4':
                        System.out.println("Server " + c + "vom System" + b + "in DB schreiben");
                };
                }}}
 

sliwalker

Top Contributor
Moin,

zu 1:
Macht das nicht probleme, eine Klasse System zu verwenden?
System gibts ja schon von haus aus. Vielleicht referenzierst Du mal eindeutiger. Ist aber nur geraten.
ZB: package.System.myMethod()

zu 2:
Das macht man so:
Main.this.initdb.myMethod()

greetz
SLi
 
S

SlaterB

Gast
1.
benenne deine System-Klasse um,
allein schon wenn du überall
System.out.println() verwenden willst, kommst du in Teufels Küche,

unnötig weiter darüber nachzudenken

2.
> aber Eclipse bringt immernoch einen Fehler

zu welchem Thema bei welchem Code welchen Fehler?,
so ein allgemeiner Satz bringt gar nix
 

mabe75

Mitglied
1. Ok ich nenne die Klasse um. Hacken dran, erledigt.

2. Ich möchte gerne einen Thread starten und dort in diesem Thread Methoden aus Klasse DB aufrufen. Leider gelingt mir das so gar nicht. Als Beispiel siehe Zeile 54.
 
S

SlaterB

Gast
dem Thread musst du initdb als Paramter übergeben,

schau dir an, wie du das mit Socket arbeiter machst,
darauf greifst du ja auch nicht direkt zu, sondern übergibst den als Parameter im Konstruktor

--------

übrigens: nur Aktionen in der run-Operation eines Threads werden nebenläufig ausgeführt,
was du in den Konstruktor schreibst wird alles ganz normal angearbeitet,
bevor die main-Operation mit ihrer while (true) { .. } Schleife wieder drankommt!
 

mabe75

Mitglied
Sehr gut! Es funktioniert! Nach der Übergabe als Parameter kann ich darauf zugreifen. Vielen Dank an alle!
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben