2016-04-27 193 views
0

從來就得到了在一個名爲UserRepository類下面的代碼,拋出異常:Java異常未被捕獲?

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

所以我捕捉異常,如果發生。 但是,由於某種原因,例外情況未被捕獲

任何提示?

謝謝。

編輯

Here's我的堆棧跟蹤:

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 
+1

將IllegalArgumentException更改爲Throwable –

+0

我也試過,但它沒有工作 –

+0

您是否嘗試過調試addUser方法? –

回答

2

實施例外,並嘗試捕捉非常重的任務,每個人都應該避免使用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 
       } 
      }); 
} 

我希望現在你會能夠理解這一點。

+0

好的答案朋友,謝謝。你現在已經更清楚了 –

-1

嘗試這樣的:

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();; 
        } 
       } 
      }); 
     } 
+0

謝謝,但它不起作用 –

+0

評論此行拋出新的IllegalArgumentException(USER_ALREADY_EXISTS);並且該行引發新的IllegalArgumentException(FIREBASE_ERROR); –

+0

爲什麼?我不想評論這條線,我想拋出異常 –