Can't catch Java (Android) Exception with try-catch

41,977

Solution 1

There are two classes to catch the problems.

  1. Error
  2. Exception

Both are sub-class of Throwable class. When there is situation we do not know, that particular code block will throw Exception or Error? You can use Throwable. Throwable will catch both Errors & Exceptions.

Do this way

try {
    u.save();
} catch (Throwable e) {
    e.printStackTrace();
}

Solution 2

do this way

try {
    // do some thing which you want in try block
} catch (JSONException e) {
    e.printStackTrace();
    Log.e("Catch block", Log.getStackTraceString(e));
} 

Solution 3

Constraint failed usually indicates that you did something like pass a null value into a column that you declare as not null when you create your table.

Share:
41,977
kramer65
Author by

kramer65

Updated on September 21, 2020

Comments

  • kramer65
    kramer65 over 3 years

    I'm a Java (Android) beginner (coming from Python) and I'm trying to catch an exception using Try-Catch as follows:

    try {
        u.save();
    } catch (Exception e) {
        Log.wtf("DO THIS", " WHEN SAVE() FAILS");
    }
    

    To my surprise I don't see my Log message but I still get the following error:

    09-25 10:53:32.147: E/SQLiteDatabase(7991): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed

    Why doesn't it catch the Exception? Am I doing something wrong here? All tips are welcome!

    The save() method looks as follows:

    public final void save() {
        final SQLiteDatabase db = Cache.openDatabase();
        final ContentValues values = new ContentValues();
    
        for (Field field : mTableInfo.getFields()) {
            final String fieldName = mTableInfo.getColumnName(field);
            Class<?> fieldType = field.getType();
    
            field.setAccessible(true);
    
            try {
                Object value = field.get(this);
    
                if (value != null) {
                    final TypeSerializer typeSerializer = Cache.getParserForType(fieldType);
                    if (typeSerializer != null) {
                        // serialize data
                        value = typeSerializer.serialize(value);
                        // set new object type
                        if (value != null) {
                            fieldType = value.getClass();
                            // check that the serializer returned what it promised
                            if (!fieldType.equals(typeSerializer.getSerializedType())) {
                                Log.w(String.format("TypeSerializer returned wrong type: expected a %s but got a %s",
                                        typeSerializer.getSerializedType(), fieldType));
                            }
                        }
                    }
                }
    
                // TODO: Find a smarter way to do this? This if block is necessary because we
                // can't know the type until runtime.
                if (value == null) {
                    values.putNull(fieldName);
                }
                else if (fieldType.equals(Byte.class) || fieldType.equals(byte.class)) {
                    values.put(fieldName, (Byte) value);
                }
                else if (fieldType.equals(Short.class) || fieldType.equals(short.class)) {
                    values.put(fieldName, (Short) value);
                }
                else if (fieldType.equals(Integer.class) || fieldType.equals(int.class)) {
                    values.put(fieldName, (Integer) value);
                }
                else if (fieldType.equals(Long.class) || fieldType.equals(long.class)) {
                    values.put(fieldName, (Long) value);
                }
                else if (fieldType.equals(Float.class) || fieldType.equals(float.class)) {
                    values.put(fieldName, (Float) value);
                }
                else if (fieldType.equals(Double.class) || fieldType.equals(double.class)) {
                    values.put(fieldName, (Double) value);
                }
                else if (fieldType.equals(Boolean.class) || fieldType.equals(boolean.class)) {
                    values.put(fieldName, (Boolean) value);
                }
                else if (fieldType.equals(Character.class) || fieldType.equals(char.class)) {
                    values.put(fieldName, value.toString());
                }
                else if (fieldType.equals(String.class)) {
                    values.put(fieldName, value.toString());
                }
                else if (fieldType.equals(Byte[].class) || fieldType.equals(byte[].class)) {
                    values.put(fieldName, (byte[]) value);
                }
                else if (ReflectionUtils.isModel(fieldType)) {
                    values.put(fieldName, ((Model) value).getId());
                }
                else if (ReflectionUtils.isSubclassOf(fieldType, Enum.class)) {
                    values.put(fieldName, ((Enum<?>) value).name());
                }
            }
            catch (IllegalArgumentException e) {
                Log.e(e.getClass().getName(), e);
            }
            catch (IllegalAccessException e) {
                Log.e(e.getClass().getName(), e);
            }
        }
    
        if (mId == null) {
            mId = db.insert(mTableInfo.getTableName(), null, values);
        }
        else {
            db.update(mTableInfo.getTableName(), values, "Id=" + mId, null);
        }
    
        Cache.getContext().getContentResolver()
                .notifyChange(ContentProvider.createUri(mTableInfo.getType(), mId), null);
    }