Java异常未被捕获?
我在一个名为Java异常未被捕获?,java,android,oop,exception,try-catch,Java,Android,Oop,Exception,Try Catch,我在一个名为UserRepository的类中得到了以下代码,该类引发了一个异常: public void addUser(final User user) throws IllegalArgumentException { final String encodedUserId = Email.encodeID(user.getEmail().getAddress()); firebaseUsersRef.child(encodedUserId).addList
UserRepository
的类中得到了以下代码,该类引发了一个异常:
public void addUser(final User user) throws IllegalArgumentException {
final String encodedUserId = Email.encodeID(user.getEmail().getAddress());
firebaseUsersRef.child(encodedUserId).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
if (snapshot.exists()) {
throw new IllegalArgumentException(USER_ALREADY_EXISTS);
} else {
Firebase firebaseUserReference = firebaseRef.child(USERS_TABLE).child(encodedUserId);
firebaseUserReference.setValue(user);
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
throw new IllegalArgumentException(FIREBASE_ERROR);
}
});
}
我在RegisterActivity.java
中使用它,如下所示:
public void saveUser(){
saveUserToDb();
}
private void saveUser(User user) {
boolean savedUser = false;
try {
userRepository.addUser(user);
savedUser = true;
} catch (IllegalArgumentException iae) {
if (iae.getMessage().equals(UserRepository.USER_ALREADY_EXISTS)) {
showToast(getResources().getString(R.string.user_already_exists));
} else if (iae.getMessage().equals(UserRepository.FIREBASE_ERROR)) {
showToast(getResources().getString(R.string.firebase_error));
}
} finally {
if (savedUser) {
showToast(getResources().getString(R.string.new_user_created));
}
}
}
public void addUser(final User user) {
final String encodedUserId = Email.encodeID(user.getEmail().getAddress());
firebaseUsersRef.child(encodedUserId).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
if (snapshot.exists()) {
try {
throw new IllegalArgumentException(USER_ALREADY_EXISTS);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
} else {
Firebase firebaseUserReference = firebaseRef.child(USERS_TABLE).child(encodedUserId);
firebaseUserReference.setValue(user);
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
try {
throw new IllegalArgumentException(FIREBASE_ERROR);
} catch (IllegalArgumentException e) {
e.printStackTrace();;
}
}
});
}
因此,如果发生异常,我将捕获异常但是,由于某些原因,未捕获异常
有什么提示吗
谢谢
编辑:
这是我的stacktrace:
04-27 09:56:34.984 4741-4741/app E/AndroidRuntime: FATAL EXCEPTION: main
Process: app, PID: 4741
java.lang.IllegalArgumentException: User already exists
at app.repository.UserRepository$1.onDataChange(UserRepository.java:33)
at com.firebase.client.Query$1.onDataChange(Query.java:144)
at com.firebase.client.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:56)
at com.firebase.client.core.view.DataEvent.fire(DataEvent.java:45)
at com.firebase.client.core.view.EventRaiser$1.run(EventRaiser.java:38)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
04-27 09:57:39.773 4741-4747/app W/art: Suspending all threads took: 6.473ms
试着这样做:
public void saveUser(){
saveUserToDb();
}
private void saveUser(User user) {
boolean savedUser = false;
try {
userRepository.addUser(user);
savedUser = true;
} catch (IllegalArgumentException iae) {
if (iae.getMessage().equals(UserRepository.USER_ALREADY_EXISTS)) {
showToast(getResources().getString(R.string.user_already_exists));
} else if (iae.getMessage().equals(UserRepository.FIREBASE_ERROR)) {
showToast(getResources().getString(R.string.firebase_error));
}
} finally {
if (savedUser) {
showToast(getResources().getString(R.string.new_user_created));
}
}
}
public void addUser(final User user) {
final String encodedUserId = Email.encodeID(user.getEmail().getAddress());
firebaseUsersRef.child(encodedUserId).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
if (snapshot.exists()) {
try {
throw new IllegalArgumentException(USER_ALREADY_EXISTS);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
} else {
Firebase firebaseUserReference = firebaseRef.child(USERS_TABLE).child(encodedUserId);
firebaseUserReference.setValue(user);
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
try {
throw new IllegalArgumentException(FIREBASE_ERROR);
} catch (IllegalArgumentException e) {
e.printStackTrace();;
}
}
});
}
实现异常和try-catch是一项非常繁重的任务,应该始终避免使用try-catch。相反,您可以使用自定义接口实现相同的功能,并根据您的需求触发该功能。请参见此处的示例代码:
public interface CustomInterface {
void handleResult(String response);
}
现在将addUser方法更改为:
public void addUser(final User user, CustomInterface customInterface){
final String encodedUserId = Email.encodeID(user.getEmail().getAddress());
firebaseUsersRef.child(encodedUserId).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
if (snapshot.exists()) {
customInterface.handleResult(USER_ALREADY_EXISTS); // I assume this is String
} else {
Firebase firebaseUserReference = firebaseRef.child(USERS_TABLE).child(encodedUserId);
firebaseUserReference.setValue(user);
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
customInterface.handleResult(FIREBASE_ERROR); // I assume this is String
}
});
}
最后,将saveUser方法更改为:
private void saveUser(User user) {
boolean savedUser = false;
userRepository.addUser(user, new CustomInterface() {
@Override
public void handleResult(String response) {
if (response.equals(UserRepository.USER_ALREADY_EXISTS)) {
showToast(getResources().getString(R.string.user_already_exists));
} else if (response.equals(UserRepository.FIREBASE_ERROR)) {
showToast(getResources().getString(R.string.firebase_error));
}
// And Do whatever you want to do, here in this method
}
});
}
我希望您现在能够理解这一点。将IllegalArgumentException更改为Throwable我也尝试过,但它不起作用-只是一个建议-
IllegalArgumentException
是s的运行时异常。当程序中存在阻止其正常运行的错误时,通常会使用运行时异常。通常,运行时异常并不意味着要捕获和处理。为了实现更好的设计,请创建您自己的异常类并将其传播到应用程序的下一层。您可以发布运行程序时获得的准确错误输出吗?不,如果您按照Yasir下面的回答进行操作,则不必这样做。我认为这将是一个更好的方法。其思想是onDataChange函数将仅由addUser以外的对象调用,因此在调用addUser时无法捕获其异常;这行抛出新的IllegalArgumentException(FIREBASE_错误);为什么?我不想评论这些行,我想抛出那些异常你也可以在那里处理异常,而不使用try-catchMaybe,但我不想在那里处理它,只要这不是classGood-Response朋友的职责,谢谢。你现在更清楚了