Ne peut pas attraper Java (Android), à l'Exception try-catch
Je suis un Java (Android) débutant (venant de Python) et je suis en train d'essayer d'attraper une exception à l'aide de Try-Catch comme suit:
try {
u.save();
} catch (Exception e) {
Log.wtf("DO THIS", " WHEN SAVE() FAILS");
}
À ma grande surprise, je ne vois pas mon message de Log, mais j'ai toujours l'erreur suivante:
09-25 10:53:32.147: E/SQLiteDatabase(7991):
android.la base de données.sqlite.SQLiteConstraintException: erreur code 19:
contrainte échoué
Pourquoi ne pas intercepter l'Exception? Suis-je en train de faire quelque chose de mal ici? Tous les conseils sont les bienvenus!
La méthode save() se présente comme suit:
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);
}
Avez-vous vu votre message de log?
Non, je ne vois pas le message d'erreur. (ajouté à ma question).
Essayez de remplacer "wtf" avec un "e" - vous devriez alors voir votre message. Il n'y a rien de mal avec votre try/catch. À moins que l'u.méthode save déjà intercepte l'exception et qu'il gère
Pouvez-vous nous montrer le
peut-être l'exception est pris à l'intérieur de votre
Non, je ne vois pas le message d'erreur. (ajouté à ma question).
Essayez de remplacer "wtf" avec un "e" - vous devriez alors voir votre message. Il n'y a rien de mal avec votre try/catch. À moins que l'u.méthode save déjà intercepte l'exception et qu'il gère
Pouvez-vous nous montrer le
save
méthode?peut-être l'exception est pris à l'intérieur de votre
save
méthode
OriginalL'auteur kramer65 | 2013-09-25
Vous devez vous connecter pour publier un commentaire.
Il y a deux classes pour attraper les problèmes.
Les deux sont des sous-classes de Throwable classe. Quand il y a de la situation, nous ne savons pas, ce bloc de code va lever une Exception ou une Erreur? Vous pouvez utiliser Throwable. Throwable va attraper les deux Erreurs & Exceptions.
Faire de cette façon
Il a le sens parfait + ce juste sauvé ma journée Merci!
Astuce: si vous avez de la "java.lang.NullPointerException" dans votre code, utilisez la "printStackTrace()" méthode ci-dessus, juste comme dans l'exemple. Il jetait une lumière au-dessus de vos problèmes.
OriginalL'auteur Biraj Zalavadia
Contrainte échec indique généralement que vous avez fait quelque chose comme passer un
null
valeur dans une colonne que vous déclarez ne pasnull
lorsque vous créez votre table.Cette réponse est en effet utile, mais il ne résout pas à ma question. Si vous voyez la méthode save (), sauriez-vous comment faire pour intercepter l'erreur?
OriginalL'auteur Jitesh Dalsaniya
faire de cette façon
OriginalL'auteur Mobifly
Essayer
OriginalL'auteur LMK
Journal s'attend à certaines variables-des noms comme détaillé(v), debug(d) ou d'informations(i).
Votre "wtf" ne pas y être. Cochez cette réponse pour plus d'info -->
https://stackoverflow.com/a/10006054/2074990
ou ceci:
http://developer.android.com/tools/debugging/debugging-log.html
LOL! maintenant que c'est drôle 🙂
OriginalL'auteur bofredo