Попытка использовать введенную пользователем строку из одного класса в другой класс в Java

#java

Вопрос:

Я пытаюсь создать эту систему начисления заработной платы, в которой есть класс входа в систему и класс калькулятора заработной платы. Я пытаюсь использовать строку имени пользователя, введенную пользователем в классе входа в класс калькулятора заработной платы, для определения базовой заработной платы, но строка имени пользователя в классе калькулятора заработной платы считается нулевой, поэтому я получаю много ошибок. Я довольно новичок в программировании на Java, поэтому был бы очень признателен вам за помощь. Вот мой код.

   public class loginpage {
   Scanner x;   // declares scanner
 static String name;
  static String username; 
       public void username(){
       String filepath = "/home/ogweno/NetBeansProjects/Payroll System/src/payroll/system/employees.txt"; // Declaring the filepath
      // Declaring a string for the username
       String password;  // Declaring a string for the password
       String username;
     
      username = JOptionPane.showInputDialog("Please enter your username: ", "username");
     
       
     
      password=JOptionPane.showInputDialog("Please enter your Password: ");
       VerifyLoginA(username, password, filepath);
       }
       
public void VerifyLoginA(String username, String password, String filepath) {
       boolean flag = false;     // boolean variable set to false for later use
       String tempUsername = "";  // variable used for extracting the username from txt file and storing in this
       String tempPassword = "";  // variable used for extracting the password from txt file and storing in this
       try {
             x = new Scanner(new File(filepath)); //opens the file "/home/ogweno/Students.txt"
             x.useDelimiter("[,n]");    // use of delimiter to specify the seperation of username amp; password by ","
            
             boolean passed = false;     // boolean variable set to false and later use
           while (x.hasNext()amp;amp; !flag){  // use of while to check if the file has any contents 
               
               tempUsername = x.next(); // extracts the username and stores it 
               tempPassword = x.next();// extracts the password and stores it 
               if (tempUsername.trim().equals(username.trim()) amp;amp; tempPassword.trim().equals(password.trim())) {
                   passed = true; // use of trim to remove any unwanted space in user input or in txt file
                   break; // boolean passedA becomes true if the username and passwords entered by user match the ones in file
               }
           }
           if(passed) { // if passedA is true then prints Welcome   the username
               // System.out.println("Welcome "   username);
               //System.out.println(""); // space
               JOptionPane.showMessageDialog(null,"Welcome "   username);
                 boolean check = true;
                 
                 setName(username);
               
           }
          
           else { // if passedA is false then prints a error message
              // System.out.println("********WARNING**Incorrect Username or Password*********");
                 JOptionPane.showMessageDialog(null,"********WARNING**Incorrect Username or Password*********");
                 boolean check = false;
               System.exit(0); // Terminates program if username and/or password is incorrect
           }
          
           
           
       }
       catch (FileNotFoundException e){ // prints error if there is an error in opening the file
           System.out.println("Error");
       }
     
   }

   public static void setName(String usernamename) {
       name=username;
      //To change body of generated methods, choose Tools | Templates.
   }
   public static String getName(){
       return name;
   }
}

 

Вот класс калькулятора заработной платы

 public class Salary_calculator extends loginpage {
    public void calculator(){
        int HS=10000;
        int TV=5000;
        int NSSF=2000;
        int NHIF=500;

loginpage login=new loginpage();

int grossPay=0;
String post="";
float netSalary;
if (name=="Jane"){
    grossPay=20000;
    post="Finance Officer";
}
else if (name=="Michael"){
    grossPay=30000;
    post="IT technician";
}
else if (name=="Josphine"){
    grossPay=40000;
    post="Marketing Officer";
}
else if (name=="Darshan"){
    grossPay=50000;
    post="Public Relations Officer";
}
else if (name=="Ketan"){
    grossPay=60000;
    post="Operations Manager";
}
 

int salary=grossPay   HS   TV -(NSSF NHIF);
netSalary=(float) (0.7*salary);

JOptionPane.showMessageDialog(null, name   ": "   post   "n"   "Your net salary is: "   netSalary   "n");
    }
}
 

Комментарии:

1. Локальная переменная String username; затеняет переменную класса

2. имя==»Фосфин» -> нет. при этом сравниваются ссылки, а не значения. не знаю, ваша ли это проблема, так как я не проверял все это, но, пожалуйста, используйте метод equals для сравнения значений объектов вместо ==

3. hence I'm getting a lot of errors — Покажите нам хотя бы одного из них !!

4. System.out.println("Error"); — чрезвычайно полезно НЕ

5. Как использовать метод equals для сравнения строковых значений? Я пробовал, но получаю сообщение об ошибке «Строка не может быть преобразована в логическое значение».

Ответ №1:

Пример доступа к данным в другом классе.

Минимальный пример класса с одной статической и одной нестатической переменной.

 public class Payroll{
    public static String name1 = "static name1, same for all instances!";
    public String name2 = "name2, each instance has its own!";
}
 

Доступ к статическим name1 данным в платежной ведомости из других классов:

 String name = Payroll.name1;
 

Доступ к нестатическим name2 данным в платежной ведомости из других классов:

 Payroll payroll = new Payroll();
// Later, after the new instance has its data
String name = payroll.name2;
 

Помните, что для доступа к нестатическим переменным требуется, чтобы у вас был доступ к экземпляру. Каждый раз, когда вы создаете новый экземпляр, у new него изначально нет данных или только стандартные данные для вас!

Изменить: Пример, демонстрирующий взаимодействие двух классов:

 import java.util.*;
import javax.swing.*;

public class Payroll {
    static final List<Employee> employees = new ArrayList<>();

    public static void main(String[] args) {
        var payroll = new Payroll();

        var employee = payroll.login();
        JOptionPane.showMessageDialog(null, employee == null ? "Invalid Login!" : employee.getSalaryMessage());
    }

    public Payroll(){
        loadEmployees();
    }

    public Employee login(){
        String username = JOptionPane.showInputDialog("Please enter your Username:");
        String password = JOptionPane.showInputDialog("Please enter your Password:");
        for(var employee : employees) if(employee.isEmployee(username, password)) return employee;
        return null;
    }

    private void loadEmployees(){
        employees.add(new Employee("Jane", "jan", "xxx", 20000, "Finance Officer"));
        employees.add(new Employee("Michael", "mic", "yyy", 30000, "IT technician"));
        employees.add(new Employee("Josphine", "jos", "zzz", 40000, "Marketing Officer"));
        employees.add(new Employee("Darshan", "dar", "qqq", 50000, "Public Relations Officer"));
        employees.add(new Employee("Ketan", "ket", "ppp", 60000, "Operations Manager"));
    }
}
 

Для полноты картины класс сотрудников:

 public class Employee {
    private String name;
    private String username;
    private String password;
    private double grossPay;
    private String post;

    public Employee(String name, String username, String password, double grossPay, String post){
        this.name = name;
        setUsername(username);
        setPassword(password);
        setGrossPay(grossPay);
        setPost(post);
    }

    public String getSalaryMessage(){
        return name   " ("   post   ") earns "   grossPay;
    }

    public boolean isEmployee(String username, String password){
        return this.username.equals(username) amp;amp; this.password.equals(password);
    }

    public String getName(){ return name; }

    public void setName(String name){ this.name = name; }

    public String getUsername(){ return username; }

    public void setUsername(String username){ this.username = username; }

    public String getPassword(){ return password; }

    public void setPassword(String password){ this.password = password; }

    public double getGrossPay(){ return grossPay; }

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

    public String getPost(){ return post; }

    public void setPost(String post){ this.post = post; }
}
 

Комментарии:

1. Первый метод со статической переменной выполняется, но в нем есть логическая ошибка, второй класс(или первый) инициализирует мою статическую переменную в значение null/»», что дает мне неправильный ответ. Не могли бы вы показать мне, как сохранить значение, введенное пользователем, в качестве общедоступной переменной, чтобы его мог использовать другой класс.

2. В случае успеха ваша функция VerifyLoginA вызывает функцию setName . Имя параметра в функции содержит опечатку! usernamename должно быть username . Это не устанавливает значение name , но содержимое статической переменной username , которая также является нулевой, копируется в name !