top of page

What are the best practices in Kotlin to avoid crashes in Android apps

What are the best practices in Kotlin to avoid crashes in Android apps

In the world of Android app development, crashes are an unfortunate reality. No matter how well you write your code, there's always a chance that something unexpected will happen on a user's device, leading to a crash. These crashes can result in a poor user experience, negative reviews, and lost revenue. To build robust Android apps, it's crucial to not only prevent crashes but also monitor and report them when they occur.

In this blog post, we'll explore how to avoid crashes in Android apps using Kotlin and how to report crashes using Finotes, a powerful APM tool.

Avoiding Crashes

1. Null Safety with Kotlin

Kotlin, as a modern programming language, brings a significant advantage to Android development - null safety. Null pointer exceptions (NPEs) are one of the most common causes of app crashes. Kotlin's null safety features, such as nullable types and safe calls, help you prevent NPEs at compile time.

Here's an example of how to use nullable types:

var name: String? = null // Declare a nullable String
name?.length // Safe call: returns null if 'name' is null

By using nullable types and safe calls, you can catch potential null references early in the development process.

2. Exception Handling

While you can't always prevent exceptions, you can handle them gracefully to avoid app crashes. Use try-catch blocks to catch exceptions and provide a fallback or error message to the user.

For example:

try {
    // Code that might throw an exception
} catch (e: Exception) {
    // Handle the exception, e.g., log it or display an error message

By handling exceptions properly, you can prevent crashes and provide a better user experience.

3. Defensive Programming

Adopt defensive programming practices by validating inputs, using assertions, and adding proper checks throughout your code. For instance, when accessing an array or list, ensure that you're within the bounds to avoid index out of bounds exceptions.

val list = listOf(1, 2, 3)
if (index >= 0 && index < list.size) {
    val item = list[index]
    // Use 'item' safely
} else {
    // Handle the out-of-bounds condition

4. Robust API Calls

When making network requests or interacting with external services, always assume that the network may fail or the data may be invalid. Implement retry mechanisms, timeouts, and data validation to handle unexpected scenarios gracefully.

Reporting Crashes with Finotes

Even with the best preventative measures, crashes may still occur. When they do, it's essential to gather detailed information about the crash to diagnose and fix the issue. Finotes is a powerful tool for crash reporting and analysis.

1. Integrating Finotes into Your App

To get started, sign up for a Finotes account. Then, add the Finotes SDK to your Android project. You can do this by adding the following dependency to your app's build.gradle file:

dependencies {
    implementation 'com.finotes:finotescore:x.x.x'

Initialize Finotes in your app's Application class:


class MyApplication : Application() {
    override fun onCreate() {

2. Capturing and Reporting Crashes

Finotes automatically captures crashes and unhandled exceptions in your app. When a crash occurs, it collects valuable information, including the stack trace, device details, and user actions leading up to the crash.

You can also manually report non-fatal errors and exceptions using the following code:

try {
    // Code that might throw a non-fatal exception
} catch (e: Exception) {
    Fn.reportException(this, e, Severity.MAJOR)

For more on how to use Finotes to detect crashes and other issues like memory leak and frame rate issues, check the Finotes documentation at

3. Analyzing Crash Reports

Once crashes are reported to Finotes, you can log in to your Finotes dashboard to view and analyze crash reports. Finotes provides detailed insights into the root cause of crashes, enabling you to prioritize and fix issues quickly. You can see stack traces, device information, and the activity trail of the user that led to the crash.


Building crash-resilient Android apps is a critical aspect of delivering a positive user experience. By following best practices in Kotlin for avoiding crashes and integrating crash reporting and analysis tools like Finotes, you can significantly reduce the impact of crashes on your app and ensure that your users have a smooth and trouble-free experience.

Remember that continuous monitoring and improvement are essential for maintaining the reliability of your Android app.


Blog for Mobile App Developers, Testers and App Owners


This blog is from Finotes Team. Finotes is a lightweight mobile APM and bug detection tool for iOS and Android apps.

In this blog we talk about iOS and Android app development technologies, languages and frameworks like Java, Kotlin, Swift, Objective-C, Dart and Flutter that are used to build mobile apps. Read articles from Finotes team about good programming and software engineering practices, testing and QA practices, performance issues and bugs, concepts and techniques. 

bottom of page