[mono-android] Exception isn't being caught and is killing my app

Jeremy A. Kolb - ARA/NED jkolb at ara.com
Wed Oct 3 16:05:26 UTC 2012


I'm trying to make an update to a content provider with a known bad value like so:

view.FindViewById<Button>(Resource.Id.ok).Click +=
                (o, e) =>
                {
                    ContentValues values = new ContentValues(5);
                    values.Put(MinefieldManagementContract.Personnel.Columns.FirstName, this.View.FindViewById<TextView>(Resource.Id.first_name).Text);
                    values.Put(MinefieldManagementContract.Personnel.Columns.LastName, this.View.FindViewById<TextView>(Resource.Id.last_name).Text);
                    values.Put(MinefieldManagementContract.Personnel.Columns.Role, this.View.FindViewById<TextView>(Resource.Id.role).Text);
                    values.Put(MinefieldManagementContract.Personnel.Columns.Skills, this.View.FindViewById<TextView>(Resource.Id.skills).Text);
                    values.Put(MinefieldManagementContract.Personnel.Columns.CurrentlyActive, this.View.FindViewById<Switch>(Resource.Id.currently_active).Checked);
                    values.Put("123", "your mom");

                    try
                    {
                        if (this.DataId == -1)
                        {
                            // Insert
                            Android.Net.Uri newUri = this.Activity.ContentResolver.Insert(MinefieldManagementContract.Personnel.ContentUri, values);
                            this.DataId = long.Parse(newUri.LastPathSegment);
                        }
                        else
                        {
                            // Update
                            this.Activity.ContentResolver.Update(
                                MinefieldManagementContract.MakeItemUri(MinefieldManagementContract.Personnel.ContentUri, this.DataId),
                                values, null, null);
                        }
                    }
                    catch (Exception ex)
                    {
                        Toast toast = Toast.MakeText(this.Activity, "Failed to update database: \n" + ex.Message, ToastLength.Short);
                        toast.Show();
                    }
                };

Unfortunately this seems to kill the VM:

10-03 12:01:47.487 I/MonoDroid(18173): UNHANDLED EXCEPTION: Android.Database.Sqlite.SQLiteException: Exception of type 'Android.Database.Sqlite.SQLiteException' was thrown.
10-03 12:01:47.487 I/MonoDroid(18173): at Android.Runtime.JNIEnv.CallIntMethod (intptr,intptr,Android.Runtime.JValue[]) [0x00024] in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.7-branch/0e9eea34/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:269
10-03 12:01:47.487 I/MonoDroid(18173): at Android.Database.Sqlite.SQLiteDatabase.Update (string,Android.Content.ContentValues,string,string[]) [0x00054] in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.7-branch/0e9eea34/source/monodroid/src/Mono.Android/platforms/android-15/src/generated/Android.Database.Sqlite.SQLiteDatabase.cs:1812
10-03 12:01:47.487 I/MonoDroid(18173): at MinefieldManagement.Provider.MinefieldDataProvider.Update (Android.Net.Uri,Android.Content.ContentValues,string,string[]) [0x00092] in c:\Projects\MinefieldManagement\MinefieldManagement\MinefieldManagement\Provider\MinefieldDataProvider.cs:111
10-03 12:01:47.487 I/MonoDroid(18173): at Android.Content.ContentProvider.n_Update_Landroid_net_Uri_Landroid_content_ContentValues_Ljava_lang_String_arrayLjava_lang_String_ (intptr,intptr,intptr,intptr,intptr,intptr) [0x0003a] in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.7-branch/0e9eea34/source/monodroid/src/Mono.Android/platforms/android-15/src/generated/Android.Content.ContentProvider.cs:847
10-03 12:01:47.487 I/MonoDroid(18173): at (wrapper dynamic-method) object.ca074a2c-0ca4-400a-8bf2-e1cc207137aa (intptr,intptr,intptr,intptr,intptr,intptr) <IL 0x00024, 0x00073>
10-03 12:01:47.487 I/MonoDroid(18173):
10-03 12:01:47.487 I/MonoDroid(18173):   --- End of managed exception stack trace ---
10-03 12:01:47.487 I/MonoDroid(18173): android.database.sqlite.SQLiteException: near "123": syntax error: , while compiling: UPDATE Personnel SET CurrentlyActive=?,Skills=?,Role=?,FirstName=?,LastName=?,123=? WHERE _id=5
10-03 12:01:47.487 I/MonoDroid(18173):   at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
10-03 12:01:47.487 I/MonoDroid(18173):   at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:68)
10-03 12:01:47.487 I/MonoDroid(18173):   at android.database.sqlite.SQLiteProgram.compileSql(SQLiteProgram.java:143)
10-03 12:01:47.487 I/MonoDroid(18173):   at android.database.sqlite.SQLiteProgram.compileAndbindAllArgs(SQLiteProgram.java:361)
10-03 12:01:47.487 I/MonoDroid(18173):   at android.database.sqlite.SQLiteStatement.acquireAndLock(SQLiteStatement.java:260)
10-03 12:01:47.487 I/MonoDroid(18173):   at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:84)
10-03 12:01:47.487 I/MonoDroid(18173):   at android.database.sqlite.SQLiteDatabase.updateWithOnConflict(SQLiteDatabase.java:1810)
10-03 12:01:47.487 I/MonoDroid(18173):   at android.database.sqlite.SQLiteDatabase.update(SQLiteDatabase.java:1761)
10-03 12:01:47.487 I/MonoDroid(18173):   at minefieldmanagement.provider.MinefieldDataProvider.n_update(Native Method)
10-03 12:01:47.487 I/MonoDroid(18173):   at minefieldmanagement.provider.MinefieldDataProvider.update(MinefieldDataProvider.java:57)
10-03 12:01:47.487 I/MonoDroid(18173):   at android.content.ContentProvider$Transport.update(ContentProvider.java:219)
10-03 12:01:47.487 I/MonoDroid(18173):   at android.content.ContentResolver.update(ContentResolver.java:856)
10-03 12:01:47.487 I/MonoDroid(18173):   at mono.android.view.View_OnClickListenerImplementor.n_onClick(Native Method)
10-03 12:01:47.487 I/MonoDroid(18173):   at mono.android.view.View_OnClickListenerImplementor.onClick(View_OnClickListenerImplementor.java:29)
10-03 12:01:47.487 I/MonoDroid(18173):   at android.view.View.performClick(View.java:3511)
10-03 12:01:47.487 I/MonoDroid(18173):   at android.view.View$PerformClick.run(View.java:14105)
10-03 12:01:47.487 I/MonoDroid(18173):   at android.os.Handler.handleCallback(Handler.java:605)
10-03 12:01:47.487 I/MonoDroid(18173):   at android.os.Handler.dispatchMessage(Handler.java:92)
10-03 12:01:47.487 I/MonoDroid(18173):   at android.os.Looper.loop(Looper.java:137)
10-03 12:01:47.487 I/MonoDroid(18173):   at android.app.ActivityThread.main(ActivityThread.java:4424)
10-03 12:01:47.487 I/MonoDroid(18173):   at java.lang.reflect.Method.invokeNative(Native Method)
10-03 12:01:47.487 I/MonoDroid(18173):   at java.lang.reflect.Method.invoke(Method.java:511)
10-03 12:01:47.487 I/MonoDroid(18173):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
10-03 12:01:47.487 I/MonoDroid(18173):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
10-03 12:01:47.487 I/MonoDroid(18173):   at dalvik.system.NativeStart.main(Native Method)
10-03 12:01:50.847 W/dalvikvm(18173): JNI WARNING: JNI method called with exception pending
10-03 12:01:50.847 W/dalvikvm(18173):              in Lminefieldmanagement/provider/MinefieldDataProvider;.n_update:(Landroid/net/Uri;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;)I (CallObjectMethod)
10-03 12:01:50.847 W/dalvikvm(18173): Pending exception is:
10-03 12:01:50.847 I/dalvikvm(18173): android.database.sqlite.SQLiteException: near "123": syntax error: , while compiling: UPDATE Personnel SET CurrentlyActive=?,Skills=?,Role=?,FirstName=?,LastName=?,123=? WHERE _id=5
10-03 12:01:50.847 I/dalvikvm(18173):   (raw stack trace not found)
10-03 12:01:50.847 I/dalvikvm(18173): "main" prio=5 tid=1 NATIVE
10-03 12:01:50.847 I/dalvikvm(18173):   | group="main" sCount=0 dsCount=0 obj=0x40a74460 self=0x19bb828
10-03 12:01:50.847 I/dalvikvm(18173):   | sysTid=18173 nice=0 sched=0/0 cgrp=default handle=1074939016
10-03 12:01:50.857 I/dalvikvm(18173):   | schedstat=( 1821164000 190583000 1007 ) utm=149 stm=33 core=0
10-03 12:01:50.857 I/dalvikvm(18173):   at minefieldmanagement.provider.MinefieldDataProvider.n_update(Native Method)
10-03 12:01:50.857 I/dalvikvm(18173):   at minefieldmanagement.provider.MinefieldDataProvider.update(MinefieldDataProvider.java:57)
10-03 12:01:50.857 I/dalvikvm(18173):   at android.content.ContentProvider$Transport.update(ContentProvider.java:219)
10-03 12:01:50.857 I/dalvikvm(18173):   at android.content.ContentResolver.update(ContentResolver.java:856)
10-03 12:01:50.857 I/dalvikvm(18173):   at mono.android.view.View_OnClickListenerImplementor.n_onClick(Native Method)
10-03 12:01:50.857 I/dalvikvm(18173):   at mono.android.view.View_OnClickListenerImplementor.onClick(View_OnClickListenerImplementor.java:29)
10-03 12:01:50.857 I/dalvikvm(18173):   at android.view.View.performClick(View.java:3511)
10-03 12:01:50.857 I/dalvikvm(18173):   at android.view.View$PerformClick.run(View.java:14105)
10-03 12:01:50.857 I/dalvikvm(18173):   at android.os.Handler.handleCallback(Handler.java:605)
10-03 12:01:50.857 I/dalvikvm(18173):   at android.os.Handler.dispatchMessage(Handler.java:92)
10-03 12:01:50.857 I/dalvikvm(18173):   at android.os.Looper.loop(Looper.java:137)
10-03 12:01:50.857 I/dalvikvm(18173):   at android.app.ActivityThread.main(ActivityThread.java:4424)
10-03 12:01:50.857 I/dalvikvm(18173):   at java.lang.reflect.Method.invokeNative(Native Method)
10-03 12:01:50.857 I/dalvikvm(18173):   at java.lang.reflect.Method.invoke(Method.java:511)
10-03 12:01:50.857 I/dalvikvm(18173):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
10-03 12:01:50.857 I/dalvikvm(18173):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
10-03 12:01:50.857 I/dalvikvm(18173):   at dalvik.system.NativeStart.main(Native Method)
10-03 12:01:50.857 I/dalvikvm(18173):
10-03 12:01:50.857 E/dalvikvm(18173): VM aborting
10-03 12:01:50.857 I/mono    (18173): Stacktrace:
10-03 12:01:50.857 I/mono    (18173):
10-03 12:01:50.867 I/mono    (18173):   at Android.Runtime.JNIEnv.CallObjectMethod (intptr,intptr) [0x00000] in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.7-branch/0e9eea34/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:129
10-03 12:01:50.867 I/mono    (18173):   at Android.App.Fragment.get_Activity () [0x0002d] in /Users/builder/data/lanes/monodroid-mac-monodroid-4.2.7-branch/0e9eea34/source/monodroid/src/Mono.Android/platforms/android-15/src/generated/Android.App.Fragment.cs:228
10-03 12:01:50.867 I/mono    (18173):   at (wrapper runtime-invoke) <Module>.runtime_invoke_object__this__ (object,intptr,intptr,intptr) <IL 0x00050, 0xffffffff>
At which point I end up in the catch block above and this.Activity is raising a NullReferenceException.  I'm a bit confused as to why the first exception isn't propogating up to the catch block.  My query provider's update looks like:

public override int Update(Android.Net.Uri uri, ContentValues values, string selection, string[] selectionArgs)
        {
            SQLiteDatabase db = this._db.WritableDatabase;
            string table;

            switch(UriMatcher.Match(uri))
            {
                case Personnel:
                    table = MinefieldManagementSqlLiteHelper.Tables.Personnel;
                    break;
                case PersonnelId:
                    table = MinefieldManagementSqlLiteHelper.Tables.Personnel;
                    selection = this.BuildItemWhereClause(uri.LastPathSegment, selection);
                    break;
                case Equipment:
                    table = MinefieldManagementSqlLiteHelper.Tables.Equipment;
                    break;
                case EquipmentId:
                    table = MinefieldManagementSqlLiteHelper.Tables.Equipment;
                    selection = this.BuildItemWhereClause(uri.LastPathSegment, selection);
                    break;
                default:
                    throw new Java.Lang.IllegalArgumentException("Unknown URI " + uri);
            }

            int rowsAffected = db.Update(table, values, selection, selectionArgs); <-- This is where it fails as expected.

            Context.ContentResolver.NotifyChange(uri, null);
            return rowsAffected;
        }
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ximian.com/pipermail/monodroid/attachments/20121003/7fe644b7/attachment-0001.html>


More information about the Monodroid mailing list