📌  相关文章
📜  修复 Android Studio 中的“Java.lang.NullPointerException”

📅  最后修改于: 2022-05-13 01:54:54.863000             🧑  作者: Mango

修复 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”值作为参数。此方法有助于定位应用程序中存在的组件。

解决空指针异常

带有 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 后的输出

正如您在初始化文本视图组件后所见,我们已经解决了 NullPointerException。因此,通过这种方式,我们可以摆脱 Android Studio 中的 NullPointerException。