2015-07-22 2 views
1

Моя программа использует BackgroundWorker для вызова метода PerformAction(), когда другой метод, Method1 возвращает true. Я также использую Strategy Pattern для установки правильного PerformAction(), который должен выполняться каждый раз при поднятии события.String.Substring (начало, конец) иногда бросает исключение

Для шаблона стратегии я создал абстрактный класс, а затем класс внутри абстрактного класса, который наследует его.

Public MustInherit Class Abstract 
    Public MustOverride Sub PerformAction(ByVal str as String) 
    Public Class Extends 
      Inherits Abstract 
      Public Overrides Sub PerformAction(ByVal str as String) 
       str = str.Substring(str.IndexOf(":"), str.IndexOf(">")) 
       MsgBox(str) 
      End Sub 
End Class 

Я создаю еще один класс, который содержит поле Abstract, и используется для вызова PerformAction.

Метод PerformAction вызывается из события BackgroundWorker.ReportProgress, которое вызывается, когда BackgroundWorker.DoWork обнаруживает, что Method1 возвращает true. И с кодом выше, он вызывает System.Reflection.TargetInvocationException с информацией о добавлении Исключение было выбрано целью вызова.

отладчик говорит мне:

this Cannot obtain value of local or argument '<this>' as it is not available at this instruction pointer, possibly because it has been optimized away. System.Delegate 

    args Cannot obtain value of local or argument 'args' as it is not available at this instruction pointer, possibly because it has been optimized away. object[] 

Как ни странно, когда я выполняю (что мне кажется) идентичную операцию с двумя подстрок:

s = s.Substring(s.IndexOf(":")) 
s = s.Substring(0, s.IndexOf(">")) 

она функционирует отлично.

В чем разница между этими двумя методами? Неправильно ли установлено мое наследование, и что вызывает эти ошибки? Что тут происходит?

Дайте мне знать, если мне нужно добавить код, чтобы объяснить ситуацию. Благодарю.

+1

Второй аргумент в методе 'SubString' - это длина ** подстроки **, а не индекс последнего символа. – Blackwood

+0

Что-то вроде 's.Substring (s.IndexOf (": "), s.IndexOf ("> ") - s.IndexOf (": "))' или, конечно, назначить 's.IndexOf (": ")' к переменной и использовать это ... – Thraka

ответ

1

Чтобы получить эффект

s = s.Substring(s.IndexOf(":")) 
s = s.Substring(0, s.IndexOf(">")) 

в одном операторе, вам нужно вычислить длину требуемой подстроки

s = s.SubString(s.IndexOf(":"), s.IndexOf(">") - s.IndexOf(":")) 

Обратите внимание, что, если это возможно, что строка не содержит a ":", а затем ">", вам нужно сначала проверить, что IndexOf(":") is> = 0 и что s.IndexOf(">") возвращает значение больше IndexOf(":").

+0

Стреляй. Хорошо, что мои старые корни Java возвращаются, чтобы преследовать меня. Любая идея, почему она выбрасывает 'System.Reflection.TargetInvocationException', а не' IndexOutOfRangeException'? – Django

+0

@ Django Я не знаю, почему это исключение. Я не был уверен, что код, который вы отправили, был вашим фактическим кодом. 's' не объявляется, результат метода SubString игнорируется (не назначается переменной), а элемент' PerformAction' не работает. – Blackwood

+0

Просто скопировал код неправильно, я только что зафиксировал его в сообщении. Исключение возникает в обеих версиях. – Django

Смежные вопросы