Null Pointer Exeption

Odpowiedz Nowy wątek
2019-05-06 20:53
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);
Wrzuć cały kod tej klasy + stack trace z nullpointerem. - kixe52 2019-05-06 21:02

Pozostało 580 znaków

2019-05-06 20:58
0
Bipartite.V = v;

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

this.V = v;
nadal ten sam błąd bez this też to samo - Mattii4211 2019-05-06 21:01
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. - AnyKtokolwiek 2019-05-06 21:11

Pozostało 580 znaków

2019-05-06 21:04
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
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 :) - kixe52 2019-05-06 21:13
daj kod main'a - AnyKtokolwiek 2019-05-06 21:20

Pozostało 580 znaków

2019-05-06 21:10
0

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

Możesz dokładnie powiedzieć, gdzie mam błąd, bo tworzę tablicę i wypełniam ją -1 (albo coś źle robię) - Mattii4211 2019-05-06 21:11
@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). - jarekr000000 2019-05-06 21:17

Pozostało 580 znaków

2019-05-06 21:17
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;
    }
}
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). - kixe52 2019-05-06 21:27

Pozostało 580 znaków

2019-05-06 21:30
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)
edytowany 1x, ostatnio: Mattii4211, 2019-05-06 21:30

Pozostało 580 znaków

2019-05-06 21:37
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)

edytowany 5x, ostatnio: kixe52, 2019-05-06 21:44
Dzięki wielkie, niby niewielki błąd ale sam bym nie wpadł na to :) - Mattii4211 2019-05-06 21:44

Pozostało 580 znaków

2019-05-06 23:18
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;
            }
    }

Pozostało 580 znaków

2019-05-06 23:21
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, 2019-05-06 23:22
tablica jest na tyle duża że nie przekroczę jej zakresu - Mattii4211 2019-05-06 23:26

Pozostało 580 znaków

2019-05-07 03:03
0
Mattii4211 napisał(a):

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

Zły warunek.

Możesz wyjaśnić dlaczego, bo ja nie mam zielonego pojęcia. - Mattii4211 2019-05-07 07:17

Pozostało 580 znaków

2019-05-07 08:16
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)
    ...
}

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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