2017-01-19 63 views
5

非常感謝您的時間。ToString超載未處理的異常

我最近決定嘗試使用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

編輯: 例外窗口看起來也werid。通常他們看起來像這樣。 Intentional exception

ToString在填充ListView時被調用,這是在這段代碼中完成的。

[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; 

    } 
} 
+0

當你得到異常時,輸入是什麼? –

+0

所以你說當Content內容少於20個字符時,它也會進入if條件嗎?如果是的話,你可以在'if'條件下放置斷點,並在那個時候檢查'Content.Length'的確切值。 – Amit

+0

如果Content.Length低於20,我會得到異常。它可能是任何東西。我試過的最後一次修復,我創建了兩個筆記。其中一個內容爲:「asdfghjklqwertyuiopz」,它沒有引起任何異常。還有一個內容是:「e」引起異常 –

回答

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 

(請注意,它實際上沒有打印「空結果」。我不得不在那裏輸入一些東西,否則SO不會讓我用一行空格開始代碼塊。)

由於上面的代碼工作得很好,我可以說無論你的問題是什麼,它都不會與代碼無關。 (或者至少,這個代碼。)

+0

感謝您帶領我走向正確的方向。我不知道到底發生了什麼。但這似乎是項目中的一個問題。我刪除了該項目,並複製了我編寫的所有代碼。現在它工作正常。 –