ToString重载中未处理的异常

时间:2017-01-19 08:30:37

标签: c# visual-studio-2015 xamarin.android

你好,感谢你的时间。

我最近决定尝试使用Xamarin.Android来开发我的想法。

然而,我遇到过我曾经遇到过的最奇怪的问题。

public class Note : INote
{
    public string Content { get; set; }
    public DateTime DateTime { get; set; }
    public List<ITag> Tags { get; set; }

    public override string ToString()
    {
        try
        {
            const int maxLength = 20;
            if (Content.Length > maxLength)
            {
                return Content.Substring(0, maxLength - 1);
            }
            return Content;

        }
        catch (Exception)
        {
            return Content;
        }
    }
}

在上面的类中,当我对一个小于20个字符的音符对象进行ToString操作时,我得到一个未处理的异常。我认为这很奇怪,所以我在try / catch中用子串包装了部分。

然而,我仍然得到一个未处理的例外。怎么会这样?

Unhandled Exception - ArgumentOutOfRangeException

编辑: 异常窗口看起来也很糟糕。通常它们看起来像这样。 Intentional exception

填充ListView时会调用ToString,这是在这段代码中完成的。

[Activity(Label = "@string/ApplicationName")]
public class ShowNotesActivity : Activity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        SetContentView(Resource.Layout.ShowNotes);
        var persistence = new Persistence();
        var listView = FindViewById<ListView>(Resource.Id.listView1);

        var adapter = new ArrayAdapter<INote>(this, Android.Resource.Layout.SimpleListItem1, persistence.GetAllNotes());

        listView.Adapter = adapter;

    }
}

1 个答案:

答案 0 :(得分:0)

以下是我在Visual Studio中测试的代码并确认它有效:

public class Card
{
    public string Content { get; set; }

    public override string ToString()
    {
        if (Content == null)
            return null;

        const int maxLength = 20;
        if (Content.Length > maxLength)
            return Content.Substring(0, maxLength - 1);

        return Content;
    }
}

以下是我用来测试它的方法(实用程序方法是我自己的代码沙箱中的方法之一):

var card = new Card();
var str = Utility.GetRandomAlphaNumString(40);

for (int i = 0; i < 40; i++)
{
    card.Content = str.Substring(0, i);
    Console.WriteLine(card.ToString());
}

这是它印刷的内容:

// [Empty result]
W
W1
W1U
W1UJ
W1UJ2
W1UJ2X
W1UJ2X4
W1UJ2X48
W1UJ2X48B
W1UJ2X48BU
W1UJ2X48BU9
W1UJ2X48BU9A
W1UJ2X48BU9A4
W1UJ2X48BU9A46
W1UJ2X48BU9A46C
W1UJ2X48BU9A46CY
W1UJ2X48BU9A46CYV
W1UJ2X48BU9A46CYVA
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8R
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8

(请注意,它实际上并没有打印“空结果”。我只需要在那里输入内容,否则不会让我用一行空格来启动代码块。)

由于上面的代码工作得很好,我可以说无论你的问题是什么,它都与代码没有任何关系。 (或者,至少,代码。)