Почему throws не обрабатывается?

187
10 октября 2017, 02:29

Есть следующий код:

DefaultAnimationComposer.java

public class DefaultAnimationComposer implements AnimationComposer{
    private ArrayList<AnimationAction> animationCollection = new ArrayList<>();
    private volatile boolean  isWorking = true;
    @Override
    public void addAnimation(AnimationAction animation){
        animationCollection.add(animation);
        animation.subscribe(this);
        animation.setDelay();
    }
    @Override
    public void onAnimationEnded(AnimationAction animation){
        try{
            new Handler().postDelayed(() -> animationCollection.get(animationIndex + 1).executeAction(), delay);
        }catch(NullPointerException ex){
            ex.printStackTrace();
            onAnimationEnded(animationCollection.get(animationIndex + 1));
        }
    }
}

SomeClass.java

animationComposer.addAnimation(new AnimationAction(){
                @Override
                public void executeAction() throws NullPointerException{
                        doneView.setAlpha(1f);
                        doneView.setSpeed(0.7f);
                        doneView.playAnimation();
                        Log.d(TESTING_TAG, "executeAction()2 in RegisterFragment");
                        doneView.addAnimatorListener(new ExecuteNextAfterEndListener(animationComposer, this));
                }
                @Override
                public void setDelay(){
                    delay = 100;
                }
            });

При пересоздании экрана doneView становится Null. Соот-но метод setAlpha() должен выбрасывать NullPointerException, а эта ошибка должна обрабатываться в onAnimationEnded() в классе DefaultAnimationComposer, однако этого почему-то не происходит.

UPD:

Обновил код, однако все равно не работает.

animationComposer.addAnimation(new AnimationAction(){
            @Override
            public void executeAction() throws NullPointerException{
                try{
                    doneView.setAlpha(1f);
                    doneView.setSpeed(0.7f);
                    doneView.playAnimation();
                    Log.d(TESTING_TAG, "executeAction()2 in RegisterFragment");
                    doneView.addAnimatorListener(new ExecuteNextAfterEndListener(animationComposer, this));
                }catch(NullPointerException ex){
                    subject.onAnimationEnded(this);
                }
            }
            @Override
            public void setDelay(){
                delay = 100;
            }
        });

Stacktrace

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setAlpha(float)' on a null object reference
                                                                                at android.view.View$2.setValue(View.java:20818)
                                                                                at android.view.View$2.setValue(View.java:20815)
                                                                                at android.animation.PropertyValuesHolder$FloatPropertyValuesHolder.setAnimatedValue(PropertyValuesHolder.java:1288)
                                                                                at android.animation.ObjectAnimator.animateValue(ObjectAnimator.java:981)
                                                                                at android.animation.ValueAnimator.animationFrame(ValueAnimator.java:1384)
                                                                                at android.animation.ValueAnimator.doAnimationFrame(ValueAnimator.java:1427)
                                                                                at android.animation.ValueAnimator$AnimationHandler.doAnimationFrame(ValueAnimator.java:759)
                                                                                at android.animation.ValueAnimator$AnimationHandler$1.run(ValueAnimator.java:801)
                                                                                at android.view.Choreographer$CallbackRecord.run(Choreographer.java:860)
                                                                                at android.view.Choreographer.doCallbacks(Choreographer.java:672)
                                                                                at android.view.Choreographer.doFrame(Choreographer.java:605)
                                                                                at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:846)
                                                                                at android.os.Handler.handleCallback(Handler.java:742)
                                                                                at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                at android.os.Looper.loop(Looper.java:157)
                                                                                at android.app.ActivityThread.main(ActivityThread.java:5549)
                                                                                at java.lang.reflect.Method.invoke(Native Method)
                                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:742)
                                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:632)
Answer 1

В таких случаях не NullPointerException мониторят, а делают проверку на null:

    if (doneView != null) {
        // что-то делаем
    } else {
        // делаем другое
    }
Answer 2

Вы не в том потоке и не для тех инструкций ловите ошибку.

  1. Во первых вы ловите ошибку только для синхронных вызовов методов при отправке события в очередь

    new Handler().postDelayed(...); //тут поймаются только ошибки метода postDelayed или его аргументов
    
  2. Во вторых, ошибки, которые будут выброшены в других потоках или коллбэках, т.е. асинхронно, надо ловить в местах их возникновения. Т.е. catch блок в вашем коде не будет ждать неопределённое время пока выполняться или нет какие-то неизвестные инструкции в неизвестных потоках.

READ ALSO
Как cменить JPanel на лету?

Как cменить JPanel на лету?

Делаю простенькую игру на JavaПредставление следующее: Имеется JFrame mainFrame;, на нём JPanel menuPanel;, на котором JButton btnToGame;

398
Ошибки в JFormDesigner плагине

Ошибки в JFormDesigner плагине

Установил в Inteliji Idea плагин jFormDesigner и при запуске созданной формы высвечивает ошибки:

212
Без AppCompatActivity метод отказывается работать

Без AppCompatActivity метод отказывается работать

Я хочу использовать диалоговое окно в текущем activity, но дело в том,что данный класс уже имеет наследника YouTubeBaseActivity, из-за этого отказывается...

252