【问题标题】:How to invoke an abstract method from main method using array objects如何使用数组对象从主方法调用抽象方法
【发布时间】:2022-01-06 15:43:19
【问题描述】:

在下面的代码中,我试图根据成绩和学分计算本科生的 GPA。但是如何在 main 方法中调用 calGPA 方法? CalGPA 应该是一种抽象方法,因此我不能将其设为静态,因为我在考试中使用 JDK 7。有没有可能的解决方案。我认为我的 CalGPA 逻辑也是错误的...... 当我尝试调用 getGradePoints 方法时出现此异常。这是为什么? 线程“main”java.lang.NullPointerException 中的异常:无法调用“String.equals(Object)”,因为“Undergraduate.getResult()”的返回值为 null

public abstract class Student{

    private String name;
    private String courseName;
    private String result;
    private int creditValue;
    private String regNo;
    private double gradePoint;
    private String degree;
    String grade;
    
    Student(String name, String regNo,String degree){
        this.name = name;
        this.regNo = regNo;
        this.degree = degree;
    }
    
    Student( String courseName,int creditValue, String result){
        this.courseName = courseName;
        this.creditValue = creditValue;
        this.result = result;
    }
    
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
    public void setCourseName(String courseName){
        this.courseName = courseName;
    }
    public String getCourseName(){
        return courseName;
    }
    public void setResult(String result){
        this.result = result;
    }
    public String getResult(){
        return this.result;
    }
    public void setCreditValue(int creditValue){
        this.creditValue = creditValue;
    }
    public int getCreditValue(){
        return this.creditValue;
    }
    public void setRegNo(String regNo){
        this.regNo = regNo;
    }
    public String getRegNo(){
        return this.regNo;
    }
    public void setGradePoint(double gradePoint){
        this.gradePoint = gradePoint;
    }
    public double getGradePoint(){
        return this.gradePoint;
    }
    public abstract void calGPA(Student[] st);

    public String getDegree() {
        return degree;
    }

    public void setDegree(String degree) {
        this.degree = degree;
    }


}

public class Undergraduate extends Student{

    Undergraduate(String name,String regNo,String degree){
        super(name,regNo,degree);
    }
    Undergraduate(String courseName,int creditValue, String result){
        super(courseName,creditValue,result);
    }
    
    public void calGPA(Student[] under){
        int totalCredits = 0;
        double sumOf = 0;
        for(int i =0;i<under.length;i++) {
            sumOf += under[i].getGradePoint()*under[i].getCreditValue();
            totalCredits = totalCredits + under[i].getCreditValue();
        }
        double GPA = sumOf/totalCredits;
        System.out.println("GPA : "+GPA);
    }
    
    public static void undergradDetails(Student[] under, Undergraduate u1){
    System.out.println("********Student Information*************");
    System.out.println("Name : "+u1.getName());
        System.out.println("Registration Number : "+u1.getRegNo());
        System.out.println("Degree: "+u1.getDegree());
        System.out.println("Subject\tGrade");
        for(int i =0;i<under.length;i++){
            System.out.println(" "+under[i].getCourseName() + " \t"+under[i].getResult());
        }
    }
    public double getGradePoints(Student[] under){
        if(getResult().equals("A+")){
            setGradePoint(4.25);
        }if(getResult().equals("A")){
            setGradePoint(4.00);
        }if(getResult().equals("A-")){
            setGradePoint(3.75);
        }if(getResult().equals("B+")){
                setGradePoint(3.50);
            }if(getResult().equals("B")){
                setGradePoint(3.25);
            }if(getResult().equals("B-")){
                    setGradePoint(3.00);
                }if(getResult().equals("C+")){
                        setGradePoint(2.75);
                }if(getResult().equals("C")){
                    setGradePoint(2.50);
                }if(getResult().equals("C-")){
                    setGradePoint(2.25);
                }if(getResult().equals("D")){
                    setGradePoint(1.25);
                }if(getResult().equals("F")){
                    setGradePoint(0.00);
                }
        return getGradePoint();
             }
    
    
        }

public class Driver{

    public static void main(String[] args){
        
        Undergraduate u1 = new Undergraduate("Amila Gunathilake","UG/2011/10045","BSc");
        Student[] under = new Undergraduate[6];
        under[0] = new Undergraduate("CS105",1,"A");
        under[1] = new Undergraduate("CS102",3,"B-");
        under[2] = new Undergraduate("ST104",1,"C");
        under[3] = new Undergraduate("CH109",3,"A-");
        under[4] = new Undergraduate("CH106",2,"A+");
        under[5] = new Undergraduate("CS103",2,"A");

        under.calGPA(under);
         System.out.println(u1.getGradePoints(under));

【问题讨论】:

  • 您在u1 上调用getGradePoints,这与传递给calGPAunder 数组完全无关。由于u1 上没有设置任何结果,所以它是null,导致NullPointerException

标签: java arrays methods abstract


【解决方案1】:

您应该调用u1.calGPA(under) 而不是calGPA(under) 以使您的程序运行基本没有编译错误。

添加: 你的代码有很多问题。

  1. 你的构造函数签名是什么

    Undergraduate(String courseName, int creditValue, String result)

稍后你可以初始化你的构造函数

new Undergraduate("CS105", 1, "A")

然后在calGPA 函数中,您将gradePoint 乘以creditvalue 并保存。

under[i].getGradePoint() * under[i].getCreditValue();

总和为 0。

【讨论】:

  • 不,U1 是一个单独的构造函数。它不起作用。
  • @AllenHay 请检查我的更新答案。
猜你喜欢
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 2017-05-02
相关资源
最近更新 更多