liato / android-bankdroid

A swedish banking application for your Android device.
http://www.swedroid.se/forum/showthread.php?t=11108
Other
242 stars 173 forks source link

AmericanExpress crash when no transactions are available #637

Closed goober closed 7 years ago

goober commented 7 years ago

Bankdroid crashes when there are no transactions available for AmericanExpress.

See TransactionDetails L44

Stacktrace: Fatal Exception: java.lang.RuntimeException: An error occured while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:300) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) at java.util.concurrent.FutureTask.setException(FutureTask.java:222) at java.util.concurrent.FutureTask.run(FutureTask.java:242) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:818) Caused by java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object[] java.util.Collection.toArray()' on a null object reference at java.util.ArrayList.addAll(ArrayList.java:188) at com.liato.bankdroid.banking.banks.americanexpress.model.TransactionDetails.getTransactions(TransactionDetails.java:44) at com.liato.bankdroid.banking.banks.americanexpress.AmericanExpress.transactionsOf(AmericanExpress.java:163) at com.liato.bankdroid.banking.banks.americanexpress.AmericanExpress.fetchTransactionsFor(AmericanExpress.java:157) at com.liato.bankdroid.banking.banks.americanexpress.AmericanExpress.update(AmericanExpress.java:122) at com.liato.bankdroid.DataRetrieverTask.doInBackground(DataRetrieverTask.java:131) at com.liato.bankdroid.DataRetrieverTask.doInBackground(DataRetrieverTask.java:46) at android.os.AsyncTask$2.call(AsyncTask.java:288) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:818)

walles commented 7 years ago

We should have a @Nullable annotation here: https://github.com/liato/android-bankdroid/blob/master/bankdroid-legacy/src/main/java/com/liato/bankdroid/banking/banks/americanexpress/model/AccountActivity.java#L11

And we should fix nullness issues as indicated by Android Studio's excellent Constant conditions and exceptions warning.

goober commented 7 years ago

In this case I prefer to never return null when the return type is a collection. Instead I prefer to return an empty collection. That will remove the need of a null check everywhere where it is used. But I agree with you that we should start using the static code analysis which are available in Android Studio!

walles commented 7 years ago

Yes, fixing the getter to never return null is probably nicer in this particular case.

Android Studio has an excellent set of warnings, but unfortunately I don't know how to run them on CI.