logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Błąd przy użyciu metody getDiceValue() w klasie RandomGenerator w Java

chlo 29 Paź 2005 18:41 3350 9
REKLAMA
  • #1 1938507
    chlo
    Poziom 17  
    Posty: 282
    Pomógł: 4
    Ocena: 4
    Otóż mam zamplementowana taką klasę:
    
    class RandomGenerator {
         static java.util.Random random;
         RandomGenerator(){
              random = new java.util.Random();
         }
         static public int getRandom(int a, int b){
    
              return a + (random.nextInt())*(b-a);
         }
    
         static public int getDiceValue() {
              return getRandom(1, 6);
    
         }
    
    }
    

    Ale jeśli próbuję wywołać w klasie main metodę getDiceValue() i przypisać zmiennej int zwracaną przez nią wartość:
     int tmp=RandomGenerator.getDiceValue();

    to wyrzuca mi błąd.Czemu?? Przy kompilacji jest wszystko ok,błąd jest widoczny podczas wykonywania programu.Proszę o szybką pomoc (jeśli ktoś ma pomysł może rzuci jakiś inny kod generatora).
  • REKLAMA
  • #2 1938527
    Sam Sung
    Poziom 33  
    Posty: 2002
    Pomógł: 227
    Ocena: 571
    Używasz niezainicjowanego obiektu klasy Random. Inicjacja jest w konstruktorze, a najprawdopodobniej nie tworzysz żadnego obiektu.
    Pole random należy zainicjować w bloku statycznym, a nie w konstruktorze klasy.

    Dodano po 1 [godziny]:

    class RandomGenerator {
         static java.util.Random random;
         static {
              random = new java.util.Random();
         }
    ...
  • REKLAMA
  • #3 1941168
    chlo
    Poziom 17  
    Posty: 282
    Pomógł: 4
    Ocena: 4
    Spoko skorzystałem z rady i zadziałało. Dzięki wielkie, chociaż zaimplementowałem to w jednej linijce.
  • #4 1961992
    chlo
    Poziom 17  
    Posty: 282
    Pomógł: 4
    Ocena: 4
    Teraz mam podobny problem w programie z macierzami, nie chce mi zainicjować macierzy o danej ilości wierszy w konstruktorze.Jak to obejść??
  • REKLAMA
  • #5 1962050
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 240
    chlo napisał:
    Teraz mam podobny problem w programie z macierzami, nie chce mi zainicjować macierzy o danej ilości wierszy w konstruktorze.Jak to obejść??
    Najlepiej napisać to dobrze, ale jak podasz kod źródłowy i komunikat błędu to może ktoś podpowie.
  • #6 1962128
    chlo
    Poziom 17  
    Posty: 282
    Pomógł: 4
    Ocena: 4
    public class Macierz {
    	int ilosc_wierszy,ilosc_kolumn;
    	double mac[][]=new double[ilosc_wierszy][ilosc_kolumn];
    	
    	Macierz(int a, int b){
    		ilosc_wierszy=a;
    		ilosc_kolumn=b;
    	}
    	
    	Macierz(int l1,int l2,double liczba){
    			ilosc_wierszy=l1;
    			ilosc_kolumn=l2;
    			for(int j=0;j<mac.length;j++){
    				for(int k=0;k<mac.length;k++){
    					mac[j][k]=liczba;
    				}
    			}	
    	}
    	

    Grunt w tym, że błędu nie ma.Po prostu tworzy macierz o rozmiarze 0 na 0. Do tworzenia macierzy w programie głównym używany jest konstruktor przyjmujący 3 parametry.
  • REKLAMA
  • #8 1962581
    chlo
    Poziom 17  
    Posty: 282
    Pomógł: 4
    Ocena: 4
    Czyli proponujesz, żeby zrobić tak:
    
    int a=2;
    		double mac[][];
    		
    	Test2 (double liczba){
    			double mac[][]=new double[a][a];
    		for(int j=0;j<mac.length;j++){
    			for(int k=0;k<mac.length;k++){
    				mac[j][k]=liczba;
    			}
    		}	
    }
    

    Znamy wcześniej już a. Niestety to nie działa.
  • #9 1962723
    Sam Sung
    Poziom 33  
    Posty: 2002
    Pomógł: 227
    Ocena: 571
    chlo napisał:
    Niestety to nie działa.

    Nie napisałeś dokładnie, co nie działa, ale widzę tu 2 prawdopodobne błędy:
    
    int a=2;
    		double mac[][];
    		
    	Test2 (double liczba){
    			double mac[][]=new double[a][a]; // tutaj deklarujesz nową tablicę mac, która przesłania w zakresie ciała konstruktora tablicę mac zadeklarowaną wcześniej
    		for(int j=0;j<mac.length;j++){
    			for(int k=0;k<mac.length;k++){ // tu powinno być mac[j].length
    				mac[j][k]=liczba;
    			}
    		}	
    }
    
  • #10 1962974
    chlo
    Poziom 17  
    Posty: 282
    Pomógł: 4
    Ocena: 4
    Wielkie dzięki stary,oświeciłeś mnie. Już poprawiłem i wszystko działa.

Podsumowanie tematu

✨ Problem dotyczył błędu wykonania w Javie przy wywołaniu statycznej metody getDiceValue() klasy RandomGenerator, spowodowanego niezainicjowaniem statycznego pola random. Inicjalizacja obiektu java.util.Random była umieszczona w konstruktorze, który nie był wywoływany, co skutkowało błędem NullPointerException podczas działania programu. Rozwiązaniem było przeniesienie inicjalizacji pola random do bloku statycznego klasy. Dodatkowo poruszono problem inicjalizacji tablicy dwuwymiarowej (macierzy) w konstruktorze klasy Macierz. Błąd polegał na tworzeniu tablicy przed ustawieniem rozmiarów wierszy i kolumn, co skutkowało macierzą o rozmiarze 0x0. Zaleceniem było inicjowanie tablicy po przypisaniu wymiarów w konstruktorze oraz unikanie ukrywania pola mac przez lokalną zmienną o tej samej nazwie. Poprawne indeksowanie tablicy dwuwymiarowej oraz inicjalizacja po znanych wymiarach rozwiązały problem.
Wygenerowane przez model językowy.
REKLAMA