"How to pass GregorianCalendar class object to a different class method ?"
"How to pass GregorianCalendar class object to a different class method ?"
- 我想使用一种能够创建学生记录的方法
从用户那里获取有关学生详细信息的输入。我的 class 学生应该
由以下领域组成:短期学期,
全名,
注册号等
.学生的注册号 = 年份和学号的串联。
例如,学生加入的年份 = 2023,
学生号= 80,
所以注册号=2380
另外,我的任务是使用 class GregorianCalendar
输入日期
内部学生CLASS:
import java.util.*;
class Student2{
String fullname;
GregorianCalendar date;
short semester;
Student2()
{
}
Student2(String name,short sem, GregorianCalendar Date)
{
fullname = name;
semester=sem;
date = Date;
}
int years = date.get(Calendar.YEAR);
String year = Integer.toString(years);
String Studno = Integer.toString(80);
String y1= year.substring(0,3);
String Reg = y1.concat(Studno);
int reg = Integer.parseInt(Reg);
void Studarry()
{
int n=5,i;
Student2[] stuarry = new Student2[10];
for(i=0;i<n;i++)
{
System.out.println("Enter name sem year month day gpa cgpa\n");
Scanner sc = new Scanner(System.in);
String name = sc.nextLine();
short sem2 = sc.nextShort();
int year2 = sc.nextInt();
int month2 = sc.nextInt();
int day2=sc.nextInt()
GregorianCalendar gc2 = new GregorianCalendar(year2,month2,day2);
stuarry[i] = new Student2(name,sem2,gc2);
}
}
void Display()
{
}
}
内部驱动程序CLASS:
public class Greg2{
public static void main(String[] args)
{
Student2 starr = new Student2();
starr.Studarry();
}
}
错误:
线程异常 "main" java.lang.NullPointerException
at oop2/lab5.Student2.<init>(Greg2.java:23)
at oop2/lab5.Greg2.main(Greg2.java:68)
Class 名称与变量名称
date = Date;
Date
大写 D
是 class 的名称,不是变量。相反,您应该将传递的参数名称定义为 date
而不是 Date
。此行变为 date = date ;
。编译器可以区分参数和成员变量。如果你想让 reader 更清楚,你可以说 this.date = date ;
.
但这是一个糟糕的变量名称。因为确实有两个 classes 与 Java 捆绑在一起,名为 Date
,都与 GregorianCalendar
相关,我建议避免使用 date
作为变量名GregorianCalendar
对象 – 太混乱了。
java.time
GregorianCalendar
是一个可怕的 class。它在几年前被 java.time classes 完全取代。具体来说,ZonedDateTime
。两个 classes 都表示通过某个特定区域(时区)的挂钟时间看到的时刻。
但是,这两个 class 都是 不 的。您只需要一个日期,没有一天中的时间,也没有时区或与 UTC 的偏移量的上下文。所以 LocalDate
符合您的需求。
LocalDate ld = LocalDate.of( year , month , day ) ;
构造函数
int years = date.get(Calendar.YEAR);
String year = Integer.toString(years);
String Studno = Integer.toString(80);
…
这些行是浮动的,而不是放在方法中。它们应该放在您的方法的构造函数中。
为什么会有一个名为Greg2
的class?你指的是某个特定的学生吗?如果是这样,Greg 应该由分配给 Student
class 的 实例 的值表示。
名字末尾的所有 2
个字符是什么?命名很重要;弄清楚这一点,您将找到解决方案的一半。
所以大部分代码都是一团糟。 从头开始重试。查找其他代码示例,例如 Stack Overflow、Oracle Tutorial 或 class 本作业的教科书.
了解关注点分离。一个class应该只是代表一个学生。另一个 class 应该代表您的应用程序,并持有 main
方法。使用 Collection
将新实例化的 Student
classes 收集到花名册中,如果您有其他与花名册相关的职责,可能会创建 class Roster
。
最后,迈出第一步。一次添加一个小东西,看看它是否正常运行。使用 System.out.println
验证值。不要试图一次写完所有的代码。
您的NullPointerException
来自这一行:
int years = date.get(Calendar.YEAR);
像这样的字段初始值设定项在构造函数之前执行。因此,当您使用 new Student2()
创建一个 Student2
对象时,上面的行是在 date
字段仍然是 null
时创建的,因此对 date.get()
的调用抛出异常。
而是将 years
的初始化移动到构造函数中,在您将对象分配给 date
之后。
正如其他人所说,GregorianCalendar
class 设计不佳且早已过时。如果不是一个懒惰的老师显然对 Java 过去 5 年多的时间一无所知,你不应该使用它。从来没有。
错误更正为-
1) 如(Basil Bourque,Ole V.V。)
所说,在我的构造函数中购买了字段初始值设定项以消除 NullpointerException
2) 在 main 中创建了学生对象数组,并在其上调用了 Stduarry 方法。
3)变量名日期更改为gc
import java.util.*;
内部学生CLASS:
class Student22{
String fullname;
GregorianCalendar date;
short semester;
int reg;
Student22()
{
}
Student22(String name,short sem, GregorianCalendar gc)
{
fullname = name;
semester=sem;
date = gc;
int years = date.get(Calendar.YEAR);
String year = Integer.toString(years);
System.out.println(year);
String Studno = Integer.toString(80);
String y1= year.substring(2,4);
System.out.println(y1);
String Reg = y1.concat(Studno);
System.out.println(Reg);
reg = Integer.parseInt(Reg);
System.out.println(reg);
}
void Studarry(int n)
{
System.out.println("Enter name sem year month day \n");
Scanner sc = new Scanner(System.in);
fullname = sc.nextLine();
System.out.println(fullname);
semester = sc.nextShort();
int year2 = sc.nextInt();
int month2 = sc.nextInt();
int day2=sc.nextInt();
GregorianCalendar gc2 = new GregorianCalendar(year2,month2,day2);
date= gc2;
int years = date.get(Calendar.YEAR);
String year = Integer.toString(years);
String Studno = Integer.toString(n);
String y1= year.substring(0,3);
String Reg = y1.concat(Studno);
reg = Integer.parseInt(Reg);
Display();
}
void Display()
{
System.out.println(fullname);
System.out.println(semester);
System.out.println(reg);
System.out.println(date.get(Calendar.YEAR));
}
}
内部驱动程序CLASS:
public class Greg2{
public static void main(String[] args)
{
System.out.println("Please enter a Firstname , MiddleName & Lastname separated by spaces");
Scanner sc = new Scanner(System.in);
String name = sc.nextLine();
GregorianCalendar gc = new GregorianCalendar(2018,7,22);
Student22 s = new Student22(name,(short)3,gc);
s.Display();
int i,j,n;
System.out.println("Enter n\n");
n = sc.nextInt();
Student22[] starr = new Student22[n+1];
for(j=1;j<=n;j++)
{
starr[j]= new Student22();
starr[j].Studarry(j);
}
}
}
- 我想使用一种能够创建学生记录的方法 从用户那里获取有关学生详细信息的输入。我的 class 学生应该 由以下领域组成:短期学期, 全名, 注册号等 .学生的注册号 = 年份和学号的串联。 例如,学生加入的年份 = 2023, 学生号= 80, 所以注册号=2380
另外,我的任务是使用 class GregorianCalendar
输入日期内部学生CLASS:
import java.util.*;
class Student2{
String fullname;
GregorianCalendar date;
short semester;
Student2()
{
}
Student2(String name,short sem, GregorianCalendar Date)
{
fullname = name;
semester=sem;
date = Date;
}
int years = date.get(Calendar.YEAR);
String year = Integer.toString(years);
String Studno = Integer.toString(80);
String y1= year.substring(0,3);
String Reg = y1.concat(Studno);
int reg = Integer.parseInt(Reg);
void Studarry()
{
int n=5,i;
Student2[] stuarry = new Student2[10];
for(i=0;i<n;i++)
{
System.out.println("Enter name sem year month day gpa cgpa\n");
Scanner sc = new Scanner(System.in);
String name = sc.nextLine();
short sem2 = sc.nextShort();
int year2 = sc.nextInt();
int month2 = sc.nextInt();
int day2=sc.nextInt()
GregorianCalendar gc2 = new GregorianCalendar(year2,month2,day2);
stuarry[i] = new Student2(name,sem2,gc2);
}
}
void Display()
{
}
}
内部驱动程序CLASS:
public class Greg2{
public static void main(String[] args)
{
Student2 starr = new Student2();
starr.Studarry();
}
}
错误:
线程异常 "main" java.lang.NullPointerException
at oop2/lab5.Student2.<init>(Greg2.java:23) at oop2/lab5.Greg2.main(Greg2.java:68)
Class 名称与变量名称
date = Date;
Date
大写 D
是 class 的名称,不是变量。相反,您应该将传递的参数名称定义为 date
而不是 Date
。此行变为 date = date ;
。编译器可以区分参数和成员变量。如果你想让 reader 更清楚,你可以说 this.date = date ;
.
但这是一个糟糕的变量名称。因为确实有两个 classes 与 Java 捆绑在一起,名为 Date
,都与 GregorianCalendar
相关,我建议避免使用 date
作为变量名GregorianCalendar
对象 – 太混乱了。
java.time
GregorianCalendar
是一个可怕的 class。它在几年前被 java.time classes 完全取代。具体来说,ZonedDateTime
。两个 classes 都表示通过某个特定区域(时区)的挂钟时间看到的时刻。
但是,这两个 class 都是 不 的。您只需要一个日期,没有一天中的时间,也没有时区或与 UTC 的偏移量的上下文。所以 LocalDate
符合您的需求。
LocalDate ld = LocalDate.of( year , month , day ) ;
构造函数
int years = date.get(Calendar.YEAR);
String year = Integer.toString(years);
String Studno = Integer.toString(80);
…
这些行是浮动的,而不是放在方法中。它们应该放在您的方法的构造函数中。
为什么会有一个名为Greg2
的class?你指的是某个特定的学生吗?如果是这样,Greg 应该由分配给 Student
class 的 实例 的值表示。
名字末尾的所有 2
个字符是什么?命名很重要;弄清楚这一点,您将找到解决方案的一半。
所以大部分代码都是一团糟。 从头开始重试。查找其他代码示例,例如 Stack Overflow、Oracle Tutorial 或 class 本作业的教科书.
了解关注点分离。一个class应该只是代表一个学生。另一个 class 应该代表您的应用程序,并持有 main
方法。使用 Collection
将新实例化的 Student
classes 收集到花名册中,如果您有其他与花名册相关的职责,可能会创建 class Roster
。
最后,迈出第一步。一次添加一个小东西,看看它是否正常运行。使用 System.out.println
验证值。不要试图一次写完所有的代码。
您的NullPointerException
来自这一行:
int years = date.get(Calendar.YEAR);
像这样的字段初始值设定项在构造函数之前执行。因此,当您使用 new Student2()
创建一个 Student2
对象时,上面的行是在 date
字段仍然是 null
时创建的,因此对 date.get()
的调用抛出异常。
而是将 years
的初始化移动到构造函数中,在您将对象分配给 date
之后。
正如其他人所说,GregorianCalendar
class 设计不佳且早已过时。如果不是一个懒惰的老师显然对 Java 过去 5 年多的时间一无所知,你不应该使用它。从来没有。
错误更正为-
1) 如(Basil Bourque,Ole V.V。)
所说,在我的构造函数中购买了字段初始值设定项以消除 NullpointerException2) 在 main 中创建了学生对象数组,并在其上调用了 Stduarry 方法。
3)变量名日期更改为gc
import java.util.*;
内部学生CLASS:
class Student22{
String fullname;
GregorianCalendar date;
short semester;
int reg;
Student22()
{
}
Student22(String name,short sem, GregorianCalendar gc)
{
fullname = name;
semester=sem;
date = gc;
int years = date.get(Calendar.YEAR);
String year = Integer.toString(years);
System.out.println(year);
String Studno = Integer.toString(80);
String y1= year.substring(2,4);
System.out.println(y1);
String Reg = y1.concat(Studno);
System.out.println(Reg);
reg = Integer.parseInt(Reg);
System.out.println(reg);
}
void Studarry(int n)
{
System.out.println("Enter name sem year month day \n");
Scanner sc = new Scanner(System.in);
fullname = sc.nextLine();
System.out.println(fullname);
semester = sc.nextShort();
int year2 = sc.nextInt();
int month2 = sc.nextInt();
int day2=sc.nextInt();
GregorianCalendar gc2 = new GregorianCalendar(year2,month2,day2);
date= gc2;
int years = date.get(Calendar.YEAR);
String year = Integer.toString(years);
String Studno = Integer.toString(n);
String y1= year.substring(0,3);
String Reg = y1.concat(Studno);
reg = Integer.parseInt(Reg);
Display();
}
void Display()
{
System.out.println(fullname);
System.out.println(semester);
System.out.println(reg);
System.out.println(date.get(Calendar.YEAR));
}
}
内部驱动程序CLASS:
public class Greg2{
public static void main(String[] args)
{
System.out.println("Please enter a Firstname , MiddleName & Lastname separated by spaces");
Scanner sc = new Scanner(System.in);
String name = sc.nextLine();
GregorianCalendar gc = new GregorianCalendar(2018,7,22);
Student22 s = new Student22(name,(short)3,gc);
s.Display();
int i,j,n;
System.out.println("Enter n\n");
n = sc.nextInt();
Student22[] starr = new Student22[n+1];
for(j=1;j<=n;j++)
{
starr[j]= new Student22();
starr[j].Studarry(j);
}
}
}