public string getTime()
{
StringBuilder RetString = new StringBuilder();
RetString.Append(Hours.ToString().PadLeft(2, '0') + "-" + Min.ToString().PadLeft(2, '0') + "-" + AMPM.PadLeft(2, '0'));
return RetString.ToString();
}
我正在尝试使用此方法将时间(以字符串格式)返回给表单字符串变量。我有用户设置来输入一个时间,时间存储在这个类中,现在我正在做的就是将这些数据带到我工作的表单中。我已经验证了数据进入类并存储在变量。
我得到的错误是:
不确定问题是什么。 我当然声明了变量
private int Hours;
private int Min;
private string AMPM;
我有设置设置:
public int _hours
{
get
{
return Hours;
}
set
{
if (value <= 12 && value >= 1)
{
Hours = value;
}
else
Hours = 0;
}
}
public int _min
{
get
{
return Min;
}
set
{
if (value <= 59 && value >= 1)
{
Min = value;
}
else
Min = 0;
}
}
public string ampm
{
get
{
return AMPM;
}
set
{
if (AMPM == "AM" || AMPM == "PM")
{
AMPM = value;
}
else
AMPM = "";
}
}
和我对班级的呼吁:
string timefromclass;
timefromclass = timec.getTime();
我认为唯一可能是我打电话给我存储时间的课程
C_Time time = new C_Time();
但另一种形式我也设置了另一种形式。
C_Time timec = new C_Time();
可能我正试图从空实例中检索时间?
编辑:
public void setTime(int hours, int min, string aMPM)
{
Hours = hours;
Min = min;
AMPM = aMPM;
这是我唯一分配变量的地方。
答案 0 :(得分:4)
您是否在代码中的某处初始化AMPM
。如果不是,它将为null(引用类型变量的默认值),并且在其上调用PadLeft
将为您提供NRE。
答案 1 :(得分:3)
从您的代码中,我假设您的AMPM
字段为null
。
除了你在代码中不调用的setter之外,你似乎没有在任何地方实例化它。
初始化它应解决问题:
private string AMPM = string.Empty;
答案 2 :(得分:1)
您获得的错误意味着您正在尝试阅读尚未初始化的“参考类型”,因此 null 。
int 是“值类型”,值类型不能表示空值。
字符串是“引用类型”,是您班级中唯一的引用类型(AMPM
)。这必须是问题所在。
您需要初始化AMPM
以停止错误。如果您还没有,那么在您的类中添加构造函数是处理初始化的好方法。例如:
public C_Time()
{
AMPM = "";
}
答案 3 :(得分:1)
正如其他人所指出的那样AMPM
就是问题所在。你应该像这样定义它
private string _ampm;
public string AMPM
{
get
{
return _ampm ?? ""; // Returns "" if _ampm == null
}
set
{
_ampm = value;
}
}
然后使用属性
AMPM.PadLeft( ...
但为什么不使用
String.Format("{0:00}-{1:00}-{2}", Hours, Min, AMPM.PadLeft(2, '0'));
使用枚举
会更安全public enum AmPm
{
Undefined,
AM,
PM
}
这清楚地列举了有效的条目。否则你可以输入类似“下午”或“上午”而不是“上午”的东西。