当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
我该怎么做才能解决这个问题?
答案 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)