如何强制toString()打印“undefined”而不是“null”

时间:2016-01-09 00:00:56

标签: java class tostring

toString对象为Fraction时,我正在尝试将null方法打印为“未定义”。以下是我的类文件和测试文件中的位:

public class Fraction
{
    private int num;//Short for "numerator"
    private int den;//Short for "denominator"
    public Fraction(int a,int b)
    {
        num=a;
        den=b;
    }
    //Sample method that may result in a "null" object
    public Fraction divide(Fraction frac)
    {
        if(den!=0&&frac.den!=0)
            return new Fraction(num*frac.den,den*frac.num);
        return null;
    }

    public String toString()
    {
        simplify();
        if(this==null)
            return "undefined";
        if(den==0||this==null)
            return "undefined";
        if(den==1||num==den)
            return num+"";
        return num+"/"+den;
    }
}

public class FractionTest
{
    public static void main(String[]args)
    {
        Fraction f1=new Fraction(8,0);
        Fraction f2=new Fraction(2,1).divide(f1);
        System.out.println(f2);
        System.out.println(f2==null);
    }
}

不幸的是,代码产生了这个输出:

null
true

我该怎么做才能解决这个问题?

4 个答案:

答案 0 :(得分:4)

在Java中,this 从不 null。如果一段代码在toString()对象上调用null,则运行时将抛出NullPointerException

因此,您需要更改堆栈中较高的代码,这些代码可能会将null Fraction转换为字符串。这是实现目标的唯一途径。

答案 1 :(得分:1)

如果没有提供f2方法,很难说,但此代码将Fraction f2=new Fraction(2,1).divide(f1); System.out.println(f2); 设置为null:

System.out.println(null)

我们还可以看到null将打印null,因此您输出f2的原因是因为您将null设置为toString }。

正如其他帖子提到的那样,您无法在null引用上致电null:该引用具有您可以调用的方法。因此,如果要打印不同的内容,则需要创建一个将undefined值转换为所需null字符串的函数。

然而!通过Function是不好的做法。您应该做的是将public class Fraction { private enum STATE { DEFINED, UNDEFINED }; //No reason to shorten private names private int numerator; private int denominator; private STATE state; //Make your variable names meaningful!!! public Fraction(int numerator,int denominator) { this.numerator=numerator; this.denominator=denominator; this.state=STATE.DEFINED; } //Sample method that may result in a "null" object public Fraction divide(Fraction fraction) { if (fraction.denominator == 0){ this.state = STATE.UNDEFINED; return this; } ... } public String toString() { simplify(); if(this.state.equals(STATE.UNDEFINED)){ return "undefined"; } else { ... } //Note: you should always use braces for ifs } } 定义为具有未定义的状态:

Fraction

在这个公式中,您利用Java的面向对象特性让0对象本身知道它是否是在您定义的数学空间上定义的。我们知道未为 private void EraseRow_Click(object sender, RoutedEventArgs e) { _conn.Open(); SQLiteCommand cmd = new SQLiteCommand("Delete from Activity where RowID=5", _conn); cmd.ExecuteNonQuery(); ActivitiesDataGrid.ItemsSource = _dataBase.updateDataGrid(_conn); _conn.Close(); } public ObservableCollection<Activity> updateDataGrid(SQLiteConnection _sqlConnect) { List<Activity> _actList = new List<Activity>(); SQLiteCommand cmd01 = new SQLiteCommand("SELECT * FROM Activity", _sqlConnect); SQLiteDataReader reader = cmd01.ExecuteReader(); ObservableCollection<Activity> _activitiesList= new ObservableCollection<Activity>(); while (reader.Read()) { Activity _act = new Activity(); _act.Name = reader.GetString(reader.GetOrdinal("Activity")); _act.Customer = reader.GetString(reader.GetOrdinal("ActivityCustomer")); string _actST = reader.GetString(reader.GetOrdinal("ActivityNature")); _act.Activitytpe = (ActivityType)Enum.Parse(typeof(ActivityType), _actST); string st = reader.GetString(reader.GetOrdinal("StartedAt")); _act.StartedAt = Convert.ToDateTime(st); string et = reader.GetString(reader.GetOrdinal("FinishedAt")); _act.EndedAt = Convert.ToDateTime(et); //string _ratio = reader.GetString(reader.GetOrdinal("ActivityRatio")); //_act.ActivityRatio = Convert.ToDouble(_ratio); _act.Notes = reader.GetString(reader.GetOrdinal("Notes")); string _hldy = reader.GetString(reader.GetOrdinal("Holiday")); _act.IsHoliday = Convert.ToBoolean(_hldy); _activitiesList.Add(_act); } return _activitiesList; //_adpt01.Fill(_tbl01); //dgrid.ItemsSource = _tbl01.DefaultView; //Disconnect(_sqlConnect); } 的分母定义分数,因此这是分数可以变为未定义的一种方式。然后,当你需要分数报告它的状态时,它可以。否则,程序中的每个其他类都需要知道如何处理未定义的(即&#39; null&#39;)分数,并且需要知道分数为空的分数与分数之间的差异。由于完美的原因(例如除以零),它是完全未定义的。这很快变得难以管理。

答案 2 :(得分:1)

您不能这样做,因为this不能是null,如果对象是null,则您无法调用toString方法,因为toString }方法必须与object相关。

但是你可以通过外部方法或使用包装类来间接地检查传递的对象是否为null然后打印未定义

答案 3 :(得分:0)

实际上,使用this意味着该对象存在,因此它不是null  解决方案是在Fraction类中定义Fraction类的静态实例,该实例表示null Fraction个对象。让我们说:

public final static Fraction NULL_FRACTION = new Fraction (); // don't forget adding default constructor

devide方法替代

return null;

通过

return Fraction.NULL_FRACTION;

toString方法中替换测试:

this==null

通过:

Fraction.NULL_FRACTION.equals (this)