为什么我的变量输出在 Java 中不正确?
Why is my variable output not correct in Java?
我需要创建一个程序来询问用户问题并获取输入并将其打印到文件中。如果薪水>200k 则需要再次询问薪水。除了 empSalary 之外,我能够让文件创建适用于所有内容。我不明白为什么这会以“?”的形式写入文件。我已经尝试寻找这个并确定这与范围有关,但我无法让它工作。有人能告诉我需要更改什么才能让 empSalary 正确打印到文件吗?
输出示例:
1,josh,fox,madison,mn,56256,test,?
2,joe,poe,fargo,nd,58102,poeppe,?
'''
import java.util.Scanner;
import java.io.File;
import java.io.IOException;
import java.io.FileWriter;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int i = 0;
int empSalary;
while (i < 2) {
System.out.print("Enter the employee number .....");
int empNum = scanner.nextInt();
System.out.print("Enter employee's first name ...");
String empFirstName = scanner.next();
System.out.print("Enter employee's last name ....");
String empLastName = scanner.next();
System.out.print("Enter employee's city .........");
String empCity = scanner.next();
System.out.print("Enter employee's State ........");
String empState = scanner.next();
System.out.print("Enter employee's zip code .....");
int empZip = scanner.nextInt();
System.out.print("Enter employee's job title ....");
String empJob = scanner.next();
while(true) {
System.out.print("Enter employee's salary .......");
empSalary = scanner.nextInt();
if (empSalary < 200000)
break;
else
System.out.println("Enter a salary less than 0,000!");
}
try {
FileWriter fw = new FileWriter("testfile.txt", true);
fw.write(empNum + ",");
fw.write(empFirstName + ",");
fw.write(empLastName + ",");
fw.write(empCity + ",");
fw.write(empState + ",");
fw.write(empZip + ",");
fw.write(empJob + ",");
fw.write(empSalary);
fw.write(System.lineSeparator());
fw.close();
} catch (IOException e) {
}
i++;
}
}
}
'''
您正在使用 write()
方法的不同重载,特别是 write(int)
,它实际上将您的数字以 二进制表示形式 写入文件。
在所有其他情况下,您调用 write(String)
,传递 int 和字符串的 concatenation(例如 empZip + ","
)。
所以基本上你首先创建一个包含你的数字的十进制表示和一个逗号的新字符串,然后将这个字符串写入文件。
因此,一个简单的解决方法是使用 String.valueOf(empSalary)
将您的数字转换为其字符串十进制表示形式,如下所示:
fw.write(String.valueOf(empSalary))
这将隐式调用 write(String)
重载,如前面的语句。
@Roberto 的 已正确诊断出问题。我只想指出一些其他事情:
有更好的方法生成输出。使用String.format
到assemble要写入的行。
String line = String.format("%d, %s, %s, %s, %d, %s, %d%n",
empNum, empFirstName, empLastName,
empCity, empState, empZip, empJob,
empSalary);
fw.write(line);
它更简洁(不那么冗长)也更高效1。 FileWriter
没有缓冲,因此每个 write
调用都可能执行系统调用。
而且它避免了你在 write(int)
中犯的错误。
你不应该默默地压扁 IOException
。至少打印一条错误信息。
您应该使用 try with resources 以确保 FileWriter
始终关闭。如果不这样做,则存在资源泄漏的风险,这可能会导致其他问题。
重复打开、附加和关闭同一个文件并不是最有效的输出方式1。
您的代码不会处理用户输入需要整数的 non-integer 值的情况。用户将看到堆栈跟踪。
如果字符串字段值(例如城市名称或职位)是两个或多个单词,您的代码将中断;例如“纽约”,或“副首席洗瓶工”。
美国邮政编码不是整数。它们可以嵌入连字符
输出格式无法处理字段(例如职位名称?)可能包含逗号的任何情况。
1 - 效率通常不是最重要的问题。但是,意识到这一点是一件好事。就像......我记得在我的第一份工作中有几次其他人出于无知而编写了一些非常低效的代码,结果证明它非常重要。
我需要创建一个程序来询问用户问题并获取输入并将其打印到文件中。如果薪水>200k 则需要再次询问薪水。除了 empSalary 之外,我能够让文件创建适用于所有内容。我不明白为什么这会以“?”的形式写入文件。我已经尝试寻找这个并确定这与范围有关,但我无法让它工作。有人能告诉我需要更改什么才能让 empSalary 正确打印到文件吗?
输出示例:
1,josh,fox,madison,mn,56256,test,?
2,joe,poe,fargo,nd,58102,poeppe,?
'''
import java.util.Scanner;
import java.io.File;
import java.io.IOException;
import java.io.FileWriter;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int i = 0;
int empSalary;
while (i < 2) {
System.out.print("Enter the employee number .....");
int empNum = scanner.nextInt();
System.out.print("Enter employee's first name ...");
String empFirstName = scanner.next();
System.out.print("Enter employee's last name ....");
String empLastName = scanner.next();
System.out.print("Enter employee's city .........");
String empCity = scanner.next();
System.out.print("Enter employee's State ........");
String empState = scanner.next();
System.out.print("Enter employee's zip code .....");
int empZip = scanner.nextInt();
System.out.print("Enter employee's job title ....");
String empJob = scanner.next();
while(true) {
System.out.print("Enter employee's salary .......");
empSalary = scanner.nextInt();
if (empSalary < 200000)
break;
else
System.out.println("Enter a salary less than 0,000!");
}
try {
FileWriter fw = new FileWriter("testfile.txt", true);
fw.write(empNum + ",");
fw.write(empFirstName + ",");
fw.write(empLastName + ",");
fw.write(empCity + ",");
fw.write(empState + ",");
fw.write(empZip + ",");
fw.write(empJob + ",");
fw.write(empSalary);
fw.write(System.lineSeparator());
fw.close();
} catch (IOException e) {
}
i++;
}
}
}
'''
您正在使用 write()
方法的不同重载,特别是 write(int)
,它实际上将您的数字以 二进制表示形式 写入文件。
在所有其他情况下,您调用 write(String)
,传递 int 和字符串的 concatenation(例如 empZip + ","
)。
所以基本上你首先创建一个包含你的数字的十进制表示和一个逗号的新字符串,然后将这个字符串写入文件。
因此,一个简单的解决方法是使用 String.valueOf(empSalary)
将您的数字转换为其字符串十进制表示形式,如下所示:
fw.write(String.valueOf(empSalary))
这将隐式调用 write(String)
重载,如前面的语句。
@Roberto 的
有更好的方法生成输出。使用
String.format
到assemble要写入的行。String line = String.format("%d, %s, %s, %s, %d, %s, %d%n", empNum, empFirstName, empLastName, empCity, empState, empZip, empJob, empSalary); fw.write(line);
它更简洁(不那么冗长)也更高效1。
FileWriter
没有缓冲,因此每个write
调用都可能执行系统调用。而且它避免了你在
write(int)
中犯的错误。你不应该默默地压扁
IOException
。至少打印一条错误信息。您应该使用 try with resources 以确保
FileWriter
始终关闭。如果不这样做,则存在资源泄漏的风险,这可能会导致其他问题。重复打开、附加和关闭同一个文件并不是最有效的输出方式1。
您的代码不会处理用户输入需要整数的 non-integer 值的情况。用户将看到堆栈跟踪。
如果字符串字段值(例如城市名称或职位)是两个或多个单词,您的代码将中断;例如“纽约”,或“副首席洗瓶工”。
美国邮政编码不是整数。它们可以嵌入连字符
输出格式无法处理字段(例如职位名称?)可能包含逗号的任何情况。
1 - 效率通常不是最重要的问题。但是,意识到这一点是一件好事。就像......我记得在我的第一份工作中有几次其他人出于无知而编写了一些非常低效的代码,结果证明它非常重要。