【问题标题】:Unhandled exception in ToString overloadToString 重载中未处理的异常
【发布时间】:2017-01-19 08:30:36
【问题描述】:

您好,感谢您的宝贵时间。

我最近决定尝试使用 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 中。

但是,我仍然得到一个未处理的异常。这怎么可能?

编辑: 异常窗口看起来也很奇怪。通常它们看起来像这样。

在填充 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;

    }
}

【问题讨论】:

  • 遇到异常时的输入是什么?
  • 所以您是说当Content 少于20 个字符时,它是否也在if 条件内?如果是,您能否在if 条件上设置断点并检查当时Content.Length 的确切值。
  • 如果 Content.Length 小于 20,我得到了异常。它可以是任何东西。我尝试的最后一次修复,我创建了两个笔记。一个内容为:“asdfghjklqwertyuiopz”,没有引起任何异常。一个内容为:“e”的内容确实导致了异常
  • 您是否在ToString() 中设置了断点并观察到异常发生在您期望的位置?因为似乎没有堆栈跟踪...
  • @MortenToudahl 你说你把断点on ToString,你试过把它in ToString吗?请记住,每次在调试器中显示对象时都会调用 ToString。

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


【解决方案1】:

这是我在 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

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

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

【讨论】:

  • 感谢您带领我朝着正确的方向前进。我不知道到底发生了什么。但这似乎是项目中的一个问题。我删除了该项目,并复制了我编写的所有代码。现在它工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
  • 2018-10-16
  • 2014-06-24
  • 1970-01-01
  • 2011-11-19
  • 1970-01-01
相关资源
最近更新 更多