Diskuze: Error exception in thread

Java Java Error exception in thread

Avatar
Václav Fleissig:

Ahoj, učím se základy javy a potřeboval bych pomoct. Když spustím níže uvedený program, zobrazí se mi error, exception in thread na řádku 26 a už se skoro hodinu snažím to spravit různým přeformulováním programu. Program by měl ukládat jednotlivé informace o zaměstnancích a následně je zobrazovat.
Program:

public class EleventhProgram
{
        public static void main(String [] args)
        {
                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 (first and last name should be separated with _) here.");
                        adresses[j] = Input.getString("Type employees adress (first street, followed by city, then state(2 letters), then zip code, all separated 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)");

                }

                for(int l = 0; l < amount; l++)
                {
                        zamestnanci[l].setEmployeeName(names[l]);
                        zamestnanci[l].setEmployeeAdress(adresses[l]);
                        zamestnanci[l].setEmployeeHireDate(month[l], day[l], year[l]);
                        zamestnanci[l].setEmployeeNumber(l + 1);
                }


                for(int k = 0; k < amount; k++)
                {
                        display(zamestnanci[k]);
                }
        }

        public static void display(Employee zamestnanci)
        {
                System.out.println(zamestnanci.getEmployeeNumber());
                System.out.println(zamestnanci.getEmployeeName());
                System.out.println(zamestnanci.getEmployeeAdress());
                System.out.println(zamestnanci.getEmployeeHireDateString());
        }
}

Metoda volaná v classu:
private String fullName = new String();

public void setName(String n)
{
        fullName = n;
}

Prosím, nevěděl by někdo, co s tím?

 
Odpovědět 28. dubna 21:14
Avatar
pocitac770
Redaktor
Avatar
Odpovídá na Václav Fleissig
pocitac770:

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í NullPointerEx­ception..

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět  +1 28. dubna 21:30
Avatar
Petr Kunčar
Redaktor
Avatar
Petr Kunčar:

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.

Editováno 29. dubna 9:27
 
Nahoru Odpovědět  +1 29. dubna 9:26
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:

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ů.

Nahoru Odpovědět 29. dubna 11:39
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:

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.

Nahoru Odpovědět 29. dubna 12:45
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Václav Fleissig:

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 :).

 
Nahoru Odpovědět 29. dubna 16:07
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:

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

Editováno 29. dubna 16:48
Nahoru Odpovědět 29. dubna 16:46
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Odpovídá na Lubor Pešek
Václav Fleissig:

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 :).

Editováno 29. dubna 22:16
 
Nahoru Odpovědět 29. dubna 22:15
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:

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...

Nahoru Odpovědět 29. dubna 22:32
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Odpovídá na Lubor Pešek
Václav Fleissig:

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.

 
Nahoru Odpovědět 29. dubna 23:39
Avatar
pocitac770
Redaktor
Avatar
Odpovídá na Václav Fleissig
pocitac770:

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 :D ), 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...

Editováno 30. dubna 0:00
 
Nahoru Odpovědět  +1 30. dubna 0:00
Avatar
Lubor Pešek
Člen
Avatar
Odpovídá na Václav Fleissig
Lubor Pešek:

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.

Editováno 30. dubna 0:20
Nahoru Odpovědět 30. dubna 0:19
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 12 zpráv z 12.