Есть следующий код:
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)
В таких случаях не NullPointerException
мониторят, а делают проверку на null
:
if (doneView != null) {
// что-то делаем
} else {
// делаем другое
}
Вы не в том потоке и не для тех инструкций ловите ошибку.
Во первых вы ловите ошибку только для синхронных вызовов методов при отправке события в очередь
new Handler().postDelayed(...); //тут поймаются только ошибки метода postDelayed или его аргументов
Во вторых, ошибки, которые будут выброшены в других потоках или коллбэках, т.е. асинхронно, надо ловить в местах их возникновения. Т.е. catch
блок в вашем коде не будет ждать неопределённое время пока выполняться или нет какие-то неизвестные инструкции в неизвестных потоках.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Делаю простенькую игру на JavaПредставление следующее: Имеется JFrame mainFrame;, на нём JPanel menuPanel;, на котором JButton btnToGame;
Установил в Inteliji Idea плагин jFormDesigner и при запуске созданной формы высвечивает ошибки:
Я хочу использовать диалоговое окно в текущем activity, но дело в том,что данный класс уже имеет наследника YouTubeBaseActivity, из-за этого отказывается...