#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
!