[英]unexpected output in code in passing array in java
我在java中傳遞數組時遇到了問題。 代碼是:
package input_output;
import static java.lang.System.out;
import java.util.Scanner;
public class InputOutput {
private static Scanner sc;
public static void main(String []args){
sc = new Scanner(System.in);
out.print("Enter the length of arrays :\t");
int n = sc.nextInt();
Employee[] emp = new Employee[n];
for(int i=0;i<n;i++){
out.print("\nEnter name and age of " + (i+1) + " employee :\t");
emp[i] = new Employee();
emp[i].setName(sc.nextLine());
sc.nextLine();
emp[i].setAge(sc.nextInt());
}
Operation operate = new Operation(emp,n);
operate.printOnScreen();
}
}
class Operation{
Employee []emp;
public Operation(Employee[] emp,int n){
this.emp=emp;
for(Employee e: this.emp)
e = new Employee();
}
public void printOnScreen() {
for(Employee e : emp){
e = new Employee();
out.println("Name:\t" + e.getName() + "\t\tAge:\t" + e.getAge() + "\n");
}
}
}
Employee類是一個簡單的bean,包含年齡和名稱的getter和setter方法。
輸出即將到來:
名稱:null
年齡:0
我的錯是什么?
現在我已將構造函數更改為
public Operation(Employee[] emp, int n){
this.emp=emp;
}
並刪除該行:
e = new Employee();
來自PrintOnScreen()
輸出是:
名稱:
年齡:21
您沒有在以下代碼中從數組輸出數據:
public void printOnScreen()
{
for(Employee e : emp)
{
e = new Employee(); // <<< THIS IS WRONG, AS e IS ALREADY SET BY LOOP!!
out.println("Name:\t" + e.getName() + "\t\tAge:\t" + e.getAge() + "\n");
}
}
這段代碼在循環的每次迭代中創建一個新的e
=你不是從數組輸出條目,而是從新創建的條目輸出。 代碼應該讀取
public void printOnScreen()
{
for(Employee e : emp)
{
out.println("Name:\t" + e.getName() + "\t\tAge:\t" + e.getAge() + "\n");
}
}
此外,以下代碼沒有意義:
public Operation(Employee[] emp,int n){
this.emp=emp;
for(Employee e: this.emp)
e = new Employee();
}
為什么要迭代this.emp
所有員工來創建無處存儲的新Employee
實例? 此外,不使用n
參數。 此代碼應為:
public Operation(Employee[] emp)
{
this.emp=emp;
}
第二個問題:(空name
段)
問題是sc.nextInt()
調用。 這將從輸入流中讀取一個整數,但在那里留下carriage return
和line feed
號。 下一個sc.nextLine()
調用將讀取這些符號,而不是其他內容。 這樣所有的名字都用\\r\\n
填充。
你可以解決這個問題:
public static void main(String []args){
sc = new Scanner(System.in);
out.print("Enter the length of arrays :\t");
int n = sc.nextInt();
sc.nextLine(); // <-- new
Employee[] emp = new Employee[n];
for(int i=0;i<n;i++){
out.print("\nEnter name and age of " + (i+1) + " employee :\t");
emp[i] = new Employee();
emp[i].setName(sc.nextLine());
//sc.nextLine(); // <-- removed
emp[i].setAge(sc.nextInt());
sc.nextLine(); // <-- new
}
//..
}
要么
public static void main(String []args){
sc = new Scanner(System.in);
out.print("Enter the length of arrays :\t");
int n = Integer.parseInt(sc.nextLine()); // <-- changed
Employee[] emp = new Employee[n];
for(int i=0;i<n;i++){
out.print("\nEnter name and age of " + (i+1) + " employee :\t");
emp[i] = new Employee();
emp[i].setName(sc.nextLine());
//sc.nextLine(); // <-- removed
emp[i].setAge(Integer.parseInt(sc.nextLine())); // <-- changed
}
//..
}
如果這解決了你的第二個問題,請接受Thorsten Dittmar
給你的主要問題。
打印數據時,您將打印新員工的數據,而不是您創建的早期員工對象。
不確定,但我認為Array不會在Java中使用“=”復制內容。 課堂操作變更
this.emp=emp;
for(Employee e: this.emp)
e = new Employee();
至
for(int i=0; i<n; i++) {
this.emp[i].setName(emp.getName());
this.emp[i].setAge(emp.getAge());
}
然后改變
operate.printOnScreen();
至
operate.printOnScreen(emp);
和
public void printOnScreen() {
for(Employee e : emp){
e = new Employee();
out.println("Name:\t" + e.getName() + "\t\tAge:\t" + e.getAge() + "\n");
}
}
至
public void printOnScreen(Employee emp) {
for(Employee e : emp){
out.println("Name:\t" + e.getName() + "\t\tAge:\t" + e.getAge() + "\n");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.