Java 未提供作者值时不显示作者值

Java 未提供作者值时不显示作者值,java,Java,我正在尝试创建一个java程序,其中有一个超类ReadingMaterial和许多不同的子类,即报纸、漫画、小说和教科书。现在,Readingmaterial有3个数据成员,其他每个类都有2个不同的数据成员 我试图显示我正在创建的字符串,例如: allMat.add(new Newspaper("NewYork_Times")); 我想显示“纽约时报”和日期,作者 谁能告诉我我做错了什么 ps:我是JAVA编程新手 报课 public class Newspaper exten

我正在尝试创建一个java程序,其中有一个超类ReadingMaterial和许多不同的子类,即报纸、漫画、小说和教科书。现在,Readingmaterial有3个数据成员,其他每个类都有2个不同的数据成员

我试图显示我正在创建的字符串,例如:

allMat.add(new Newspaper("NewYork_Times"));
我想显示“纽约时报”和日期,作者 谁能告诉我我做错了什么

ps:我是JAVA编程新手

报课

public class Newspaper
        extends ReadingMaterial {

    private String title = "BHCC_Newspaper";

    //public Newspaper(){}
    public Newspaper(String title) {
        this.title = title;
    }

    public Newspaper(String title, String author, boolean readingMaterial) {
        super(author, readingMaterial);
        this.title = title;
    }

    //getter
    public String getTitle() {
        return title;
    }

    // setter
    public void setTitle(String title) {
        this.title = title;
    }

    public void displayReadingMaterials() {
        System.out.println(getTitle() + "\n Microsoft recruited 15 students from a community college.\n");
    }
}
这是超类

public class ReadingMaterial implements Comparable {

    private String author = "Lydie";
    private boolean readingMaterial;
    private java.util.Date dateCreated;

    // no-arg constructor
    public ReadingMaterial() {
        dateCreated = new java.util.Date();
    }
    // arg constructor

    public ReadingMaterial(String author, boolean readingMaterial) {
        dateCreated = new java.util.Date();
        this.author = author;
        this.readingMaterial = readingMaterial;
    }
    // getters

    public String getAuthor() {
        return author;
    }

    public java.util.Date getDateCreated() {
        return dateCreated;
    }

    public boolean getReadingMaterial() {
        return readingMaterial;
    }
    // setters

    public void setAuthor(String author) {
        this.author = author;
    }

    public void setReadingMaterial(boolean readingMaterial) {
        this.readingMaterial = readingMaterial;
    }

    public void displayReadingMaterials() {
        System.out.println("Written on " + getDateCreated() + " by " + getAuthor()
                + " on all ReadingMaterial: " + getReadingMaterial());
    }

//Comparator for sorting the list
     public static  Comparator <ReadingMaterial> testCompare = new Comparator <ReadingMaterial>(){

             public int compare(ReadingMaterial readMat1, ReadingMaterial readMat2){


             return (int) (readMat1.getAuthor().compareTo(readMat2.getAuthor()));
             }
     };
    @Override
    public String toString() {
        return "Written on " + dateCreated + " by " + author
                + " on all ReadingMaterial: " + readingMaterial;
    }

    @Override
    public int compareTo(Object t) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }



}
public类ReadingMaterial实现可比性{
私有字符串author=“Lydie”;
私人布尔阅读材料;
private java.util.Date创建日期;
//无参数构造函数
公共阅读材料(){
dateCreated=new java.util.Date();
}
//参数构造函数
公共阅读材料(字符串作者、布尔阅读材料){
dateCreated=new java.util.Date();
this.author=作者;
this.readingMaterial=readingMaterial;
}
//吸气剂
公共字符串getAuthor(){
返回作者;
}
public java.util.Date getDateCreated(){
已创建的返回日期;
}
公共布尔getReadingMaterial(){
归还阅读材料;
}
//二传手
公共void setAuthor(字符串编写器){
this.author=作者;
}
公共void setReadingMaterial(布尔readingMaterial){
this.readingMaterial=readingMaterial;
}
public void displayingreadingmaterials(){
System.out.println(“由”+getAuthor()在“+getDateCreated()+”上编写)
+在所有ReadingMaterial上:“+getReadingMaterial());
}
//用于对列表进行排序的比较器
公共静态比较器testCompare=新比较器(){
公共整型比较(读取材料readMat1,读取材料readMat2){
return(int)(readMat1.getAuthor().compareTo(readMat2.getAuthor());
}
};
@凌驾
公共字符串toString(){
返回由“+作者”在“+日期创建的+”上编写
+“在所有阅读材料上:”+阅读材料;
}
@凌驾
公共整数比较(对象t){
抛出新的UnsupportedOperationException(“尚未受支持”);//若要更改生成的方法体,请选择“工具”“模板”。
}
}
这是主要问题

package readingmaterial;
import java.util.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Iterator;
import java.util.Collections;


public class ReadingFactory {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        // create and initialize a newspaper, a manga, a textbook and a novel

        List<ReadingMaterial> allMat = new ArrayList<ReadingMaterial>();
        allMat.add(new Newspaper("NewYork_Times"));
        allMat.add(new Manga("Naruto"));
        allMat.add(new TextBook("Bible"));
        allMat.add(new Novel("Argonauts"));
        //Iterator<ReadingMaterial> readMat = all.iterator();

        System.out.println("ArrayList elements after sorting in ascending order : ");

       Collections.sort(allMat, ReadingMaterial.testCompare);

       for(ReadingMaterial str: allMat){
            System.out.println(str);

        //ReadingMaterial[] allMat={newspaper,manga,textbook,novel};
        //for(int i=0;i<4;i++){
          //   allMat[i].displayReadingMaterials();
        // }
    }
    // this method show the polymorphic call and display any reading material

}
包装阅读材料;
导入java.util.*;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Iterator;
导入java.util.Collections;
公共类读取工厂{
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args){
//创建并初始化报纸、漫画、教科书和小说
List allMat=new ArrayList();
allMat.add(纽约时报);
所有材料添加(新漫画(“鸣人”);
新增(新教科书(“圣经”);
添加(新小说(“Argonauts”);
//迭代器readMat=all.Iterator();
System.out.println(“按升序排序后的ArrayList元素:”);
Collections.sort(allMat,ReadingMaterial.testCompare);
用于(读取材料str:allMat){
系统输出打印项次(str);
//阅读材料[]所有材料={报纸、漫画、教科书、小说};

//对于(int i=0;i而言,问题在于,当您执行
新报纸(“纽约时报”)
时,您使用的是默认的超级构造函数,没有参数,这意味着未设置
作者。
因此,比较器上的指针为null(
getAuthor
返回null):

您应该:
1.将空检查添加到比较器

2.如果您依靠author进行比较,则不能允许其为null。要么没有构造函数,要么设置默认值(就像您对日期所做的那样)

强制转换
(int)(readMat1.getAuthor().compareTo(readMat2.getAuthor());
是多余的。如图所示的代码有不平衡的大括号,无法编译。这个问题是问为什么在没有作者的情况下不显示作者。顺便说一句,麻烦的
Date
类已经被java.time类所取代,例如
java.time.Instant
。非常感谢,我修复了我的代码,没有问题w工作
readMat1.getAuthor().compareTo(readMat2.getAuthor())