Diskuze: Error exception in thread
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
pocitac770:28.4.2016 21:30
Nevím, jak vypadá tvoje třída "Employee", ale obecně...
Vytvořil jsi si pole, které má "škatulky" pro zaměstnance, ale nedosadil
jsi je tam, jako např.
zamestnanci[0] = new Emploee();
V druhém for cyklu chceš volat metody na neexistujících zaměstnancích, hádám, že ti to hází NullPointerException..
+20 Zkušeností
+2,50 Kč
Zkus to nejak takto:
for(int l = 0; l < amount; l++)
{
Employee employee = new Employee();
employee.setEmployeeName(names[l]);
employee.setEmployeeAdress(adresses[l]);
employee.setEmployeeHireDate(month[l], day[l], year[l]);
employee.setEmployeeNumber(l + 1);
zamestnanci[l] = employee;
}
Pisi to z patra tak snad tam neni zadna syntakticka chyba.
V podstate jde o to co psal pocitac770, ty tomu poli rikas, ze do nej budes
strkat zamestnance. Ale driv nez ho tam strcis tak ho musis
vytvorit.
Neboli co delas, rikas zamestnanec bude mit totot jmeno, adresu.... Nerikas,
ktery konkretni zamestnanec, jeste neexistuje bo jsi nezavolal new Employee(),
cimz ho vytvoris.
Osobne bych ti spise doporucil se vice venovat kolekcim napr. http://www.itnetwork.cz/…ani-polozek/
Z 90% je vyuzijes casteji.
Souhlasím s Petrem Kunčarem. Ale celkově si myslím, že jdeš na to blbě. Proč zbytečně používáš tolik polí? Zaměstnanec je jeden objekt, tak mu definuj třeba proměnné: jméno adresa, datum narození (mimochodem v Javě je krásná třída Date, i když mě osobně dělala chyby v přepočtu dní:), ale datum můžeš třeba i ukládat jako stringový řetězec, a pomocí nějakého separátoru ho splitit na Integery, když budeš potřebovat. No a potom pomocí přístupových metod (přístupové metody jsou gettry a settry) si nastavíš jednotlivého zaměstnance.
Ukládat si každý údaj zaměstnace do nového pole je pitomost. až k tomu budeš přidávat třeba platy, výpočet důchodu, dovolenky, absence, docházku, prohřešky a prostě já nevím co ještě... tak na vše budeš tvořit nové pole a pořád to necháš projet všemy zaměstnanci?:) Pročti si nějaký matroš o OOP.
Navíc souhlasím, že v případě objektů je lepší kolekce než pole objektů.
Jen tak for fun, takhle by to mohlo vypadat objektově s tím ale, že si můžeš i pohrát, jestli to dáš do více tříd, jestli nebudeš přetěžovat konstruktor, ale uděláš víc přístupových metod nebo naopak, přetížíš víc konstruktor, atd. atd.
import java.util.ArrayList;
import java.util.Date;
public class Company {
//###################-ATRIBUTY-###################
//==========KONSTANTNI ATRIBUTY TRIDY==========
//===========PROMENNE ATRIBUTY TRIDY===========
//========KONSTANTNI ATRIBUTY INSTANCI=========
private final ArrayList<Employ> employees = new ArrayList(); //tohle je kolekce
//=========PROMENNE ATRIBUTY INSTANCI==========
//####################-STATIC-####################
//============STATICKY KONSTRUKTOR=============
//=========STATICKE PRISTUPOVE METODY==========
//==============STATICKE METODY================
//=================MAIN METODA=================
public static void main(String[] args) {
Company company = new Company();
company.getProfessions();
}
//###################-INSTANCE-###################
//=================KONSTRUKTOR=================
public Company() {
employees.add(new Employ("Bedřich Smetana", "skladatel", "2.3.1824")); // potom jako separátor u data použiješ "."
employees.add(new Employ("Josef Kajetán Tyl", "spisovatel", "4.2.1808"));
employees.add(new Employ("Karel Čapek", "spisovatel", "9.1.1890"));
employees.add(new Employ("Emanuel Moravec", "šulín", "17.4.1893"));
employees.add(new Employ("Edvard Beneš", "prezident čsr", "28.5.1884"));
employees.add(new Employ("Jára Cimrman", "génius", "4.7.1869"));
employees.add(new Employ("Karel IV", "nejlepší panovník českých zemí", "14.5.1316"));
}
//=============PRISTUPOVE METODY===============
public void getProfessions() {
for (Employ employee : employees) { // tomuto cyklu se říká for-each, je to zjednodušená forma cyklu, který probírá prvky po jednom v něajkém poli nebo kolekci
System.out.println(employee.getProfession());
}
}
//===================METODY====================
//###############-SOUKROME METODY-################
//=====STATICKE SOUKROME A POMOCNE METODY======
//==========SOUKROME A POMOCNE METODY==========
//############-SOUKROME KONSTRUKTORY-#############
//===============SOUKROME TRIDY================
private class Employ {
private final String name, profession, birthday_day;
private final Date today = new Date();
private Date age_of_employy;
private int age;
private String acceptance_date;
public Employ(String jmeno, String zamestnani, String datum_narozeni) {
name = jmeno;
profession = zamestnani;
birthday_day = datum_narozeni;
}
public String getProfession() {
return profession;
}
public String getName() {
return name;
}
public String getBirthday() {
return birthday_day;
}
//buď si necháš atributy třídy zaměstnanců naplnit v konstruktoru, nebo pomocí settrů, to je na tobě
public String getAcceptanceDate() {
return acceptance_date;
}
public void setAcceptanceDate(String datum_nastupu) {
acceptance_date = datum_nastupu;
}
}
//==============TESTOVACI METODY===============
}
PS: to datum Cimrmana sem typnul, nemůžu ho najít:D Jestli chceš, můžeš si přidat metodu getAge(), která vrátí věk jednotlivého uživatele, ale musíš si ji nejdřív vypočítat (pomůže ti zmíněná třída Date() a třeba pomocne pole Stringů, do kterého rozplitíš datum pomocí metody split(); a pak to přetypuješ na Integery a pracuješ s tím. Takhle bys měl postupovat. Uvažovat, že všechno může být objekt.
Děkuju moc všem, na základě rad se mi to podařilo vyřešit:
int amount = Input.getInt("Type number of Employees, which you want to insert information about, here.");
Employee [] zamestnanci = new Employee[amount];
String [] names = new String[amount];
String [] adresses = new String[amount];
int [] day = new int [amount];
int [] month = new int [amount];
int [] year = new int [amount];
for(int j = 0; j < amount; j++)
{
names[j] = Input.getString("Type employees full name (all parts of name should be separated with blank space) here.");
adresses[j] = Input.getString("Type employees adress (first street, followed by city, then state(2 letters), then zip code, all separated with blank space, if some of them have more words in their name, separate them with _).");
day[j] = Input.getInt("Enter day of hire date of an employee (2 digits)");
month[j] = Input.getInt("Enter month of hire date of an employee (2 digits)");
year[j] = Input.getInt("Enter year of hire date of an employee (4 digits)");
zamestnanci[j] = new Employee(names[j], adresses[j], month[j], day[j], year[j]);
zamestnanci[j].setEmployeeNumber(j + 1);
}
s tím, že jsem pozměnil část třídy Employee:
public class Employee
{
private Name jmeno = new Name();
private Adress adresa = new Adress();
private Date hireDate = new Date();
private int employeeNumber = 0;
public Employee()
{
jmeno = null;
adresa = null;
hireDate = null;
}
public Employee(String name, String adress, int mmm, int ddd, int yyy)
{
jmeno.setName(name);
adresa.setAdress(adress);
hireDate.setDate(mmm, ddd, yyy);
}
Ještě jednou díky moc .
....
proč nastavuješ null hodnoty, které je v sobě mají? ten bezparametrický
konstruktor je ti stejně celý na nic, tak ho klidně smaž. A popravdě, až
včil jsem si všiml.... ty máš třídy Name, Adress a Date??? na co?
uchováváš v nich jednu proměnnou, kterou můžeš mít i ve třídě
Employee? Ta třída Employee je hnus od shora až do konce:( promiň, ale sice
to jde takhle napsat (doslova a do písmene, aby to nějak fungovalo), ale kód
rozhodně není čistý:( Jestli chceš, ať programuješ čistě, aby ses
programováním živil nebo, abys mohl dělat těžší projekty a nenastávaly
ti nehorázné chyby, tak si pročti materiály na tomto webu (především o
OOP) nebo (jak doporučuji už skoro v každém vlákně), sežeň si knížku
Rudolfa Pecinovského - Myslíme objektově v jazyku Java. Je to tlustá
knížka a doopravdy se tam zabírá každou prkotinou. Nenaučí tě jazky
Javu, ale programovat. V Javě ti to jen ukáže (takže budeš znát správné
syntaxe, ale podstatné je to přemýšlení)
Nechci, abys to bral, že se ti posmívám nebo tě shazuju, ani nápad. Jen tě chci motivovat, aby ses podíval na programování z jiného pohledu, ten tvůj nynější tě brzy přivede do šílených problémů. Je to konec konců tvoje věc a nikdo nemá právo tě nutit, ale zvaž to. Tento web je taky skvělý (i když já kvetu, jak už v tutorálech porušují zapouzdření:D)
Václav Fleissig:29.4.2016 22:15
Díky moc, tohle bylo přímo zadání úkolu abych nechal třídu Employee přebírat metody ze tříd Adress, Name a Date. Ty null hodnoty jsem nastavoval, protože jsem z tutoriálu špatně pochopil, že když se v javě definuje jedna možnost vytvoření objektu s argumenty, tak potom, při vytvoření objektu bez argumentů, už automaticky program nepřidělí proměnným hodnotu 0 nebo null. Zkusím to ještě omrknout, díky moc za radu .
tohle bylo přímo zadání úkolu
prosím tě, který blb ti to zadal? umí vůbec programovat? jestli ti na tomto chtěl předvést OOP, tak horší příklad nemohl ani vymyslet...
Václav Fleissig:29.4.2016 23:39
Dostal jsem to jako zadání v online kurzech, měl jsem si procvičit jak v objektech volat jiné třídy a vytvářet array mnou nadefinovaného objektu.
pocitac770:30.4.2016 0:00
Když se na to tak koukám, tak bych ti spíš doporučil zdejší kurzy, jde z nich zjistit mnoho, je to dobře vysvětleno, že i můj kámoš to víceméně pochopí (Doufám, že to nečte ), a zároveň tě to neučí nějak takto... divně, ale jsou používány reálné příklady, ze kterých i někdy vytahuju kusy kódu a dále je používám...
Lubor Pešek:30.4.2016 0:19
Tak z toho kurzu rychle utíkej, případně to tu někde vyvěs, ať tam ani nikdo nechodí. Jediné, co tě tam můžou očividně naučit, je výpis, pojem třída a tím končí... Toto předvést jakémukoliv programátorovi, tak si nejdřív otevři okno, ať tě to tak nebolí, až tě jim prohodí. Tento úkol nemá s programátorskými oběkty vůbec nic společného, jen tě kazí špatnými zlozvyky.
Zobrazeno 12 zpráv z 12.