Kotlin has a powerful type system that helps developers avoid one of the most common problems in programming: Null Pointer Exceptions. In many languages like Java, trying to use a variable that holds null can cause a NullPointerException (NPE), which can crash your application if not handled properly. This kind of bug has cost time and money in the software industry, which is why it's sometimes called the "billion-dollar mistake." To prevent this, Kotlin's compiler makes you clearly specify whether a variable can be null or not. If you try to use a variable that could be null without checking it, Kotlin won't let you compile the code. However, Kotlin can still throw a NullPointerException in a few specific cases.
When Can Kotlin Throw a NullPointerException?
Even though Kotlin is made to prevent Null Pointer Exceptions, it might still be thrown in these cases:
- When you explicitly throw a NullPointerException().
- If you use the !! operator on a variable that turns out to be null.
- If you try to use an object before it has been properly initialized.
- When you use Java code from Kotlin, which doesn't have the same null safety rules.
Nullable and Non-Nullable Types in Kotlin
Kotlin type system has distinguish two types of references that can hold null (nullable references) and those that can not (non-null references).
A variable of type String can not hold null. If we try to assign null to the variable, it gives compiler error.
var s1: String = "Geeks"
s1 = null // This causes a compile-time error
The code above will not compile because s1 is declared as a non-nullable String. If you want a variable to hold a null value, you must explicitly mark it as nullable using a question mark ? after the type.
var s2: String? = "GeeksforGeeks"
s2 = null // This is allowed
println(s2)
Now that s2 is a nullable string (String?), it can safely hold either a string or null.
When you're working with non-nullable variables, you can safely access their properties without any issues:
val length = s1.length
However, if you try to access properties of a nullable variable like this:
val length = s2.length
The compiler will show an error, because s2 might be null. You need to handle this case safely.
Kotlin program of non-nullable type:
Kotlin
fun main(){
// variable is declared as non-nullable
var s1 : String = "Geeks"
//s1 = null // gives compiler error
print("The length of string s1 is: "+s1.length)
}
Output:
The length of string s1 is: 5
Here, if we try to assign null to a non-nullable variable then it gives compiler time error. But, if we try to access the length of the string then it guarantees not to throw NullPointerException.
Kotlin program of nullable type:
Kotlin
fun main() {
// variable is declared as nullable
var s2: String? = "GeeksforGeeks"
s2 = null // no compiler error
println(s2.length) // compiler error because string can be null
}
Output:
Error:(8, 15) Kotlin: Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?
Here, we can easily assign null to a nullable type variable. But we should use the safe operator to get the length of the string.
Checking for Null with if Statement
The most common way of checking null reference is using if-else expression. We can explicitly check if variable is null, and handle the two options separately.
Kotlin program of checking null in conditions:
Kotlin
fun main() {
// variable declared as nullable
var s: String? = "GeeksforGeeks"
println(s)
if (s != null) {
println("String of length ${s.length}")
} else {
println("Null string")
}
// assign null
s = null
println(s)
if (s != null) {
println("String of length ${s.length}")
} else {
println("Null String")
}
}
Output:
GeeksforGeeks
String of length 13
null
Null String
Note that we have used if-else block to check the nullability. If string contains null then it executes the if block else it executes the else block.
Safe Call operator(?.)
Using if statements can become repetitive. Kotlin offers a special operator called the safe call operator, written as ?.. This operator lets you access properties or call functions only if the object is not null. If it’s null, the whole expression simply returns null.
The following expression:
firstName?.toUpperCase()
is equivalent to:
if(firstName != null) firstName.toUpperCase()
else null
Kotlin program of using safe operator:
Kotlin
fun main() {
var firstName: String? = "Praveen"
var lastName: String? = null
println(firstName?.toUpperCase()) // Prints "PRAVEEN"
println(firstName?.length) // Prints 7
println(lastName?.toUpperCase()) // Prints null
}
Output:
PRAVEEN
7
null
let() Function with Safe Calls
Kotlin's let function works nicely with safe calls. You can use it to perform an operation only if the value is not null.
val firstName: String? = null
firstName?.let {
println(it.toUpperCase())
}
Since firstName is null, the block inside let will not run.
Kotlin program of using let:
Kotlin
fun main() {
// created a list contains names
var stringlist: List<String?> = listOf("Geeks","for", null, "Geeks")
// created new list
var newlist = listOf<String?>()
for (item in stringlist) {
// executes only for non-nullable values
item?.let { newlist = newlist.plus(it) }
}
// to print the elements stored in newlist
for (items in newlist) {
println(items)
}
}
Output:
Geeks
for
Geeks
Using also() with Safe Calls
Sometimes you want to do something with the value like printing it out before processing. The also() function is useful here. You can combine it with let() or use it on its own.
Kotlin
fun main() {
// created a list contains names
var stringlist: List<String?> = listOf("Geeks","for", null, "Geeks")
// created new list
var newlist = listOf<String?>()
for (item in stringlist) {
// executes only for non-nullable values
item?.let { newlist = newlist.plus(it) }
item?.also{it -> println(it)}
}
}
Output:
Geeks
for
Geeks
run() Function for Nullable Variables
Kotlin has a run() method to execute some operation on a nullable reference. It seems to be very similar to let() but inside of a function body, the run() method operates only when we use this reference instead of a function parameter:
Kotlin
fun main() {
// created a list contains names
var stringlist: List<String?> = listOf("Geeks","for", null, "Geeks")
// created new list
var newlist = listOf<String?>()
for (item in stringlist) {
// executes only for non-nullable values
item?.run { newlist = newlist.plus(this) } // this reference
item?.also{it -> println(it)}
}
}
Output:
Geeks
for
Geeks
Elvis Operator(?:)
The Elvis operator is used to return a non-null value or a default value when the original variable is null. In other words, if left expression is not null then elvis operator returns it, otherwise it returns the right expression. The right-hand side expression is evaluated only if the left-hand side found to be null.
The following expression:
val name = firstName ?: "Unknown"
is equivalent to:
val name = if(firstName!= null)
firstName
else
"Unknown"
Moreover, we can also use throw and return expressions on the right side of Elvis operator and it is very useful in functions. Hence, we can throw an exception instead of returning a default value in the right side of Elvis operator.
val name = firstName ?: throw IllegalArgumentException("Name cannot be null")
Kotlin program of using Elvis operator:
Kotlin
fun main() {
var str : String? = "GeeksforGeeks"
println(str?.length)
str = null
println(str?.length ?: "-1")
}
Output:
13
-1
Not-Null Assertion Operator !!
If you're absolutely sure that a value is not null, you can use the !! operator. However, use it carefully. If the value is null, this will throw a KotlinNullPointerException.
Kotlin program of using Not-Null operator:
Kotlin
fun main() {
var str: String? = "GeeksforGeeks"
println(str!!.length) // OK
str = null
println(str!!.length) // Throws exception
}
Output:
13
Exception in thread "main" kotlin.KotlinNullPointerException at FirstappKt.main(firstapp.kt:8)
Similar Reads
Kotlin Tutorial
This Kotlin tutorial is designed for beginners as well as professional, which covers basic and advanced concepts of Kotlin programming language. In this Kotlin tutorial, you'll learn various important Kotlin topics, including data types, control flow, functions, object-oriented programming, collecti
4 min read
Overview
Introduction to Kotlin
Kotlin is a statically typed, general-purpose programming language developed by JetBrains, which has built world-class IDEs like IntelliJ IDEA, PhpStorm, Appcode, etc. It was first introduced by JetBrains in 2011 as a new language for the JVM. Kotlin is an object-oriented language, and a better lang
4 min read
Kotlin Environment setup for Command Line
To set up a Kotlin environment for the command line, you need to do the following steps:Install the Java Development Kit (JDK): Kotlin runs on the Java virtual machine, so you need to have the JDK installed. You can download the latest version from the official Oracle website.Download the Kotlin com
2 min read
Kotlin Environment setup with Intellij IDEA
Kotlin is a statically typed, general-purpose programming language developed by JetBrains that has built world-class IDEs like IntelliJ IDEA, PhpStorm, Appcode, etc. It was first introduced by JetBrains in 2011. Kotlin is object-oriented language and a better language than Java, but still be fully i
2 min read
Hello World program in Kotlin
Hello, World! It is the first basic program in any programming language. Let's write the first program in the Kotlin programming language. The "Hello, World!" program in Kotlin: Open your favorite editor, Notepad or Notepad++, and create a file named firstapp.kt with the following code. // Kotlin He
2 min read
Basics
Kotlin Data Types
The most fundamental data type in Kotlin is the Primitive data type and all others are reference types like array and string. Java needs to use wrappers (java.lang.Integer) for primitive data types to behave like objects but Kotlin already has all data types as objects.There are different data types
3 min read
Kotlin Variables
In Kotlin, every variable should be declared before it's used. Without declaring a variable, an attempt to use the variable gives a syntax error. The declaration of the variable type also decides the kind of data you are allowed to store in the memory location. In case of local variables, the type o
2 min read
Kotlin Operators
Operators are the symbols that operate on values to perform specific mathematical or logical computations on given values. They are the foundation of any programming language. Example:Kotlinfun main(args: Array<String>) { var a= 10 + 20 println(a) }Output:30Explanation: Here, â+â is an additio
4 min read
Kotlin Standard Input/Output
In this article, we will discuss how to take input and how to display the output on the screen in Kotlin. Kotlin standard I/O operations are performed to flow a sequence of bytes or byte streams from an input device, such as a Keyboard, to the main memory of the system and from main memory to an out
4 min read
Kotlin Type Conversion
Type conversion (also called as Type casting) refers to changing the entity of one data type variable into another data type. As we know Java supports implicit type conversion from smaller to larger data types. An integer value can be assigned to the long data type. Example: Javapublic class Typecas
2 min read
Kotlin Expression, Statement and Block
Every Kotlin program is made up of parts that either calculate values, called expressions, or carry out actions, known as statements. These parts can be organized into sections called blocks. Table of ContentKotlin ExpressionKotlin StatementKotlin BlockKotlin ExpressionAn expression in Kotlin is mad
4 min read
Control Flow
Kotlin if-else expression
Decision Making in programming is similar to decision-making in real life. In programming too, a certain block of code needs to be executed when some condition is fulfilled. A programming language uses control statements to control the flow of execution of a program based on certain conditions. If t
4 min read
Kotlin while loop
In programming, loop is used to execute a specific block of code repeatedly until certain condition is met. If you have to print counting from 1 to 100 then you have to write the print statement 100 times. But with help of loop you can save time and you need to write only two lines.While loopIt cons
2 min read
Kotlin do-while loop
Like Java, the do-while loop is a control flow statement that executes a block of code at least once without checking the condition, and then repeatedly executes the block, or not, depending on a Boolean condition at the end of the do-while block. It contrasts with the while loop because the while l
2 min read
Kotlin for loop
In Kotlin, the for loop is equivalent to the foreach loop of other languages like C#. Here for loop is used to traverse through any data structure that provides an iterator. It is used very differently then the for loop of other programming languages like Java or C. The syntax of the for loop in Kot
4 min read
Kotlin when expression
In Kotlin, when replaces the switch operator of other languages like Java. A certain block of code needs to be executed when some condition is fulfilled. The argument of when expression compares with all the branches one by one until some match is found. After the first match is found, it reaches to
6 min read
Kotlin Unlabelled break
When we are working with loops and want to stop the execution of loop immediately if a certain condition is satisfied, in this case, we can use either break or return expression to exit from the loop. In this article, we will discuss learn how to use break expression to exit a loop. When break expre
4 min read
Kotlin labelled continue
In this article, we will learn how to use continue in Kotlin. While working with a loop in programming, sometimes, it is desirable to skip the current iteration of the loop. In that case, we can use the continue statement in the program. continue is used to repeat the loop for a specific condition.
4 min read
Functions
Kotlin functions
In Kotlin, functions are used to encapsulate a piece of behavior that can be executed multiple times. Functions can accept input parameters, return values, and provide a way to encapsulate complex logic into reusable blocks of code. Table of ContentWhat are Functions?Example of a FunctionTypes of Fu
7 min read
Kotlin Default and Named argument
In most programming languages, we need to specify all the arguments that a function accepts while calling that function, but in Kotlin, we need not specify all the arguments that a function accepts while calling that function, so it is one of the most important features. We can get rid of this const
7 min read
Kotlin Recursion
In this tutorial, we will learn about Kotlin Recursive functions. Like other programming languages, we can use recursion in Kotlin. A function that calls itself is called a recursive function, and this process of repetition is called recursion. Whenever a function is called then there are two possib
3 min read
Kotlin Tail Recursion
In a traditional recursion call, we perform our recursive call first, and then we take the return value of the recursive call and calculate the result. But in tail recursion, we perform the calculation first, and then we execute the recursive call, passing the results of the current step to the next
2 min read
Kotlin Lambdas Expressions and Anonymous Functions
In this article, we are going to learn lambdas expression and anonymous function in Kotlin. While syntactically similar, Kotlin and Java lambdas have very different features. Lambdas expression and Anonymous function both are function literals means these functions are not declared but passed immedi
6 min read
Kotlin Inline Functions
In Kotlin, higher-order functions and lambda expressions are treated like objects. This means they can use up memory, which can slow down your program. To help with this, we can use the 'inline' keyword. This keyword tells the compiler not to create separate memory spaces for these functions. Instea
5 min read
Kotlin infix function notation
In this article, we will learn about infix notation used in Kotlin functions. In Kotlin, a function marked with infix keyword can also be called using infix notation means calling without using parenthesis and dot. There are two types of infix function notation in KotlinTable of ContentStandard libr
5 min read
Kotlin Higher-Order Functions
Kotlin language has superb support for functional programming. Kotlin functions can be stored in variables and data structures, passed as arguments to and returned from other higher-order functions. Higher-Order FunctionIn Kotlin, a function that can accept a function as a parameter or return a func
6 min read
Collections
Kotlin Collections
In Kotlin, collections are used to store and manipulate groups of objects or data. There are several types of collections available in Kotlin, including:Collection NameDescriptionLists Ordered collections of elements that allow duplicates.Sets Unordered collections of unique elements.Maps Collection
6 min read
Kotlin list : Arraylist
The ArrayList class is used to create a dynamic array in Kotlin. Dynamic array states that we can increase or decrease the size of an array as a prerequisite. It also provides read and write functionalities. ArrayList may contain duplicates and is non-synchronized in nature. We use ArrayList to acce
6 min read
Kotlin list : listOf()
In Kotlin, listOf() is a function that is used to create an immutable list of elements. The listOf() function takes a variable number of arguments and returns a new list containing those arguments. Here's an example: Kotlin val numbers = listOf(1, 2, 3, 4, 5) In this example, we create a new list ca
8 min read
Kotlin Set : setOf()
In Kotlin, a Set is a generic unordered collection of elements that does not allow duplicate elements. Kotlin provides two main types of sets:Immutable Set: Created using setOf() â supports only read-only operations.Mutable Set: Created using mutableSetOf() â supports both read and write operations.
4 min read
Kotlin hashSetOf()
In Kotlin, a HashSet is a generic, unordered collection that holds unique elements only. It does not allow duplicates and provides constant-time performance for basic operations like add, remove, and contains, thanks to its internal hashing mechanism. The hashSetOf() function in Kotlin creates a mut
4 min read
Kotlin Map : mapOf()
In Kotlin, a Map is a collection that stores data in key-value pairs. Each key in a map is unique, and the map holds only one value for each key. If a key is repeated, only the last value is retained.Kotlin distinguishes between:Immutable maps (mapOf()) - read-onlyMutable maps (mutableMapOf()) - rea
5 min read
Kotlin Hashmap
In Kotlin, a HashMap is a collection that stores key-value pairs, where each key must be unique, but values can be duplicated. It is a hash table based implementation of the MutableMap interface. Map keys are unique and the map holds only one value for each key. It is represented as HashMap<key,
7 min read
OOPs Concept
Kotlin Class and Objects
In Kotlin, classes and objects are used to represent objects in the real world. A class is a blueprint for creating objects (a particular data structure), providing initial values for state (member variables or fields), and implementations of behavior (member functions or methods). An object is an i
4 min read
Kotlin Nested class and Inner class
In Kotlin, you can define a class inside another class. Such classes are categorized as either nested classes or inner classes, each with different behavior and access rules.Nested ClassA nested class is a class declared inside another class without the inner keyword. By default, a nested class does
3 min read
Kotlin Setters and Getters
Properties are an important part of any programming language. In Kotlin, we can define properties in the same way as we declare another variable. Kotlin properties can be declared either as mutable using the var keyword or as immutable using the val keyword. Syntax of Property var <propertyName
5 min read
Kotlin | Class Properties and Custom Accessors
The basic and most important idea of a class is Encapsulation. It is a property to encapsulate code and data, into a single entity. In Java, the data are stored in the fields and these are mostly private. So, accessor methods - a getter and a setter are provided to let the clients of the given class
2 min read
Kotlin Constructor
A constructor is a special member function that is invoked when an object of the class is created primarily to initialize variables or properties. A class needs to have a constructor and if we do not declare a constructor, then the compiler generates a default constructor. Kotlin has two types of co
7 min read
Kotlin Visibility Modifiers
In Kotlin, visibility modifiers are used to control the visibility of a class, its members (properties, functions, and nested classes), and its constructors. The following are the visibility modifiers available in Kotlin: private: The private modifier restricts the visibility of a member to the cont
6 min read
Kotlin Inheritance
Kotlin supports inheritance, which allows you to define a new class based on an existing class. The existing class is known as the superclass or base class, and the new class is known as the subclass or derived class. The subclass inherits all the properties and functions of the superclass, and can
10 min read
Kotlin Interfaces
In Kotlin, an interface is a collection of abstract methods and properties that define a common contract for classes that implement the interface. An interface is similar to an abstract class, but it can be implemented by multiple classes, and it cannot have state. Interfaces are custom types provid
7 min read
Kotlin Data Classes
We often create classes to hold some data in it. In such classes, some standard functions are often derivable from the data. In Kotlin, this type of class is known as data class and is marked as data. Example of a data : data class Student(val name: String, val roll_no: Int) The compiler automatical
4 min read
Kotlin Sealed Classes
Kotlin introduces a powerful concept that doesn't exist in Java: sealed classes. In Kotlin, sealed classes are used when you know in advance that a value can only have one of a limited set of types. They let you create a restricted class hierarchy, meaning all the possible subclasses are known at co
4 min read
Kotlin Abstract class
In Kotlin, an abstract class is a class that cannot be instantiated and is meant to be subclassed. An abstract class may contain both abstract methods (methods without a body) and concrete methods (methods with a body). An abstract class is used to provide a common interface and implementation for i
5 min read
Enum Classes in Kotlin
In programming, sometimes there arises a need for a type to have only certain values. To accomplish this, the concept of enumeration was introduced. Enumeration is a named list of constants. In Kotlin, like many other programming languages, an enum has its own specialized type, indicating that somet
5 min read
Kotlin extension function
Kotlin gives the programmer the ability to add more functionality to the existing classes, without inheriting them. This is achieved through a feature known as extensions. When a function is added to an existing class it is known as Extension Function. To add an extension function to a class, define
5 min read
Kotlin generics
Generics are the powerful features that allow us to define classes, methods and properties which are accessible using different data types while keeping a check on the compile-time type safety. Creating parameterized classes - A generic type is a class or method that is parameterized over types. We
6 min read