2
   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();
   } 

我正在尝试使用它将时间(以字符串格式)返回给表单字符串变量。我让用户设置输入时间并且时间存储在这个类中,我现在所做的就是将这些数据带到我正在工作的表单中。我已经验证数据正在进入类并存储在变量。

我得到的错误是:

CSharp_Null

不太确定问题是什么。我当然声明了变量

    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;

那真的是我为该变量分配任何东西的唯一地方。

4

4 回答 4

4

您是否AMPM在代码中的某处进行了初始化。如果不是,它将为 null(引用类型变量的默认值)并且调用PadLeft它会给你一个 NRE。

于 2012-04-10T15:56:32.577 回答
3

根据您的代码,我假设您的AMPM字段是null.

除了您没有在代码中调用的设置器之外,您似乎没有在任何地方实例化它。

初始化它应该可以解决问题:

private string AMPM = string.Empty;
于 2012-04-10T15:57:02.367 回答
1

您收到的错误意味着您正在尝试读取尚未初始化的“引用类型”,因此为null

int是“值类型”,值类型不能表示空值。

string是一个“引用类型”,并且是您的类中唯一的引用类型 ( AMPM)。这一定是问题所在。

您将需要初始化AMPM以停止错误。如果您还没有,向您的类添加构造函数是处理初始化的好方法。例如:

public C_Time()
{
    AMPM = "";
}
于 2012-04-10T16:15:32.920 回答
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
}

这清楚地列举了有效的条目。否则,您可以输入诸如“下午”或“上午”之类的内容,而不是“上午”。

于 2012-04-10T16:20:05.373 回答