Bład przy tworzeniu pracownika

0

Pracownicy I

Stworzyć klasę Employee (pracownik), opisującą wspólne atrrybuty danych o pracownikach:

  • imię,
  • nazwisko,
  • wiek,
  • pensja.

oraz zawierającą odpowiednie metody, które pozwolą uzyskać informacje o danym pracowniku oraz ustalić pensję i zmienić pensję o podany procent.

Użyć tej klasy w innej klasie, w której dostarczymy:

  1. metody definiowania danych o pracownikach:
    Employee defEmp(String msg),
    która w dialogu wejściowym

    pyta użytkownika o dane pracownika (argument msg jest komunikatem np. "Podaj dane o pracowniku"),
    tworzy obiekt, reprezentujący wprowadzone dane o pracowniku,
    i zwraca referencję do niego.

  2. metody showInfo(Employee), która wyświetla w dialogu komunikatów dane o podanym jako argument pracowniku

  3. metody changeSalary(Employee), która pyta o procent o jaki chcemy zmienić pensję podanego jako argument pracownika i zmienia tę pensję.

Przetestować te metody na przykładzie wprowadzenia danych dla 3 pracowników, pokazania tych danych, zmiany pensji i pokazania zmienionych danych.

Do wprowadzabnia danych użyć dialogu i skanera.

Mam dwie klasy.
Klasa pierwsza:

public class Employee {
  private String firstName;
  private String lastName;
  private int age;
  private double salary;
  
  // Konstruktor - tworzy nowego pracownika

  public Employee(String fname, String lname, int age, double salary) {
    this.firstName = fname;
    this.lastName = lname;
    this.age = age;
    this.salary = salary;
  }

  
  // Dostęp do prywatnych pól klasy

  public double getSalary() {
    return salary;
  }

  
  public void setSalary(double salary) {
    this.salary = salary;
  }

  
  public String getFirstName() {
    return firstName;
  }

  
  public String getLastName() {
    return lastName;
  }

  
  public int getAge() {
    return age;
  }

  // Metoda zmiany pensji o podany procent  

  public void chgSalary(double percent) {
    salary *= (1 + percent/100);
  }
  
  // Opis obiektu

  public String toString() {
    return firstName + " " +  lastName + " " + age + " " + salary; 
  }

}

Klasa druga:

import java.util.*;

import static javax.swing.JOptionPane.*;


public class EmpManager {
  
  // Metoda definiowania pracownika
  // parametr msg oznacza komunikat wyświetlany w dialogu wejściowym
  // metoda zwraca referencję do nowoutworzonego obiektu-pracownika
  // lub null jesli zrezygnowano z wprowadzania danych
  
  public static Employee defEmp(String msg) {
    String in = showInputDialog(msg);
    if (in == null) return null;      // zrezygnowano z wprowadzania
    Scanner scan = new Scanner(in);
    return new Employee( 
          scan.next(), scan.next(), scan.nextInt(), scan.nextDouble()
    );
  }

  // Zapytanie o zmianę pensji
  // i dokonanie jej
 
  public static void changeSalary(Employee emp) {
    String in = showInputDialog("Zmiana pensji dla " + emp.getLastName());
    if (in != null) emp.chgSalary(new Scanner(in).nextDouble()); 
  }

  // Wyświetla informacje o pracowniku
 
  public static void showInfo(Employee emp) {
    showMessageDialog(null, emp);
  }

  public static void main(String[] args) {
    Employee e = defEmp("Podaj dane pracownika");
    if (e == null) showMessageDialog(null, "Nie podano danych");
    else {
      showInfo(e);
      changeSalary(e);
      showInfo(e);
    }
  }

}

//////////////////////

W Eclipse wyświetla mi błąd gdy chce wprowadzić pracownika:

Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at zad22.EmpManager.defEmp(EmpManager.java:24)
at zad22.EmpManager.main(EmpManager.java:43)

0

Tworząc pracownika odczytujesz przy pomocy Scannera ze Stringa cztery wartości. Wyjątek krzyczy że String ich nie zawiera

0

Kurcze czyli co by wypadało z tym zrobić ?

0

W dialogu wpisać poprawne dane np: "Jan Kowalski 20 2000,0". Dodatkowo złapać wyjątek i wyświetlić komunikat o błędnych danych.

1 użytkowników online, w tym zalogowanych: 0, gości: 1