• 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)

Object Storage Arubacloud
0 głosów
667 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,097 wizyt
0 głosów
2 odpowiedzi 867 wizyt
pytanie zadane 28 marca 2020 w JavaScript przez michhal1 Początkujący (270 p.)
0 głosów
2 odpowiedzi 276 wizyt

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...