Null Pointer Exeption

Null Pointer Exeption
M4
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 5 lat
  • Postów:221
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

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

dalej w kodzie

Kopiuj
Bipartite b = new Bipartite(edge);
K5
Wrzuć cały kod tej klasy + stack trace z nullpointerem.
atmal
  • Rejestracja:około 8 lat
  • Ostatnio:14 dni
  • Postów:913
0
Kopiuj
Bipartite.V = v;

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

Kopiuj
this.V = v;

Failure of one test is a tragedy, failure of fifty is a statistic.
M4
nadal ten sam błąd bez this też to samo
AK
To tylko pochodna static V, to jest w ogóle jakiś niejasny projekt @atmal Mam na myśli że twoja rada chowa problem pod dywan.
M4
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 5 lat
  • Postów:221
0
Kopiuj
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;
	}
}
Kopiuj
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
K5
Mogłeś wrzucić cały kod, aby numery linii zgadzały się z tymi ze stacktracem. Błąd mówi, że próbujesz się dostać do indeksu tablicy, którego nie ma. Wrzuć cały kod, albo tu, albo pastebin :)
AF
  • Rejestracja:prawie 18 lat
  • Ostatnio:około miesiąc
0

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

M4
Możesz dokładnie powiedzieć, gdzie mam błąd, bo tworzę tablicę i wypełniam ją -1 (albo coś źle robię)
jarekr000000
@Mattii4211: jak przestaniesz być tajemniczy i wrzucisz CAŁY kod, to może ktoś pomoże. Na razie wrzucasz kawałki i do tego przekłamujesz. (Piszesz o NPE, a masz ArrayIndexOutOfBoundsException).
M4
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 5 lat
  • Postów:221
1
Kopiuj
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;
	}
}


K5
Dorzuć jeszcze plik dane, bo sami sobie ich nie wygenerujemy :) ps nigdy nie nazywaj swoich klas nazwami które już są używane przez Java (mówie tu o twoim List).
M4
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 5 lat
  • Postów:221
0

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

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

edytowany 1x, ostatnio: Mattii4211
K5
  • Rejestracja:około 6 lat
  • Ostatnio:około 10 godzin
  • Postów:1002
1
Kopiuj
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:

Kopiuj
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)

edytowany 5x, ostatnio: kixe52
M4
Dzięki wielkie, niby niewielki błąd ale sam bym nie wpadł na to :)
M4
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 5 lat
  • Postów:221
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:

Kopiuj
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;
			}
	}
K5
  • Rejestracja:około 6 lat
  • Ostatnio:około 10 godzin
  • Postów:1002
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ł.

edytowany 1x, ostatnio: kixe52
M4
tablica jest na tyle duża że nie przekroczę jej zakresu
AF
  • Rejestracja:prawie 18 lat
  • Ostatnio:około miesiąc
0
Mattii4211 napisał(a):

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

Zły warunek.

M4
Możesz wyjaśnić dlaczego, bo ja nie mam zielonego pojęcia.
Delor
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 2 lata
0
Kopiuj
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:

Kopiuj
for(...; i==0; ...) {
  ...
  if(i==0)
    ...
}
M4
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 5 lat
  • Postów:221
0

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

Delor
bo przy i==0 kończy się pętla...
Delor
Chwila. Zamiana którego warunku?
M4
Jakoś chyba nie myślę logicznie ale nie mam pojęcia jak zrobić tą pętlę właściwie
M4
for (int i = start; i == -1; i--)
Delor
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 2 lata
0

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

edytowany 1x, ostatnio: Delor
M4
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 5 lat
  • Postów:221
0

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

Kopiuj
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?

edytowany 1x, ostatnio: Mattii4211
K5
Spróbuj w swoim pliku, w którym masz własną implementację Listy, zaimportować java.util.List :)
M4
Na bank wyskoczy błąd xd ale to łatwe do przewidzenia
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)