[英]Java classes and Scanner
我正在學習Java並從類開始,但現在有一些疑問。
我要用來自學生,班級和椅子的數據制作程序。 例如,來自學生數據的信息將用於教室和椅子。 現在,我將限制自己局限於班級學生。
每個學生都有名字和生日。 我以為我要用學生數據創建一個班級,然后將學生數據保存在兩個數組中。 名稱的字符串的一維數組,日期(年,月,日)的三列數組。
我首先使用以下代碼創建Student類:
public class Stundent{
private String nameStudent;
private int yearBirth;
private int monthBirth;
private int dayBirth;
public void setName(String name){
System.out.println("Insert student's name:");
nameStudent = name;
}
public String getName(){
return nameStudent;
}
public void setYear(int year){
System.out.println("Insert student's year of birth:");
yearBirth = year;
}
public int getYear(){
return yearBirth;
}
public void setMonth(int month){
System.out.println("Insert student's month of birth:");
monthBirth = month;
}
public int getMonth(){
return monthBirth;
}
public void setDay(int day){
System.out.println("Insert student's day of birth:");
dayBirth = day;
}
public int getDay(){
return dayBirth;
}
}
然后在主文件中就想到了這種方式:
Student person = new Student();
String[] nameStudents = new String[100];
int[][] birthdayStudents = new int[100][3];
for (int i = 0; i < 3; i++){
person.setName(sc.nextLine());
nameStudents[i] = person.getName();
person.setAno(sc.nextInt());
birthdayStudents[i][1] = person.getAno();
person.setMes(sc.nextInt());
birthdayStudents[i][1] = person.getMes();
person.setDia(sc.nextInt());
birthdayStudents[i][2] = person.getDia();
}
第一個問題:
忘記由於掃描儀而無法正常工作,這是正確的思維方式嗎?
第二個問題:
如果我運行此代碼,則將出現以下情況:將顯示給我“插入學生的姓名:”,但是如果我放置Maria,則將出現InputMismatchException。 我相信他一年會儲存瑪麗亞。 為什么會這樣? 在同一for周期中,我最多只能打一個電話給掃描儀嗎? 如果我只輸入代碼:
person.setName(sc.nextLine());
nameStudents[i] = person.getName();
並刪除所有其他有關生日的內容,即可正常運行。 誰能啟發我?
我認為這不是正確的方法。 您將實體Student與輸入相關信息混合在一起。 我將重新設計如下(稍微減少了Student ):
/* just an entity, no logic at all */
public class Student {
private String name = null;
private Integer year = null;
public void setName(String name){
this.name = name;
}
public void setYear(Integer year){
this.year = year;
}
}
以及獲取用戶輸入的邏輯:
List<Student> students = new ArrayList<Student>();
int numberOfStudents = 3;
for (int i = 0; i < numberOfStudents; i++){
System.out.println("Please enter name:");
String name = sc.nextLine();
System.out.println("Please enter year:");
Integer year = sc.nextInt();
/* after gathering the input create student */
Student s = new Student();
s.setName(name);
s.setYear(year);
students.add(s);
}
將學生對象本身保存在列表中怎么辦?
List<Student> studentList = new ArrayList<Student>();
studentList.add(student);
另外,當您從掃描儀中檢索信息時,請將那些信息(例如名稱,年齡等)分配給一個臨時對象,以便您可以對它們進行一些驗證。
String temp = sc.nextLine();
驗證“ temp”,如果您要存儲在該人的名字中,則從該人的班級調用setter。
在對象上調用任何setter方法之前,最好先驗證用戶輸入。
看來您正在將收集信息的責任划分在主塊中的代碼和Stundent
(請注意拼寫錯誤)類中的代碼之間。
我將集中精力考慮類的職責,並確保類中沒有直接處理該類職責的多余代碼。 例如,如果Student
要保留其名稱,則名稱字段應在Student
內部(您是通過這種方式完成的,這很有意義)。 但是,如果要更新學生的姓名,則在為Student
分配一個名稱后,通過println
語句提示它要求一個名稱是沒有意義的。
也許您需要一個StudentReader
類,該類可以讀取輸入,然后構造Student
對象。 這樣的讀者將承擔全部正確提示和讀取值的唯一責任,最終結果是一個構造Student
。 然后,主要塊基本上是一個循環,以使用StudentReader
讀取每個學生,以及一個部分來收集讀取的Student
並進行相應處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.