Null Pointer Exeption

0

Mam 1 klasę i w niej metodę, w której tworzę tablicę metoda jest publiczna i rozmiar tej tablicy przekazuję po utworzeniu obiektu tej klasy i nie wiem dlaczego dostaję null pointer, bo tak jakby tablica miała długość 0 a nie tą podaną przeze mnie

private static int V;
	private int[] colorTab;
	
	public Bipartite(int v) {
		Bipartite.V = v;
		colorTab = new int[V];

dalej w kodzie

Bipartite b = new Bipartite(edge);
0
Bipartite.V = v;

Próbujesz odwołać się do klasy, nie do obiektu. Użyj:

this.V = v;
0
class Bipartite {

	private static int V;
	private int[] colorTab;
	
	public Bipartite(int v) {
		V = v;
		colorTab = new int[V];
	}
	
	public boolean isBipartite(int[][] G, int start) {
		for (int i=0; i<V; i++) 
            colorTab[i] = -1; 		
		
		colorTab[start] = 1;
		List q = new List();
		q.add(start);
		while(q.size() != 0) {
			int u = q.poll();
			
			if(G[u][u] == 1)
				return false;
			
			for(int v=0; v<V; ++v) {
				if(G[u][v] == 1 && colorTab[v] == -1) {
					colorTab[v] = 1 - colorTab[u];
					q.add(v);
				} else if(G[u][v] == 1 && colorTab[v] == colorTab[u])
					return false;
			}
		}
		return true;
	}
}
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
	at Bipartite.isBipartite(Zadanie3.java:152)
	at Zadanie3.main(Zadanie3.java:76) //tworzenie obiektu i wywolanie metody
0

Tworzysz tablicę bez elementów, więc odwołanie się do pierwszego elementu (o indeksie 0) jest niepoprawne.

1
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Zadanie3 {
	private static int edge;
	private static int[][] matrix;
	private static int[] adj;

	void convert(int[][] m) {
		int v = m.length;
		List[] adj = new List[v];
		for (int i = 0; i < v; ++i)
			adj[i] = new List();

		for (int i = 0; i < m.length; i++) {
			for (int j = 0; j < m[i].length; j++) {
				if (m[i][j] == 1) {
					adj[i].add(j);
				}
			}
		}
	}

	public static void main(String[] args) {
		try {
			Scanner scanner = new Scanner(new File("dane.txt"));
			String line;
			int a, b, x, edge = 0;
			scanner.nextLine();

			while (scanner.hasNextLine()) {
				line = scanner.nextLine();
				x = line.indexOf(",");
				a = Integer.valueOf(line.substring(1, x));
				b = Integer.valueOf(line.substring(x + 1, line.length() - 1));
				System.out.println("A;" + a + " B:" + b);
				edge = Math.max(a, b);
			}
			System.out.println(edge);
			matrix = new int[edge + 1][edge + 1];
			for (int i = 0; i < matrix.length; i++) {
				for (int j = 0; j < matrix[i].length; j++) {
					matrix[i][j] = 0;
				}
			}
			scanner.close();
			Scanner scanner1 = new Scanner(new File("dane.txt"));
			String line1;

			scanner1.nextLine();
			while (scanner1.hasNextLine()) {
				line1 = scanner1.nextLine();
				x = line1.indexOf(",");
				a = Integer.valueOf(line1.substring(1, x));
				b = Integer.valueOf(line1.substring(x + 1, line1.length() - 1));
				matrix[a][b] = 1;
				// matrix[b][a] = 1;
			}

			for (int i = 0; i < matrix.length; i++) {
				for (int j = 0; j < matrix[i].length; j++) {
					System.out.print(matrix[i][j]);
				}
				System.out.println("");
			}
			scanner1.close();
		} catch (FileNotFoundException e) {
			System.out.println(e.getMessage());
			e.printStackTrace();
		}
		
		Bipartite b = new Bipartite(edge);
		if(b.isBipartite(matrix, 0))
			System.out.println("Graph is bipartite");
		else
			System.out.println("Graph isn't bipartite");
	}

}

class List {
	private Integer[] tab;
	private int s, start = 0;

	public List(int v) {
		tab = new Integer[v + 1];
		for (int i = 0; i < tab.length; i++) {
			tab[i] = null;
		}
	}

	public List() {
		tab = new Integer[512];
		for (int i = 0; i < tab.length; i++) {
			tab[i] = null;
		}
	}

	public int size() {
		return s;
	}

	public int poll() {
		int head = 0;
		for (int i = 0; i < tab.length; i++)
			if (tab[i] != null) {
				head = tab[i];
				tab[i] = null;
				s--;
				break;
			}

		return head;
	}

	public void add(int v) {
		if (start <= tab.length) {
			for (int i = start; i < tab.length; i++)
				if (tab[i] == null) {
					tab[i] = v;
					start++;
					s++;
					break;
				}
		}
	}

	public void print() {
		for (int i = 0; i < tab.length; i++)
			System.out.print(tab[i] + " ");
		System.out.println("");
	}
}

class Bipartite {

	private static int V;
	private int[] colorTab;
	
	public Bipartite(int v) {
		V = v;
		colorTab = new int[V];
	}
	
	public boolean isBipartite(int[][] G, int start) {
		for (int i=0; i<V; i++) 
            colorTab[i] = -1; 		
		
		colorTab[start] = 1;
		List q = new List();
		q.add(start);
		while(q.size() != 0) {
			int u = q.poll();
			
			if(G[u][u] == 1)
				return false;
			
			for(int v=0; v<V; ++v) {
				if(G[u][v] == 1 && colorTab[v] == -1) {
					colorTab[v] = 1 - colorTab[u];
					q.add(v);
				} else if(G[u][v] == 1 && colorTab[v] == colorTab[u])
					return false;
			}
		}
		return true;
	}
}


0

plik jest ok, jak i cała reszta. Problem jest tylko z tą tablicą colorTab

8
(0,1)
(0,3)
(1,0)
(1,2)
(3,0)
(3,2)
(2,1)
(2,3)

1
Bipartite b = new Bipartite(edge);

W tym miejscu odwołujesz się do edge z klasy Zadanie3 (które jest 0, przez co tworzysz tablicę z ilością indeksów równą 0) przez co w metodzie isBipartite dostajesz exception przy próbie wywołania tego:

colorTab[start] = 1;

Prawdopodobnie chciałes użyć tutaj edge z bloku try catch :)

ps polecam zapoznać się z debuggerem
ps2 jak prosisz ludzi o pomoc to spraw by byli w stanie Ci pomóc. Będąc tajemniczym nic nie wskurasz
ps3 next time wrzuc kod w 100% taki sam jak u CIebie, bo linie ze stacktrace'a dalej się nie zgadzały
ps4 Przekopiuje ze swojego komentarza: NIGDY nie nazywaj swoich klas nazwami które już są używane przez Java (mówie tu o twoim List)

0

A mam jeszcze jedno pytanie. Tworze tą swoja implementację listy i w jaki sposób stworzyć metodę addFirst ? Coś takiego nie działa odpowiednio:

public void addFirst(int v) {
	//start - ostatni dodany element
			for(int i=start; i==0; i--) {
				tab[i+1] = tab[i];
				if(i==0)
					tab[0] = v;
			}
	}
0

Aby dodać do tablicy obiekt na samym początku, musisz stworzyć nową tablicę o rozmiarze 1 większym niż poprzednia. Następnie "przesunąć" wszystkie wartości ze starej tablicy i wrzucić nową wartość na początek. Nie widzę abyś tworzył nową tablicę oraz ją zwracał.

0
Mattii4211 napisał(a):

for(int i=start; i==0; i--) {

Zły warunek.

0
for(1; 2; 3){
  4
}

Kolejność wykonania:
1, 2, 4, 3, 2, 4, 3, 2, ...
2 to warunek końca pętli i jeżeli jest spełniony to 4 (wnętrze pętli) nie wykona się.
Twoja pętla:

for(...; i==0; ...) {
  ...
  if(i==0)
    ...
}
0

Ok, rozumiem ale zmiana warunku na i == -1 też nic nie pomogła

0

Po wykonaniu pętli masz wszystkie elementy przesunięte więc wtedy możesz wstawić nowy. Pamiętaj o uaktualnieniu wartości start.

0

Oczywiście, pętla wygląda tak i działa jak powinna:

public void addFirst(int v) {
		for (int i = start; i > -1; i--) {
			tab[i + 1] = tab[i];
		}
		s++; // s to rozmiar listy (aktualna ilość elementów)
		tab[0] = v;
		start++;
	}

Ale mam jeszcze pytanie o nazywanie klas. Rozumiem, że nie powinno się tego robić, bo jak ktoś użyje np List z java.lang to będzie wtedy problem. Czy o to chodzi?

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