简体   繁体   English

尝试捕获无法捕获Java(Android)异常

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

I'm a Java (Android) beginner (coming from Python) and I'm trying to catch an exception using Try-Catch as follows: 我是Java(Android)初学者(来自Python),并且尝试使用Try-Catch捕获异常,如下所示:

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 09-25 10:53:32.147:E / SQLiteDatabase(7991):android.database.sqlite.SQLiteConstraintException:错误代码19:约束失败

Why doesn't it catch the Exception? 为什么它没有捕获到异常? Am I doing something wrong here? 我在这里做错什么了吗? All tips are welcome! 欢迎所有提示!

The save() method looks as follows: save()方法如下所示:

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);
}

There are two classes to catch the problems. 有两个类可以解决问题。

  1. Error 错误
  2. Exception 例外

Both are sub-class of Throwable class. 两者都是Throwable类的子类。 When there is situation we do not know, that particular code block will throw Exception or Error? 当有我们不知道的情况时,该特定代码块将抛出Exception或Error? You can use Throwable . 您可以使用Throwable Throwable will catch both Errors & Exceptions . Throwable将同时捕获ErrorsExceptions

Do this way 这样做

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

约束失败通常表示您做了类似将null值传递到创建表时声明为非null的列之类的操作。

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));
} 

Try 尝试

try {
u.save();

} catch (SQLException sqle) {
Log.wtf("DO THIS", " WHEN SAVE() FAILS");
}catch (Exception e) {
Log.wtf("DO THIS", " WHEN SAVE() FAILS");
}

Log is expecting certain variable-names like verbose(v), debug(d) or info(i). Log期望使用某些变量名,例如verbose(v),debug(d)或info(i)。 Your "wtf" doesnt belong there. 您的“ wtf”不属于那里。 Check this answer for more info --> 检查此答案以获取更多信息->

https://stackoverflow.com/a/10006054/2074990 https://stackoverflow.com/a/10006054/2074990

or this: 或这个:

http://developer.android.com/tools/debugging/debugging-log.html http://developer.android.com/tools/debugging/debugging-log.html

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM