簡體   English   中英

在java中傳遞數組時代碼中的意外輸出

[英]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 returnline 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM