aming12321_ 2023-03-14 11:22 采纳率: 90%
浏览 36
已结题

空指针异常 java.lang,如何解决?

java.lang.NullPointerException
空指针异常 找了半天没找到
有会的指导一下吗
java.lang.NullPointerException

package Search;

import java.io.IOException;
import java.util.Scanner;

public class Chuanyueleichi1 {
/*
* 题目描述
X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,
否则将报废。
某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),
怎样走才能路径最短?

已知的地图是一个方阵,上面用字母标出了A,B区,
其它区都标了正号或负号分别表示正负能量辐射区。
例如:
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -

坦克车只能水平或垂直方向上移动到相邻的区。

输入格式
输入第一行是一个整数n,表示方阵的大小, 4<=n<100
接下来是n行,每行有n个数据,可能是A,B,+,-中的某一个,中间用空格分开。
A,B都只出现一次。
输出格式
要求输出一个整数,表示坦克从A区到B区的最少移动步数。
如果没有方案,则输出-1

样例输入
5
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -
样例输出
10

思想
1.图的广度优先算法 直接算出最短路径所用,数据结构 队列(在chuanyueleichi2中具体实现)
2.图的深度优先算法 遍历所有路径,求出最小路径(具体在本类实现)


步骤
一.建立全局变量
    1.坐标(x,y)
    2.当前区域辐射值
    3.达到该区所走步数
二.输入,初始化节点
    1.找到A区位置,并赋值给dfs入口
三.dfs建立
    1.注意回溯
*/
public static String[][] arr  = new String[101][101] ;
public static int n = 0;//雷区大小
public static int x =0,y =0;
public static int min = 0;//记录到达B区最小步数
public static int[][] visit =  new int[101][101];//标记已走过的雷区 初始值为0 表示都没走过
public static int []fx = {1,0,-1,0};
public static int []fy = {0,-1,0,-1};//表示移动方向分别是 下 右 上 左
public static void main(String[] args) throws NumberFormatException, IOException {
    // TODO Auto-generated method stub
    
    Scanner sc = new Scanner(System.in);
     n = sc.nextInt();//雷区大小
    int a = 0,b=0;
    //arr = new String[n+1][n+1];
    //visit = new int[n+1][n+1];
    for(int i = 1 ; i <= n; i++) {
        for(int j = 1 ; j<= n ;j++) {
            arr[i][j] = sc.next();
            
            if(arr[i][j].equals("A")) {
                a = i;
                b = j;
            }
        }
    }
    dfs(a,b,"o",0);
    System.out.println(min);
}

//输入为坐标  当前的状态(+,-,A,B),当前的步数
private static void dfs(int x, int y, String status, int step) {
    // TODO Auto-generated method stub
    if(arr[x][y].equals("B")) {
        min = Math.min(step, min);
        return ;
    }
    
    int x1 = 0 ,y1 = 0;//表示移动的坐标
    for(int i = 0 ; i < 4 ;i++) {
        x1 = x +fx[i];
        y1 = y +fy[i];
        //判断接下来的雷区是否符合要求 且没有重复
        if( is(x1,y1,x,y)&&visit[x1][y1]!=1) {
            //符合的话 标记 已访问
            visit[x1][y1]=1;
            dfs(x1,y1,arr[x1][y1],step+1);//进入递归
            //当前递归结束 访问标记位取消 以免 访问不到B区(如果有B 区的话)
            visit[x1][y1]=0;
        }
    }
    
    
}

private static boolean is(int x1, int y1,int x,int y) {
    // TODO Auto-generated method stub
    if(x1 >= 0&& x1 <= n && y1 >= 0&& y1 <=n&&arr[x1][y1]!=arr[x][y])
        return true;
    return false;
}

}

Exception in thread "main" java.lang.NullPointerException
at BlueCup/Search.Chuanyueleichi1.dfs(Chuanyueleichi1.java:90)
at BlueCup/Search.Chuanyueleichi1.dfs(Chuanyueleichi1.java:103)
at BlueCup/Search.Chuanyueleichi1.dfs(Chuanyueleichi1.java:103)
at BlueCup/Search.Chuanyueleichi1.dfs(Chuanyueleichi1.java:103)
at BlueCup/Search.Chuanyueleichi1.dfs(Chuanyueleichi1.java:103)
at BlueCup/Search.Chuanyueleichi1.main(Chuanyueleichi1.java:83)

  • 写回答

4条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-03-14 14:52
    关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • threenewbee 2023-03-14 11:27
    关注

    调试,调试看看出现错误的行,检查变量对象存在null

    评论
  • 黑洞晓威 Java领域新星创作者 2023-03-14 11:34
    关注

    以下是几种可能的解决方案:

    确认空引用的来源:首先,需要找到代码中引起空指针异常的行。可以使用调试器或添加打印语句来确定空引用的来源。

    空引用检查:在调用方法或访问属性之前,检查变量是否为null。可以使用条件语句(例如if语句)来检查变量是否为空。

    使用可空类型:如果变量可能为空,则可以使用可空类型,如Optional类。

    初始化变量:确保变量在使用之前已经初始化,并且没有为null。

    确认方法返回值:如果调用方法返回一个值,需要确认该方法是否可能返回null,并在调用方法之前检查返回值是否为空。

    避免使用非受检异常:非受检异常(例如NullPointerException)不需要在方法签名中声明,因此容易被忽略。为了防止出现此类异常,可以使用安全的编程实践,并在方法签名中声明受检异常。

    使用断言:可以在代码中使用断言来确保变量不为null。例如,可以使用assert语句来检查变量是否为空。

    评论 编辑记录
  • MarkHan_ 2023-03-14 11:48
    关注

    该回答引用GPTᴼᴾᴱᴺᴬᴵ
    空指针异常(java.lang.NullPointerException)通常是由于对空对象(null)执行某些操作引起的。在你的代码中,可以有几种可能的情况:

    1.没有正确初始化所有的数组或变量。
    在你的代码中,arr和visit数组都被定义了,但没有赋初值,所以在访问它们时可能会出现空指针异常。你可以在main函数前为它们初始化:

    for(int i = 0 ; i<= 100 ; i++){
        Arrays.fill(arr[i],"");
        Arrays.fill(visit[i],0);
    }
    
    
    

    2.在使用变量之前没有检查它们是否为空。
    在你的代码中,你没有检查变量x1和y1是否为空就使用它们,所以如果它们为空,你就会得到空指针异常。你可以在使用变量之前检查它们是否为空:

        if(x1 >=1 && x1 <= n && y1 >=1 && y1 <= n && !status.equals(arr[x1][y1]) && arr[x1][y1]!="") {
            //符合的话 标记 已访问
            visit[x1][y1]=1;
            dfs(x1,y1,arr[x1][y1],step+1);//进入递归
            //当前递归结束 访问标记位取消 以免 访问不到B区(如果有B 区的话)
            visit[x1][y1]=0;
        }
    
    
    

    3.使用空对象的方法。
    在你的代码中,你调用了Scanner类的nextInt()方法,但你没有检查是否有输入。如果没有输入,nextInt()方法将返回空对象,引发空指针异常。你可以在调用nextInt()方法之前检查是否有输入:

    if (sc.hasNextInt()) {
        n = sc.nextInt();
    }
    
    
    

    根据你的代码,可能会有其他问题。如果你仍然遇到问题,可以提供更多细节或更完整的代码,以便我们更好地帮助你。

    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 3月29日
  • 已采纳回答 3月21日
  • 创建了问题 3月14日

悬赏问题

  • ¥15 微信实时共享位置修改
  • ¥100 TG的session协议号转成直登号号后客户端登录几分钟后自动退出设备
  • ¥30 共模反馈回路的小信号增益
  • ¥15 arduino ssd1306函数与tone函数放歌代码不兼容问题
  • ¥70 0.96版本hbase的row_key里含有双引号,无法deleteall
  • ¥15 Jupyter怎么一行一行运行
  • ¥20 Ida Pro增加插件出现问题
  • ¥15 诊断性META分析合并效能的检验
  • ¥15 请问abb根据色块判断奇偶数并根据批次号放入仓储
  • ¥15 .Net Core Winfrom 承载SignalR