"How to pass GregorianCalendar class object to a different class method ?"

"How to pass GregorianCalendar class object to a different class method ?"

  1. 我想使用一种能够创建学生记录的方法 从用户那里获取有关学生详细信息的输入。我的 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();
    }

}

错误:

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);
         }



    }


}