Самопроизвольное закрытие программы
Пишу лабораторную работу в MonoDevelop на C#. ОС: XFCE Ubuntu 18.04
Программа представляет собой MDI приложение. Есть главное окно с двумя кнопками "ADD" и "VIEW". Каждая из которых введет на открытие другого окна.
Код главного (MainWindow) окна.
public partial class MainWindow : Gtk.Window
{
public MainWindow() : base(Gtk.WindowType.Toplevel)
{
Build();
}
protected void OnDeleteEvent(object sender, DeleteEventArgs a)
{
Application.Quit();
a.RetVal = true;
}
protected void OnAddBtnClicked(object sender, EventArgs e)
{
AddWindow addWindow = new AddWindow();
}
protected void OnViewBtnClicked(object sender, EventArgs e)
{
}
}
Вот код из контроллера окна AddWindow.
namespace Lab
{
public partial class AddWindow : Gtk.Window
{
public AddWindow() :
base(Gtk.WindowType.Toplevel)
{
this.Build();
}
//debugLbl.Text = va.ToString();
//AccsRepo.addAcc(va);
//VisitAccount va = AccountFabric.getClient();
protected void OnAddButtonClicked(object sender, EventArgs e)
{
//debugLbl.Text = va.ToString();
}
}
}
Пока в нем закомментированы все строчки, то при нажатии на кнопку на кнопку все проходит нормально -> следующая форма открывается и все работает.
Но мне требуется, чтобы при нажатии на кнопку в окне AddWindow на кнопку ADD (к нему привязан "signal" OnAddBtnClicked) создавалась фабрика аккаунтов(по условию записи посещения в спортзале), чтобы при нажатии на кнопку в эту фабрику передавались данные из полей и создавался объект.
Но при раскомментировании любой из строчек в контроллере окна AddWindow, при попытке открыть это окно программа закрывается, останавливая даже процесс выполнения. Пока застопорился на этом моменте, т.к. раньше это не вызывало проблем, и поэтому прошу помощи здесь.
Ответы (1 шт):
Сам уже разобрался. Я не знал, где в MonoDevelop консоль отладки. А спряталась она в правом нижнем углу и называлась Application Output.
Во время падения программы появлялся стек вызовов, последним методом которого было получение типа тренировки.
Exception in Gtk# callback delegate
Note: Applications can use GLib.ExceptionManager.UnhandledException to handle the exception.
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.IndexOutOfRangeException: Index was outside the bounds of the array.
at Lab.beans.Types.getType (System.Int32 index) [0x00000] in <639f95d02a3d4baf974c1a089a1dd3b3>:0
at Lab.beans.VisitAccount.defineType () [0x00000] in <639f95d02a3d4baf974c1a089a1dd3b3>:0
at Lab.beans.VisitAccount..ctor (System.String clientSurname, System.String trainerSurname, System.Int32 code, System.DateTime startTraining, System.Int32 minutes, System.Int32 tariff) [0x00033] in <639f95d02a3d4baf974c1a089a1dd3b3>:0
at Lab.beans.AccountFabric.getClient () [0x00000] in <639f95d02a3d4baf974c1a089a1dd3b3>:0
at Lab.AddWindow..ctor () [0x00000] in <639f95d02a3d4baf974c1a089a1dd3b3>:0
at MainWindow.OnAddBtnClicked (System.Object sender, System.EventArgs e) [0x00000] in <639f95d02a3d4baf974c1a089a1dd3b3>:0
at (wrapper managed-to-native) System.Reflection.RuntimeMethodInfo.InternalInvoke(System.Reflection.RuntimeMethodInfo,object,object[],System.Exception&)
at System.Reflection.RuntimeMethodInfo.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x0006a] in <ab4b6f8474df465bb9c200aa76d63763>:0
--- End of inner exception stack trace ---
at System.Reflection.RuntimeMethodInfo.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00083] in <ab4b6f8474df465bb9c200aa76d63763>:0
at System.Delegate.DynamicInvokeImpl (System.Object[] args) <0x7ff97dc52330 + 0x0028d> in <ab4b6f8474df465bb9c200aa76d63763>:0
at System.MulticastDelegate.DynamicInvokeImpl (System.Object[] args) <0x7ff97dc57390 + 0x0008e> in <ab4b6f8474df465bb9c200aa76d63763>:0
at System.Delegate.DynamicInvoke (System.Object[] args) <0x7ff97dc52200 + 0x00030> in <ab4b6f8474df465bb9c200aa76d63763>:0
at GLib.Signal.ClosureInvokedCB (System.Object o, GLib.ClosureInvokedArgs args) [0x0003e] in <6b18dc2e94c64faa9ddba710ad41aaa1>:0
at GLib.SignalClosure.Invoke (GLib.ClosureInvokedArgs args) [0x00011] in <6b18dc2e94c64faa9ddba710ad41aaa1>:0
at GLib.SignalClosure.MarshalCallback (System.IntPtr raw_closure, System.IntPtr return_val, System.UInt32 n_param_vals, System.IntPtr param_values, System.IntPtr invocation_hint, System.IntPtr marshal_data) [0x00089] in <6b18dc2e94c64faa9ddba710ad41aaa1>:0
at GLib.ExceptionManager.RaiseUnhandledException (System.Exception e, System.Boolean is_terminal) [0x00000] in <6b18dc2e94c64faa9ddba710ad41aaa1>:0
at GLib.SignalClosure.MarshalCallback (System.IntPtr raw_closure, System.IntPtr return_val, System.UInt32 n_param_vals, System.IntPtr param_values, System.IntPtr invocation_hint, System.IntPtr marshal_data) [0x00000] in <6b18dc2e94c64faa9ddba710ad41aaa1>:0
at Gtk.Application.gtk_main () [0x00000] in <5d30aa7866714e1487744c851412cb95>:0
at Gtk.Application.Run () [0x00000] in <5d30aa7866714e1487744c851412cb95>:0
at Lab.MainClass.Main (System.String[] args) [0x00000] in <639f95d02a3d4baf974c1a089a1dd3b3>:0
Тип тренировки у меня хранился в массиве. А при создании тестового аккаунта я передавал в конструктор пустые/нулевые/null значения. И вот в том месте, где должен был передаваться код от 1 до 5, я передавал 0. Из-за этого индекс выходил за пределы массива.
А я всего лишь не знал, где находится консоль отладки...