Problem z metodą inicj. atrybut klasy NullPointerException

0

dzień dobry,

mam jedna klasę, tablicę obiektów typu tej klasy, i eclipse zwraca warning, że atrybuty klasy nie są używane lokalnie i faktycznie coś w tym jest bo w momencie użycia metody która powinna zainicjalizowac atrybut występuje błąd Exception in thread "main" java.lang.NullPointerException
To co w komentarzach to tylko moje własne notatki, proszę nie zwracac uwagi : ) dziękuje i pozdrawiam

package cwiczenie2;

import java.util.Random; 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner; //wczytywanie

public class cwiczenia2 {

	public static void main(String[] args) {
		String tempN;
		int tempI=0,tempS=0;
		Scanner sc = new Scanner(System.in);//obiekt sc ktory mi pozwoli wczytywać z klawiatury
		/*/Random losowana = new Random(); // obiekt losowanie ktory moze odwolac sie do metody klasy Random która wylosuje mi liczbe
		int nrLosowy = losowana.nextInt() % 100;
		System.out.println("Jak duzo studentow chcesz wczytac ?");
		/*/int ilosc_s = sc.nextInt();/*/ //odwolouje sie do meotdy nextInt() klasy Scanner przez obiekt sc która pozowola miwczytać do int
		System.out.print("Podaj Twoje imie: ");
		String iWpisujacego = sc.next(); // tutaj wczytuje stringa też przez scannera'a ale 1) musi być import java.util.Scanner; 2.)Obiekt klasy Scanner prze który będziemy wywoływac funkcje klasy/*/
		student[] uczen = new student[ilosc_s];
		for(int i=0; i<ilosc_s; i++)
		{
			System.out.println("Podaj nr indeksu studenta nr "+(i+1));
			tempI=sc.nextInt();
			uczen[i].nadajNumer(tempI);
			System.out.println("Podaj nazwisko studenta "+tempI);
			tempN = sc.next();
			uczen[i].nadajNazwisko(tempN);
			System.out.println("Podaj srednia studenta "+tempI);
			tempS = sc.nextInt();
			uczen[i].nadajSrednia(tempS);
		}
	}

}

class student
{
	student() {};
	private String nazwisko;
	private int srednia;
	private int nrIndeksu;
	public void nadajNumer(int a) {this.nrIndeksu = a;}
	public void nadajNazwisko(String n) {this.nazwisko = n;}
	public void nadajSrednia(int s) {this.srednia = s;}
}
0

Utworzyłeś tablicę uczen, ale masz w niej same nulle.

                for(int i=0; i<ilosc_s; i++)
                {
                        uczen[i] = new sudent();
                        System.out.println("Podaj nr indeksu studenta nr "+(i+1));
                        tempI=sc.nextInt();
                        ...
0

A no tak, faktycznie, dziękuję Ci za pomoc. Pozdrawiam

0

nie chciał bym co chwile zakładać nowego wątku więc zapytam się w tym już rozpoczętym poscie, rozbudowalem program o wyjatki, mianowicie moje zadanie to ustawić tak wyjątek tzn. jego obsługę, aby 2 razy nie powtórzono tego samego nazwiska zamiast funkcji equal uzylem zwykłego ==, ale myślę, że problem lezy gdzie indziej.

Tu chodzi tylko o pomoc przy bloku try i catch na dole, program sie kompiluje i uruchamia ale nie zwraca wyjątku jeżeli dane nazwisko pojawilo się wcześniej, gdy usunę blok try catch finally a w main ie dodam throws studentByl to zawsze jest wyjątek a jak w bloku catch try to nigdy nie ma, tak wiem coś namieszałem.

package cwiczenie2;

import java.util.Random; 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner; //wczytywanie

public class cwiczenia2 {

	public static void main(String[] args) {
		String tempN;
		int tempI=0,tempS=0;
		Scanner sc = new Scanner(System.in);//obiekt sc ktory mi pozwoli wczytywać z klawiatury
		Random losowana = new Random(); // obiekt losowanie ktory moze odwolac sie do metody klasy Random która wylosuje mi liczbe
		//int nrLosowy = losowana.nextInt() % 100;
		System.out.println("Jak duzo studentow chcesz wczytac ?");
		int ilosc_s = sc.nextInt(); //odwolouje sie do meotdy nextInt() klasy Scanner przez obiekt sc która pozowola miwczytać do int
		System.out.println("Podaj Twoje imie: ");
		String iWpisujacego = sc.next(); // tutaj wczytuje stringa też przez scannera'a ale 1) musi być import java.util.Scanner; 2.)Obiekt klasy Scanner prze który będziemy wywoływac funkcje klasy
		student[] uczen = new student[ilosc_s];
		for(int i=0; i<ilosc_s; i++)
		{
			uczen[i]=new student(); //jak nie przypiszesz do obiektu uczen typu student, klasy np. bazowej "sudent()", to tablica uczen bedzie miała same nulle
			//System.out.println("Podaj nr indeksu studenta nr "+(i+1));
			tempI=losowana.nextInt(100); //=sc.nextInt();
			uczen[i].nadajNumer(tempI);
			System.out.println("Wylosowano indeks nr: "+uczen[i].zwrocIndeks());
			System.out.println("Podaj nazwisko studenta "+tempI);
			try {
				tempN = sc.next();
				uczen[i].nadajNazwisko(tempN);
				if(i>0){
					for(int j=0; j<ilosc_s; j++) {
					if(uczen[i].zwrocNazwisko() == uczen[j].zwrocNazwisko() )
						{
							throw new studentByl(); //samo to + throws studentByl przekaze bład do studentByl i koniec Exception in thread "main" cwiczenie2.studentByl komunikat i już a try i catch pozwolą go obsłużyć -> lepiej, ewentulanie naprawić
						}}
				}
			}
			catch(studentByl e) {e.zwrocByl();}//catch - procedura obslugi wyjątków
			finally {System.out.println("Wyjatek sprawdzony");}
			System.out.println("Podaj srednia studenta "+tempI);
			tempS = sc.nextInt();
			uczen[i].nadajSrednia(tempS);
		}
		System.out.println(iWpisujacego+" to juz koniec programu, dziekuje !");
	}
}
class student	
{
	student() {};
	private String nazwisko;
	private int srednia;
	private int nrIndeksu;
	public void nadajNumer(int a) {this.nrIndeksu = a;}
	public void nadajNazwisko(String n) {this.nazwisko = n;}
	public void nadajSrednia(int s) {this.srednia = s;}
	public int zwrocIndeks() {return this.nrIndeksu;}
	public String zwrocNazwisko() {return this.nazwisko;}
}

class studentByl extends Exception
{
	studentByl() {super();}
	public String zwrocByl() {return "TA OSOBA JUZ BYLA !";}
}
0

Obsługa wyjątków jest dość kosztowna, nie powinno się ich używać w takiej sytuacji. Wyjątki to Twój pomysł, czy wymóg zadaniodawcy?
Nie wyświetlasz informacji o wyjątku.

    try 
    {
         tempN = sc.next();
         uczen[i].nadajNazwisko(tempN);                
         for(int j=0; j<i; j++) 
         {
               if(uczen[i].zwrocNazwisko().equals(uczen[j].zwrocNazwisko() ))
               {
                    throw new studentByl();
               }
         }                       
     }
     catch(studentByl e) 
     {
         System.out.println(e.zwrocByl());
     }
     finally 
     {
         System.out.println("Wyjatek sprawdzony");
     }

W tym zadaniu powinieneś użyć wyjątków do sprawdzania czy użytkownik poprawnie wpisuje średnią.
P.S. Dlaczego średnia ma być liczba całkowitą?

0

no tak, wyświetlić, umknęło mi.
W zadaniu nic nie pisze o konieczności użycia wyjątków, tylko aby program poinformował o wprowadzeniu 2x tego samego nazwiska - tak wiem, poinformować a nie pozwolić wprowadzić wprowadzić 2x to różnica, przepraszam mój błąd. Czyli rozumiem mniej kosztowne będzie użycie zwykłych pętli i if'a niż sprawdzania za pomocą wyjątków nazwiska, a try catch do spr. poprawności wprowadzanej średniej, ok, to po prostu zmienię to bo nie wiedziałem dzięki.
No właśnie tą średnią muszę zmienić na double bo się zapędziłem.

tzn. tak dokładnie brzmi ten podpunkt zadania:
"(...) Podczas wprowadzania informacji program powinien wypisywać ostrzeżenie,
jeśli student o podanym nazwisku już wcześniej został wprowadzony
(...)"

0

Pobieranie średniej możesz zorganizować np. tak:

      System.out.println("Podaj srednia studenta "+tempI);
      boolean ok = false;
      while(!ok)
      {
            String s = sc.next();
            try
            {
                tempS = Double.parseDouble(s);
                ok = (tempS>=2 && tempS<=5);
            }
            catch(NumberFormatException e)
            {
            }
            if(!ok)
            {
                System.out.println("Srednia powinna byc liczba z przedzialu [2,5]"); 
            }                          
       }

Co do nazwiska, to nie wiem co ma się dziać gdy nazwisko się powtarza:

  • komunikat informujący,
  • komunikat i prośba o potwierdzenie faktu, że nazwisko się powtarza,
  • pytanie w pętli aż użytkownik poda nowe nazwisko.

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