修复 Android Studio 中的“Java.lang.NullPointerException”
嘿极客们,今天我们将了解 NullPointerException 的含义以及我们如何在 Android Studio 中修复它。要理解NullPointerException,我们必须理解Null 的含义。
什么是空?
“null”是所有程序员都非常熟悉的关键字。它基本上是引用数据类型或变量(如数组、类、接口和枚举)的字面量。每个原始数据类型都设置了一个默认值(例如:布尔值的 True 和 False 值)。类似地,如果在声明期间未初始化,则引用数据类型变量的默认值为 Null 值。
Java
import java.util.Scanner;
public class Main
{
public static void main(String[] args) {
// we can store null value in to scanner
// object which has not yet been inintialised
Scanner sc = null;
System.out.println(sc);
}
}
Java
import java.util.Scanner;
public class Main
{
public static void main(String[] args) {
int i = null;
System.out.println(i);
}
}
Java
import java.util.Scanner;
public class Main
{
public static void main(String[] args) {
// sc is an object of Scanner calss
// which has not been initialised yet
Scanner sc = null;
// we are trying to access the reference
// variable which is not yet initialised
int input =sc.nextInt();
System.out.println(input);
}
}
Java
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// initialising textview to null
TextView textview = null;
// accessing the reference variable
textview.setText("Hello World");
}
}
Java
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textview = null;
try {
textview.setText("Hello world");
}
catch(Exception e){
Toast.makeText(this,e.getMessage(),Toast.LENGTH_SHORT).show();
}
}
}
Java
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// initialisng the Textview using
// findViewById(R.id.textview) method find
TextView textview = findViewById(R.id.textview);
try {
textview.setText("Hello world");
}
catch(Exception e){
Toast.makeText(this,e.getMessage(),Toast.LENGTH_SHORT).show();
}
}
}
输出:
null
同样重要的是要注意,我们不能直接在原始变量或对象中存储空值,如下所示。
Java
import java.util.Scanner;
public class Main
{
public static void main(String[] args) {
int i = null;
System.out.println(i);
}
}
输出:
Main.java:5: error: incompatible types: cannot be converted to int
int i = null;
^
1 error
什么是空指针异常?
当应用程序或程序尝试访问其中存储有空值的对象引用(访问方法)时,会出现运行时异常。当我们在声明后不初始化时,空值会自动存储在引用变量中,如下所示。
Java
import java.util.Scanner;
public class Main
{
public static void main(String[] args) {
// sc is an object of Scanner calss
// which has not been initialised yet
Scanner sc = null;
// we are trying to access the reference
// variable which is not yet initialised
int input =sc.nextInt();
System.out.println(input);
}
}
输出:
Exception in thread "main" java.lang.NullPointerException
at Main.main(Main.java:6)
Android Studio 中的空指针异常
在下面的屏幕截图中,Android Studio 中的 NullPointerException 以黄色突出显示
从上图可以看出,它包含一个初始化为 null 的 Textview。
TextView textview = null;
TextView 引用变量(即 textview)被访问,它给出了一个 NullPointerException。
textview.setText("Hello world");
代码
Java
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// initialising textview to null
TextView textview = null;
// accessing the reference variable
textview.setText("Hello World");
}
}
在 Android Studio 中处理 NullPointerException
为了顺利处理 NullPointerException 而不会导致应用程序崩溃,我们在 Android 中使用了“Try – Catch Block”。
- Try: Try 块执行一段可能会崩溃的代码或发生异常的地方。
- Catch: Catch 块将顺利处理在 Try 块中发生的异常(在屏幕上显示 Toast msg),而不会让应用程序突然崩溃。
Try -Catch Block 的结构如下图所示
代码
Java
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textview = null;
try {
textview.setText("Hello world");
}
catch(Exception e){
Toast.makeText(this,e.getMessage(),Toast.LENGTH_SHORT).show();
}
}
}
输出:
使用 Try Catch 我们可以捕获屏幕上的异常
如何修复 NullPointerException?
为了避免 NullPointerException,我们必须在 findviewbyid() 方法的帮助下初始化 Textview 组件,如下所示。 findViewbyId() 将组件的“id”值作为参数。此方法有助于定位应用程序中存在的组件。
代码
Java
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// initialisng the Textview using
// findViewById(R.id.textview) method find
TextView textview = findViewById(R.id.textview);
try {
textview.setText("Hello world");
}
catch(Exception e){
Toast.makeText(this,e.getMessage(),Toast.LENGTH_SHORT).show();
}
}
}
输出:
正如您在初始化文本视图组件后所见,我们已经解决了 NullPointerException。因此,通过这种方式,我们可以摆脱 Android Studio 中的 NullPointerException。