Nullpointer metody

Nullpointer metody
MrZiomenOmen
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 5 lat
  • Postów:28
0

Wywala mi tutaj Nullpointera dlaczego ? CHodzi mi o metody addEmployee

Kopiuj
package PAkietSQL;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import domain.Employee;

public class Main {
private static EntityManager entityManager;
private static EntityManagerFactory entityManagerFactory;

	public static void main(String[] args) {
		EntityManagerFactory entityManagerFactory =Persistence.createEntityManagerFactory("myDataBase") ;
EntityManager entityManager = entityManagerFactory.createEntityManager();

addEmployees();


entityManager.close();
entityManagerFactory.close();
	}

private static void addEmployees() {
	addEmployee("Maciek","ss", 2000);
	addEmployee("Maciek","ss", 2000);
	addEmployee("Maciek","ss", 2000);
	addEmployee("Maciek","ss", 2000);
	addEmployee("Maciek","ss", 2000);
	addEmployee("Maciek","ss", 2000);
	addEmployee("Maciek","ss", 2000);
	addEmployee("Maciek","ss", 2000);
	addEmployee("Maciek","ss", 2000);
	addEmployee("Maciek","ss", 2000);
	addEmployee("Maciek","ss", 2000);
	
}

private static void addEmployee(String firstName,String lastName, double salary)
{
	Employee employee=new Employee();
	employee.setFirstName(firstName);
	employee.setLastName(lastName);
	employee.setSalary(salary);
	
	entityManager.getTransaction().begin();
	entityManager.persist(employee);
entityManager.getTransaction().commit();
edytowany 1x, ostatnio: kq
Belka
  • Rejestracja:prawie 8 lat
  • Ostatnio:4 dni
  • Lokalizacja:PL
  • Postów:452
0

Co jest tutaj nullem? entityManager?

R1
  • Rejestracja:prawie 7 lat
  • Ostatnio:12 miesięcy
  • Postów:7
0

W metodzie main tworzysz nową zmienną lokalną entityManager zamiast przypisać to do pola klasy.

MrZiomenOmen
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 5 lat
  • Postów:28
0
radek1234 napisał(a):

W metodzie main tworzysz nową zmienną lokalną entityManager zamiast przypisać to do pola klasy.

ale dalej jest null

Exception in thread "main" java.lang.NullPointerException
at PAkietSQL.Main.addEmployee(Main.java:46)
at PAkietSQL.Main.addEmployees(Main.java:25)
at PAkietSQL.Main.main(Main.java:17)

twonek
pokaż jak poprawiłeś, bo dalej niewiele mówi
MrZiomenOmen
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 5 lat
  • Postów:28
0
MrZiomenOmen napisał(a):
radek1234 napisał(a):

W metodzie main tworzysz nową zmienną lokalną entityManager zamiast przypisać to do pola klasy.

ale dalej jest null

Exception in thread "main" java.lang.NullPointerException
at PAkietSQL.Main.addEmployee(Main.java:46)
at PAkietSQL.Main.addEmployees(Main.java:25)
at PAkietSQL.Main.main(Main.java:17)

public static void main(String[] args) {

	EntityManagerFactory entityManagerFactory =Persistence.createEntityManagerFactory("myDataBase") ;

entityManagerFactory.createEntityManager();

addEmployees();

entityManager.close();
entityManagerFactory.close();

R1
  • Rejestracja:prawie 7 lat
  • Ostatnio:12 miesięcy
  • Postów:7
0

Teraz w ogóle nie przypisujesz wartości z entityManagerFactory.createEntityManager();
powinno być:
entityManager = entityManagerFactory.createEntityManager();

catom
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 2 lata
  • Postów:58
0

Spróbuj może używać obiektów i nie operuj na zmiennych i metodach statycznych.
Stwórz sobie np. klasę EmployeeRepository, która będzie miała metodę addEmployee().
Niech klasa EmployeeRepository ma pole EntityManager (najlepiej z modyfikatorem final) i wstrzykiwanie tej zależności odbywa się przez konstruktor. Wtedy nie dość, że kod będzie ładniej wyglądał, to jeszcze pomoże Ci to w uniknięciu takich dziwnych problemów.

Btw. to już bodajże 3. Twój post*, w którym masz problem z przypisywaniem i zasięgiem zmiennych. Może zerknij sobie na początek, na ten skrótowy wpis Java Variable Scope.


* Żeby nie być gołosłownym:

edytowany 1x, ostatnio: catom
MrZiomenOmen
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 5 lat
  • Postów:28
0
catom napisał(a):

Spróbuj może używać obiektów i nie operuj na zmiennych i metodach statycznych.
Stwórz sobie np. klasę EmployeeRepository, która będzie miała metodę addEmployee().
Niech klasa EmployeeRepository ma pole EntityManager (najlepiej z modyfikatorem final) i wstrzykiwanie tej zależności odbywa się przez konstruktor. Wtedy nie dość, że kod będzie ładniej wyglądał, to jeszcze pomoże Ci to w uniknięciu takich dziwnych problemów.

Btw. to już bodajże 3. Twój post*, w którym masz problem z przypisywaniem i zasięgiem zmiennych. Może zerknij sobie na początek, na ten skrótowy wpis Java Variable Scope.


* Żeby nie być gołosłownym:

Nie rozmumiem tego wstrzykiwania przez konstruktor znalazłem coś takiego ale po co mi to jest właściwie
public class Shop {

private ShoppingCard shoppingCard;

@Autowired
public Shop(ShoppingCard shoppingCard) {
    this.shoppingCard = shoppingCard;
}

public void purchase() {
    shoppingCard.addProductToShoppingCard(new Product(1, "Milk"));
    shoppingCard.addProductToShoppingCard(new Product(2, "Tea"));
    shoppingCard.addProductToShoppingCard(new Product(3, "Bread"));
}

Rozumiem jak mam konstruktoe Employee(name,age) itd to że moge sobie zrobić tak Employee("Jaś",2) ale co mi daje np Employee(Card card) ?

catom
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 2 lata
  • Postów:58
0

Poprzez wstrzykiwanie przez konstruktor odnoszę się do jednej z technik programowania obiektowego - Dependency Injection - niekoniecznie z wykorzystaniem kontenerów i Inversion of Control.

Przykładowe źródła:

W Twoim przypadku, byłoby to:

Kopiuj
public class EmployeeRepository {
  
  private final EntityManager entityManager;
  
  public EmployeeRepository(EntityManager entityManager) { // o tu jest wstrzykiwanie zależności przez konstruktor - EntityManager jest Twoją zależnością
    this.entityManager = entityManager;
  }
  
  public void addEmployee(Employee employee) {
    // tutaj dodanie employee do bazy poprzez wykorzystanie wstrzykniętego wcześniej EntityManagera
  }
}

edytowany 2x, ostatnio: catom
Belka
Czy DI zadziała jeżeli on nie ma w projekcie Springa? Chodzi mi o niejawne @Inject / @Autowired
catom
@Belka: Tu nie chodzi o kontener IoC tylko o DI jako o koncept. Dependency Injection, jako koncept, nie musi w ogóle mieć nic w spólnego z JEE, Springiem czy innym Guicem.
MrZiomenOmen
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 5 lat
  • Postów:28
0
catom napisał(a):

Poprzez wstrzykiwanie przez konstruktor odnoszę się do jednej z technik programowania obiektowego - Dependency Injection - niekoniecznie z wykorzystaniem kontenerów i Inversion of Control.

Przykładowe źródła:

W Twoim przypadku, byłoby to:

Kopiuj
public class EmployeeRepository {
  
  private final EntityManager entityManager;
  
  public EmployeeRepository(EntityManager entityManager) { // o tu jest wstrzykiwanie zależności przez konstruktor - EntityManager jest Twoją zależnością

no dobra ale czym się to różni ? i po co mi to jest w konstruktorze w ogóle jak mam pole ?

this.entityManager = entityManager;

}

public void addEmployee(Employee employee) {
// tutaj dodanie employee do bazy poprzez wykorzystanie wstrzykniętego wcześniej EntityManagera
}
}

Kopiuj
MrZiomenOmen
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 5 lat
  • Postów:28
0
catom napisał(a):

Poprzez wstrzykiwanie przez konstruktor odnoszę się do jednej z technik programowania obiektowego - Dependency Injection - niekoniecznie z wykorzystaniem kontenerów i Inversion of Control.

Przykładowe źródła:

W Twoim przypadku, byłoby to:

Kopiuj
public class EmployeeRepository {
  
  private final EntityManager entityManager;
  
  public EmployeeRepository(EntityManager entityManager) { // o tu jest wstrzykiwanie zależności przez konstruktor - EntityManager jest Twoją zależnością
    this.entityManager = entityManager;
  }
  
  public void addEmployee(Employee employee) {
    // tutaj dodanie employee do bazy poprzez wykorzystanie wstrzykniętego wcześniej EntityManagera
  }
}

Rozumiem że ta metoda jest przeciążona ?

public void addEmployee(Employee employee) {

// tutaj dodanie employee do bazy poprzez wykorzystanie wstrzykniętego wcześniej EntityManagera

}

baant
  • Rejestracja:ponad 11 lat
  • Ostatnio:2 miesiące
  • Lokalizacja:Wrocław
  • Postów:524
0

Niby czemu przeciążona

catom
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 2 lata
  • Postów:58
0

no dobra ale czym się to różni ? i po co mi to jest w konstruktorze w ogóle jak mam pole ?

W konstruktorze jest Ci to po to, żeby zależność przypisać podczas tworzenia obiektu. Samo Dependency Injection przyda Ci się np. w sytuacji, gdy potrzebujesz zmienić implementację swojej zależności.
Co do samych zalet (i wad) DI - znajdziesz je choćby w artykule do Wikipedii, który wcześniej podlinkowałem.

Oczywiście, że masz pole i obiekt przypisany do tego pola jest Twoją zależnością. Ale jakoś musisz to pole przypisać, żeby mieć referencję do instancji tej zależności. Gdybyś przypisywał to pole w konstruktorze, wówczas użycie Twojego obiektu z tym polem wymuszałoby na Tobie przekazanie od razu tej zależności i nie miałbyś problemu, że gdzieś w kodzie tworzysz sobie obiekt typu Twojej zależności, ale zapomniałeś go przypisać do tego pola.
Dokładnie to zrobiłeś w swoim kodzie z 1. postu.

Chodzi o takie wymuszenie:

Kopiuj
// Repozytorium, jak wcześniej
public class EmployeeRepository {

  private final EntityManager entityManager;

  public EmployeeRepository(EntityManager entityManager) {
    this.entityManager = entityManager;
  }

  public void addEmployee(Employee employee) {
    // tutaj dodanie employee do bazy poprzez wykorzystanie wstrzykniętego wcześniej EntityManagera
  }
}

// i przykład użycia
public class Main {
  public static void main(String... args) {
    final EntityManager entityManager = Main.createEntityManager();
    final EmployeeRepository employeeRepostiory = new EmployeeRepository(entityManager); // tu jest to wymuszenie - bez przekazania EntityManager 
    // do konstruktora nie możesz utworzyć obiektu EmployeeRepository
    // dzięki temu, nigdy nie utworzysz EmployeeRepository, które nie będzie miało przypisanego pola "entityManager"
    
    // i tu odrobinę zmodyfikowany Twój dotychczasowy kod
   
    // utworzenie obiektów Employee do zapisania
    final List<Employee> employees = createEmployees();
    // i dla każdego z utworzonych Employee wołamy employeeRepository.addEmployee()
    // 1. z życiem metody Collection#forEach i method reference
    employees.forEach(employeeRepository::addEmployee);
    // 2. klasycznie, z for-each
    for(Employee employee : employees) {
      employeeRepository.addEmployee(employee);
    }
  }
  
  private static EntityManager createEntityManager() {
    EntityManagerFactory entityManagerFactory =Persistence.createEntityManagerFactory("myDataBase") ;
    return entityManagerFactory.createEntityManager();
  }

  private static List<Employee> createEmployees() {
    return List.of(
      createEmployee("Maciek", "ss", 2000),
      createEmployee("Maciek", "ss", 2000),
      createEmployee("Maciek", "ss", 2000),
      createEmployee("Maciek", "ss", 2000),
      createEmployee("Maciek", "ss", 2000),
      createEmployee("Maciek", "ss", 2000),
      createEmployee("Maciek", "ss", 2000),
      createEmployee("Maciek", "ss", 2000),
      createEmployee("Maciek", "ss", 2000),
      createEmployee("Maciek", "ss", 2000),
      createEmployee("Maciek", "ss", 2000)
    );
  }
  
  private static Employee createEmployee(String firstName, String lastName, long salary) {
    Employee employee=new Employee();
    employee.setFirstName(firstName);
    employee.setLastName(lastName);
    employee.setSalary(salary);
    return employee;
  }
}

Powyższe rozwiązanie mogłoby być jeszcze ładniejsze stosując choćby Single Responsibility itd., ale nie o tym teraz rozmawiamy, więc starałem się zachować zgodność z Twoim dotychczasowym kodem.

Rozumiem że ta metoda jest przeciążona ?

Nic tu nie jest przeciążone. To jest po prostu przykład metody, która mogłaby zapisywać Employee.

edytowany 1x, ostatnio: catom
MrZiomenOmen
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 5 lat
  • Postów:28
0
catom napisał(a):

no dobra ale czym się to różni ? i po co mi to jest w konstruktorze w ogóle jak mam pole ?

W konstruktorze jest Ci to po to, żeby zależność przypisać podczas tworzenia obiektu. Samo Dependency Injection przyda Ci się np. w sytuacji, gdy potrzebujesz zmienić implementację swojej zależności.
Co do samych zalet (i wad) DI - znajdziesz je choćby w artykule do Wikipedii, który wcześniej podlinkowałem.

Oczywiście, że masz pole i obiekt przypisany do tego pola jest Twoją zależnością. Ale jakoś musisz to pole przypisać, żeby mieć referencję do instancji tej zależności. Gdybyś przypisywał to pole w konstruktorze, wówczas użycie Twojego obiektu z tym polem wymuszałoby na Tobie przekazanie od razu tej zależności i nie miałbyś problemu, że gdzieś w kodzie tworzysz sobie obiekt typu Twojej zależności, ale zapomniałeś go przypisać do tego pola.
Dokładnie to zrobiłeś w swoim kodzie z 1. postu.

Chodzi o takie wymuszenie:

Kopiuj
// Repozytorium, jak wcześniej
public class EmployeeRepository {

  private final EntityManager entityManager;

  public EmployeeRepository(EntityManager entityManager) {
    this.entityManager = entityManager;
  }

  public void addEmployee(Employee employee) {
    // tutaj dodanie employee do bazy poprzez wykorzystanie wstrzykniętego wcześniej EntityManagera
  }
}

// i przykład użycia
public class Main {
  public static void main(String... args) {
    final EntityManager entityManager = Main.createEntityManager();
    final EmployeeRepository employeeRepostiory = new EmployeeRepository(entityManager); // tu jest to wymuszenie - bez przekazania EntityManager 
    // do konstruktora nie możesz utworzyć obiektu EmployeeRepository
    // dzięki temu, nigdy nie utworzysz EmployeeRepository, które nie będzie miało przypisanego pola "entityManager"
    
    // i tu odrobinę zmodyfikowany Twój dotychczasowy kod
   
    // utworzenie obiektów Employee do zapisania
    final List<Employee> employees = createEmployees();
    // i dla każdego z utworzonych Employee wołamy employeeRepository.addEmployee()
    // 1. z życiem metody Collection#forEach i method reference
    employees.forEach(employeeRepository::addEmployee);
    // 2. klasycznie, z for-each
    for(Employee employee : employees) {
      employeeRepository.addEmployee(employee);
    }
  }
  
  private static EntityManager createEntityManager() {
    EntityManagerFactory entityManagerFactory =Persistence.createEntityManagerFactory("myDataBase") ;
    return entityManagerFactory.createEntityManager();
  }

  private static List<Employee> createEmployees() {
    return List.of(
      createEmployee("Maciek", "ss", 2000),
      createEmployee("Maciek", "ss", 2000),
      createEmployee("Maciek", "ss", 2000),
      createEmployee("Maciek", "ss", 2000),
      createEmployee("Maciek", "ss", 2000),
      createEmployee("Maciek", "ss", 2000),
      createEmployee("Maciek", "ss", 2000),
      createEmployee("Maciek", "ss", 2000),
      createEmployee("Maciek", "ss", 2000),
      createEmployee("Maciek", "ss", 2000),
      createEmployee("Maciek", "ss", 2000)
    );
  }
  
  private static Employee createEmployee(String firstName, String lastName, long salary) {
    Employee employee=new Employee();
    employee.setFirstName(firstName);
    employee.setLastName(lastName);
    employee.setSalary(salary);
    return employee;
  }
}

Powyższe rozwiązanie mogłoby być jeszcze ładniejsze stosując choćby Single Responsibility itd., ale nie o tym teraz rozmawiamy, więc starałem się zachować zgodność z Twoim dotychczasowym kodem.

Rozumiem że ta metoda jest przeciążona ?

Nic tu nie jest przeciążone. To jest po prostu przykład metody, która mogłaby zapisywać Employee.

Nie zwraca mi listy

The method of(Employee, Employee, Employee, Employee, Employee, Employee, Employee, Employee, Employee, Employee, Employee) is
undefined for the type List

podkreslone List.of

catom
Której wersji Javy używasz? Kod pisałem akurat tylko w edytorze tekstowym na forum. Jeśli używasz wersji starszej niż JDK 9, to zrób po prostu Arrays.asList(), jak z resztą napisali koledzy w poniższych postach.
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Może chciałeś jednak Arrays.asList(cośtam, cośtam, cośtam...)?


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
baant
  • Rejestracja:ponad 11 lat
  • Ostatnio:2 miesiące
  • Lokalizacja:Wrocław
  • Postów:524
0

List.of(...) jest od jdk 9

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.