• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Java prosty program Domofon (Obiekty - użytkownicy)

0 głosów
1,072 wizyt
pytanie zadane 22 marca 2017 w Java przez Michu80 Nowicjusz (140 p.)

Witam,

wzorując się na domofonie w moim bloku starałem się stworzyć coś podobnego w Javie.

Każdemu obiektowi (User) przypisuję numer oraz kod.

Domofon pobiera nr użytkownika (UserId) a nastęnie nr PIN (UserPin) i albo otwiera drzwi (void Open ()) albo wyświetla błąd (void Error()).

Generalnie wszystko działa ale... tylko na jednym Obiekcie, gdy tworzę kolejny, program jakby zapomina o poprzednim i w rezultacie działa tylko ostatni, stworzony User.

Proszę o jakieś sugestie.

import java.util.Scanner;

public class User {
private  int UserId;
private  double UserPin;


public int getUserId () {
	return UserId;	
}
public void setUserId (int Id){
	UserId = Id;	
}
public double getUserPin (){
	return UserPin;
}
public void setUserPin (double Pin){
	UserPin = Pin;	
}

public  void Open () {
	System.out.println("Drzwi otwarte, zapraszamy !");
	CheckId();
}
public  void Error(){
	System.out.println("Błąd, spróbuj jeszcze raz.");
	CheckId();
}
public void CheckId(){
	System.out.println("Numer mieszkania:");
	Scanner odczyt=new Scanner(System.in);
	int dane = odczyt.nextInt();
	if (dane == UserId) {
		CheckPin();}
		else 
			Error();
	odczyt.close();
	
	}
public  void CheckPin(){
	System.out.println("Wprowadz kod:");
	Scanner odczyt=new Scanner(System.in);
	int dane = odczyt.nextInt();
	if (dane == UserPin) {
		Open();}
		else 
			Error();
	odczyt.close();
	}
}

 


public class UserTest {

	public static void main(String[] args) {
		
	User people = new User();
	User people2 = new User();
	
	people.setUserId(2);
	people.setUserPin(2);
	people2.setUserId(1);
	people2.setUserPin(1);
	
	people.CheckId();
	people2.CheckId();	
		
	}
}

 

3 odpowiedzi

0 głosów
odpowiedź 22 marca 2017 przez Aisekai Nałogowiec (42,190 p.)
Użyj list, do przechowywania Użytkowników. (ArrayList)
komentarz 22 marca 2017 przez Michu80 Nowicjusz (140 p.)

Dzięki za odpowiedź. Stworzyłem coś takiego:

public class UserTest {

	public static void main(String[] args) {
		
	User people[] = new User[2];
		people[1].setUserId(1);
		people[1].setUserPin(1);
		
		people[2].setUserId(2);
		people[2].setUserPin(2);
		
		people[1].CheckId();
		people[2].CheckId();
}
}

Eclipse nie pokazuje żadnych błędów ale po uruchomieniu:

Exception in thread "main" java.lang.NullPointerException
    at UserTest.main(UserTest.java:7)

W dobrym kierunku szukam rozwiązania ?

komentarz 22 marca 2017 przez littlerunaway Obywatel (1,790 p.)
Tworzysz tablicę o długości 2, czyli ma dwa miejsca. Miejsce 0 i miejsce 1. Ty próbujesz coś dodać na miejsce nr 2 które nie istnieje, dlatego masz błąd nullPointer. Poza tym tablica a ArrayList to dwie różne rzeczy.
komentarz 23 marca 2017 przez Michu80 Nowicjusz (140 p.)
Masz rację, mój błąd. Zapomniałem, że w tablicy pierwszy element ma pozycję 0.
0 głosów
odpowiedź 22 marca 2017 przez Mateusz51 Nałogowiec (28,180 p.)
W open masz jeszcze raz wywołanie metody CheckId. Przez to program Ci się loopuje.

A i taka rada w javie stanardowo metody zaczynamy z małej litery.
komentarz 23 marca 2017 przez Michu80 Nowicjusz (140 p.)

Jeżeli chodzi o zapętlenie programu - zrobiłem to celowo ponieważ domofon działa "w kółko"smiley, po otwarciu drzwi(wyświetlenie tekstu w tym przypadku), ponownie przechodzi w stan gotowości.

komentarz 23 marca 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Tak. Ale caly czas wywolujesz metode dla jednej klasy. Wiec nigdy nie wejdzies w drugi obiekt User i dlatego masz wrazenie ze masz tylko jednego urzytkownika
komentarz 23 marca 2017 przez Michu80 Nowicjusz (140 p.)
Wykasowałem te CheckId z Open. Program kończy teraz działanie po prawidłowym wpisaniu UserId oraz UserPin.Czyli nie zapętla się. Ale niestety efekt nadal jest taki sam, pamięta tylko ostatniego Usera.... Może coś namieszałem w metodach? Normalnie ręce "opadywują"... taka pierdoła i tyle czasu nad tym siedzieć..
komentarz 23 marca 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Jak patrze na twoje kody to masz problemy z tworzeniem nowych użytkowników. Jak byś wysłał aktualny kod (może być priv) to opisał bym Ci dokładniej problem.
komentarz 23 marca 2017 przez Michu80 Nowicjusz (140 p.)
import java.util.Scanner;

public class User {
private  int UserId;
private  double UserPin;


public int getUserId () {
	return UserId;	
}
public void setUserId (int Id){
	UserId = Id;	
}
public double getUserPin (){
	return UserPin;
}
public void setUserPin (double Pin){
	UserPin = Pin;	
}

public  void Open () {
	System.out.println("Drzwi otwarte, zapraszamy !");
	//CheckId();
}
public  void Error(){
	System.out.println("Błąd, spróbuj jeszcze raz.");
	CheckId();
}
public void CheckId(){
	System.out.println("Numer mieszkania:");
	Scanner odczyt=new Scanner(System.in);
	int dane = odczyt.nextInt();
	if (dane == UserId) {
		CheckPin();}
		else 
			Error();
	odczyt.close();
	
	}
public  void CheckPin(){
	System.out.println("Wprowadz kod:");
	Scanner odczyt=new Scanner(System.in);
	int dane = odczyt.nextInt();
	if (dane == UserPin) {
		Open();}
		else 
			Error();
	odczyt.close();
	}
}

 

import java.awt.List;
import java.util.ArrayList;

public class UserTest {

	public static void main(String[] args) {
	
	User people = new User();
	
	ArrayList <User> listUsers = new ArrayList<>();
	listUsers.add(people);
	people.setUserId(12);
	people.setUserPin(12);
	
	listUsers.add(people);
	people.setUserId(13);
	people.setUserPin(13);	
	
	
	
	people.CheckId();
}
}

 

komentarz 23 marca 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Zauwaz ze tworzysz tylko jednego User.  Oraz nie odwolujesz sie do niego przez liste tylko bezposrednio przez referencje. Dlatego maz wrazenie ze dziala tylko jeden.
komentarz 23 marca 2017 przez Michu80 Nowicjusz (140 p.)
Stworzyłem więc kolejnego usera, rzeczywiście był jeden.

Na tym odwołaniu do User przez listę poległem. Znam polecenie listUsers.get ale brak mi wiedzy jak to połączyć i odwołać się przez listę do innej klasy, w tym przypadku User..

Mogę Cię prosić o kolejną wskazówkę ?
komentarz 23 marca 2017 przez Mateusz51 Nałogowiec (28,180 p.)
// odwolanie przez pobramie
for (int i = 0; i < list.length ();i++){
liste.get (i).CheckId ();
}
// petla for each
for(User user: list) {
user.CheckId ();
}
// z lambda
list.forEach ((user)->user.CheckId ());

Tu masz paer propozycji jak odwolywac sie do listy

komentarz 27 marca 2017 przez Michu80 Nowicjusz (140 p.)
Bardzo dziękuję za podpowiedzi. Rozjaśniłeś mi kilka rzeczy. A z kodem jeszcze będę walczył.
0 głosów
odpowiedź 22 marca 2017 przez Jonki Dyskutant (8,180 p.)

Po pierwsze listę możesz stworzyć w taki sposób.

List<User> listUsers = new ArrayList<>();
listUsers.add(user1);
listUsers.add(user2);

a potem pobierać metodą get().

Natomiast jeśli chodzi o Twoją tablicę w komentarzu do odpowiedzi, to ma ona dwa elementy, a odnosisz się do trzeciego.

A co do bloku

if (dane == UserId) {
        CheckPin();}
        else
            Error();

to te nawiasy klamerkowe są niepotrzebne. Namieszałeś je trochę.

 

No i jak napisał  Mateusz51, zapętliłeś się. Z CheckId() wchodzisz do CheckPin(), jeśli wszystko ok wchodzi do Open(), a tam po wypisaniu tekstu znowu do CheckId().

komentarz 23 marca 2017 przez Michu80 Nowicjusz (140 p.)

Próbowałem już tworzyć kolejne zwykłe obiekty, korzystałem z tablic więc wypróbowałem także ArrayList:

import java.awt.List;
import java.util.ArrayList;

public class UserTest {

	public static void main(String[] args) {
	
	User people = new User();
	
	ArrayList <User> listUsers = new ArrayList<>();
	listUsers.add(people);
	people.setUserId(12);
	people.setUserPin(12);
	
	listUsers.add(people);
	people.setUserId(13);
	people.setUserPin(13);	
	
	people.CheckId();
}
}

Efekt mam podobny jak wcześniej czyli program pamięta jedynie ustawienia ostatniego wprowadzonego użytkownika. Co ciekawe, jak wydrukuję zawartość listUsers - pokazuje mi dwóch Userów - czyli ok.

 

Podobne pytania

0 głosów
1 odpowiedź 1,212 wizyt
0 głosów
2 odpowiedzi 1,209 wizyt
pytanie zadane 28 marca 2020 w JavaScript przez michhal1 Początkujący (270 p.)
0 głosów
2 odpowiedzi 526 wizyt

93,424 zapytań

142,421 odpowiedzi

322,646 komentarzy

62,785 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...