Tablica nie wyświetla obiektów.

0

Witam. Mam problem z wyświetleniem obiektów tablicy. Posiadam 2 klasy, które zawierają tablicę obiektów typu IDevices oraz obiekty, które używają tego interfejsu. Jeden obiekt wrzucam do jednej tablicy, drugi do drugiej. Niestety po wyświetleniu widać obiekt tylko z jednej z tablic. Nie wiem w czym jest problem. Mój kod:

public class ROpole implements IDevices {
private static ROpole rOpole = ROpole.getROpoleInstance();
	private static RGdańsk rGdańsk = RGdańsk.getRGdańskInstance();
private IDevices [] connectedWith = {rGdańsk, null};
...
public static ROpole getROpoleInstance() {
		if(rOpole == null)
			rOpole = new ROpole();
		return rOpole;
	}
...
}
public class RGdańsk implements IDevices {
private static ROpole rOpole = ROpole.getROpoleInstance();
	private static RGdańsk rGdańsk = RGdańsk.getRGdańskInstance();
private IDevices [] connectedWith = {rOpole, null, null};
...
public static RGdańsk getRGdańskInstance() {
		if(rGdańsk == null)
			rGdańsk = new RGdańsk();
		return rGdańsk;
	}
...
}

Funkcja odpowiedzialna za wyświetlanie obiektów:

public String getInfoAboutDevice() {
        String informationsAboutDevice = "";
    
        informationsAboutDevice += "Connected with: ";
		
        for(int count = 0; count < interfaces.length; count++) {
		if(count == interfaces.length - 1) informationsAboutDevice += connectedWith[count] + ".";
		else informationsAboutDevice += connectedWith[count] + ", ";
	}

        return informationsAboutDevice;
}    

Interfejs IDevices:

public interface IDevices {
	public void setMode(IModes mode);
	public IModes getMode();
	public void setPrompt(String prompt);
	public String getPrompt();
	public void setHostname(String hostname);
	public String getHostname();
	public void setDevice(IDevices device);
	public IDevices getDevice();
	public String getInfoAboutDevice();
	public void getInterfaces();
	public void setIpAddress(String ipAddress, int numberOfInterface);
	public void setIpMask(String ipMask, int numberOfInterface);
	public void openInterface(int numberOfInterface);
	public String getStatus(int numberOfInterface);
	public IDevices getConnectedWith(int numberOfInterface);
	public void setProtocol(int numberOfInterface);
	public int getNumberOfInterfaces();
	public String getIpAddress(int count);
}
1

Cud, że cokolwiek się wyświetla. Zamieszczony kod nie zawiera żadnej instrukcji wyświetlającej.

0

A gdzie kod wyświetlający?

0

Właśnie dodałem go na początek tematu.

0

Jeszcze nie wiemy co zawiera

interfaces
0

Już dodałem kod interfejsu.

0

pewnie do pętli nie wchodzi,
albo nie zaimplementowałeś tej metody w drugiej klasie?

0

Chodziło mi o to, że w metodzie wyświetlającej używasz jakiegoś pola-tablicy o nazwie "interfaces". Nie wiadomo co ona zawiera lub jak jest wypełniana.

0

Kod interfejsu jest mało przydatny. Jak tworzysz pole interfaces?

0

Sorki, zapomniałem tego wstawić.** interfaces** to tablica przechowująca interfejsy routera. Ma taką samą wielkość jak tablica connctedWith.

private String [] interfaces = {"fa0/0", "fa0/1", "fa0/2"};
0

connectedWith w ROpole ma length == 2

0

Tak, ale tam ilość interfejsów też jest równa 2. Tablica interfaces w klasie ROpole:

private String [] interfaces = {"fa0/0", "fa0/1"};

Tablicę interfaces z RGdańsk wkleiłem wcześniej.

0

Ogólnie nie powinieneś zakładać że te tablice są równej wielkości. Skoro wyświetlasz devices, to powinieneś się odnieść tylko do tej tabeli.

Co dokładnie wyświetla Ci funkcja dla ROpole i RGdansk?

0

Dokładnie powinna wyświetlać mi adresy obiektów w tablicy. Wyniki, jakie ja otrzymuję:
Klasa RGdańsk: Connected with: Model.ROpole@677327b6, null, null.
Klasa ROpole: Connected with: null, null.

Program w ogóle nie wyświetla obiektów tablicy connectedWith klasy ROpole i tylko pierwszy obiekt w klasie RGdańsk.

0

W metodzie getInfoAboutDevice wyświetlasz tylko jedną tablicę connectedWith, trudno się zorientować którą bo nie napisałeś w jakiej klasie jest metoda getInfoAboutDevice.
Odpowiadanie na Twoje pytanie przypomina wróżenie z fusów. Strasznie skąpisz informacje.

0

Ogólnie cały projekt wygląda tak, że ustawiam raz obiekt rOpole, a raz rGdańsk na ten, którego używam. Metoda getInfoAboutDevice wyświetla informacje o aktywnym obiekcie. Ogólnie działa tak jak powinna, problem jest tylko z tym, że inicjuję tablicę connectedWith obiektami, których potem nie widać.

0

Odpal debugera i zobacz co się dzieje.

0

Ogólnie to tam jest pewne zapętlenie. Tworzysz 2 klasy naraz i w obu wywołujesz nawzajem funkcje statyczne które dodatkowo inicjują pola. Spróbuj dla testów zrobic tak:

public class ROpole implements IDevices {
private static ROpole rOpole;
private IDevices [] connectedWith = {RGdańsk.getRGdańskInstance(), null};
...
public static ROpole getROpoleInstance() {
        if(rOpole == null)
            rOpole = new ROpole();
        return rOpole;
    }
...
}


public class RGdańsk implements IDevices {
    private static RGdańsk rGdańsk;
private IDevices [] connectedWith = {ROpole.getROpoleInstance(), null, null};
...
public static RGdańsk getRGdańskInstance() {
        if(rGdańsk == null)
            rGdańsk = new RGdańsk();
        return rGdańsk;
    }
...
}
0

W klasie RGdańsk Eclipse wyświetlił błąd: A Java Exception has occured. Konsola wyświetliła:
Exception in thread "main" java.lang.StackOverflowError
at Model.RGdańsk.getRGdańskInstance(RGdańsk.java:22)
at Model.ROpole.<init>(ROpole.java:14)

Linia 22 to kod w metodzie Singletonu:
rGdańsk = new RGdańsk();

Linia 14 to kod tablicy:
private IDevices [] connectedWith = {ROpole.getROpoleInstance(), null, null};

0

@Edit
Dobra, to co ja podałem też się zapętla. Jedyne wyjście jakie widzę to leniwa inicjalizacja connectedWith. Chociaż dużo lepszym wyjściem byłby refaktor kodu do obiektowego, bo tutaj operujesz bezpośrednio na klasach z jakiegoś powodu.

0

at Model.RGdańsk.getRGdańskInstance(RGdańsk.java:22)
at Model.ROpole.<init>(ROpole.java:14)

to się powtarza chyba z 50 razy. Reszta - tak jak napisałem.

0

Poprawiłem ten błąd. Teraz mam taki błąd, że mam dwie instancje w każdej z klas: rOpole i rGdańsk. Obydwie są instancjami Singletonów tychże klas. Kiedy zainicjuję obiekt tylko w klasie ROpole, program go wyświetla. Jeżeli natomiast zainicjuję odpowiednie obiekty w obydwu klasach, to program wyświetla tylko obiekt w klasie RGdańsk. Ogólnie wygląda to tak:

public class ROpole implements IDevices {
    private static IDevices rOpole;
    private static IDevices rGdańsk = RGdańsk.getRGdańskInstance();
    private IDevices [] connectedWith = {rGdańsk, null};
}
public class RGdańsk implements IDevices {
    private static IDevices rGdańsk;
    private static IDevices rOpole = ROpole.getROpoleInstance();
    private IDevices [] connectedWith = {rOpole, null, null};
}
0

Bo inicjowanie tych klas się zapętla. Spróbuj udawać interpreter kodu i wczytaj te 2 klasy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1