2016-04-27 7 views
0

Ive den folgenden Code in einer Klasse bekam UserRepository genannt, dass löst eine Ausnahme:Java-Ausnahme wird nicht abgefangen?

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

ich es in RegisterActivity.java verwende, wie folgt aus:

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

Ich fangen die Ausnahme So wenn es passiert. Aus irgendeinem Grund wird die Ausnahme jedoch nicht abgefangen.

Irgendwelche Hinweise?

Danke.

EDIT:

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

Ändern von IllegalArgumentException in Throwable –

+0

Ich habe es auch versucht, aber es hat nicht funktioniert –

+0

Haben Sie versucht, Ihre addUser-Methode zu debuggen? –

Antwort

2

Ausnahmen Implementierung und versuchen, fangen sehr schwere Aufgabe ist, und man sollte immer vermeiden mit Versuch fangen. Stattdessen können Sie dasselbe mit einer benutzerdefinierten Schnittstelle implementieren und die Funktion entsprechend Ihren Anforderungen auslösen. Bitte beachten Sie die Beispielcode hier:

public interface CustomInterface { 
    void handleResult(String response); 
} 

Jetzt ist Ihre addUser ändern Methode:

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

Dann endlich, ändern Sie Ihre Methode Saveuser an:

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

Ich hoffe nun, du wirst in der Lage sein, dies zu verstehen.

+0

Gute Antwort pal, danke. Du warst jetzt klarer –

-1

wie diese versuchen:

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

Danke, aber es ist nicht arbeiten –

+0

Kommentar zur Linie throw new Illegal (USER_ALREADY_EXISTS); und diese Linie throw new Illegal (FIREBASE_ERROR); –

+0

Warum? Ich möchte diese Zeilen nicht kommentieren, ich möchte diese Ausnahmen schreiben –