“Java:可能尚未初始化变量arr”错误

“Java:可能尚未初始化变量arr”错误

问题描述:

编译这个程序出现“Java:可能尚未初始化变量arr”错误,请问怎么解决呢?

相关代码:

import java.util.Scanner;

public class Application {
    public static void main(String[] args) {
        Application app = new Application();
        ArrayTools at = new ArrayTools();

        while (true){
            app.displayMenu();

            System.out.println("请输入对应的数字进行操作:");
            Scanner scanner = new Scanner(System.in);
            float[] arr;

            int num = scanner.nextInt();
            switch (num){
                case 1:
                    arr = at.initScore();
                case 2:
                    System.out.println("数学平均成绩为:" + at.average(arr));
                case 3:
                    System.out.println("成绩大于85分的人数:" + at.count(arr));
                case 4:
                {
                    System.out.println("修改前:");
                    System.out.println("成绩为:");
                    at.displayAllScore(arr);
                    System.out.println("请输入要修改数据的位置(从0开始):");
                    int index = scanner.nextInt();
                    System.out.println("请输入新数据:");
                    int data = scanner.nextInt();

                    System.out.println("修改后:");
                    System.out.println("成绩为:");
                    at.update(arr, index, data);
                    at.displayAllScore(arr);
                }
            }
        }
    }

    /**
     * 显示主菜单
     */
    public void displayMenu(){
        System.out.println("*******************************************");
        System.out.println("\t\t1--初始化数学成绩");
        System.out.println("\t\t2--求成绩的平均值");
        System.out.println("\t\t3--统计成绩大于85分的人数");
        System.out.println("\t\t4--修改指定位置处的成绩");
        System.out.println("\t\t5--打印输出所有成绩");
        System.out.println("\t\t0--退出");
        System.out.println("*******************************************");
    }
}

相关代码:

import java.util.Scanner;

public class ArrayTools {

/**
* 初始化数组元素,数组的长度和元素均由键盘输入
* @return 返回初始化后的数组
*/
public float[] initScore(){
System.out.println("请输入要存储的数学成绩的数量");
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
float[] arrScore = new float[num];
int count = 1;

for (float e:
arrScore) {
System.out.println("请输入第" + count + "个数据:");
e = sc.nextFloat();
count++;
}
return arrScore;
}

/**
* 求数组中元素的平均值
* @param f 需要处理的数组
* @return 返回平均值
*/
public float average(float[] f){
float sum = 0;
for (float e:
f) {
sum += e;
}

float avg = sum / f.length;
return avg;
}

/**
* 统计成绩大于85分的人数
* @param f 需要统计成绩的数组
* @return 返回符合要求的人数
*/
public int count(float[] f){
int cnt = 0;
for (float e:
f) {
if(e>85){
cnt++;
}
}
return cnt;
}

/**
* 修改数组指定元素的值
* @param f 需要修改的数组
* @param index 需要修改的数组元素下标
* @param newScore 需要的值:新的成绩
*/
public void update(float[] f, int index, float newScore){
f[index] = newScore;
}

/**
* 打印输出数组里所有的成绩
* @param f 数组参数
*/
public void displayAllScore(float[] f){
int count = 0;
for (float e:
f) {
System.out.print(e + "\t");
count++;
if (count == 5){
System.out.println();
count = 0;
}
}
}
}

http://img1.sycdn.imooc.com//climg/611ca4c009c165e208550140.jpg

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小尤 2021-08-18 16:07:52

同学你好,1、在java中无法直接调用未赋值的变量,而代码中arr数组未赋值,直接进行了调用导致出现了编译性异常。如下所示:

http://img1.sycdn.imooc.com//climg/611cbdc30971423512310331.jpg

则建议同学先为arr变量赋值(赋值为null),然后进行调用。如下所示:

http://img1.sycdn.imooc.com//climg/611cbdae09c3756f08960360.jpg

2、建议同学把Scanner对象的创建放在循环外,避免重复创建,占用内存资源。

祝学习愉快!

  • 提问者 李泉成278 #1

    可以了,谢谢老师😀

    2021-08-18 16:32:50
  • 提问者 李泉成278 #2

    老师,这个程序更改之后能正常运行,但是运行之后出现错误。

    下面是运行时出错的截图:

    http://img1.sycdn.imooc.com//climg/611cc98e097c74d814770720.jpg

    以下是Application.java源文件Idea给的警告信息:

    http://img1.sycdn.imooc.com//climg/611cc9e609d6bb5b08650235.jpg

    以下是ArrayTools.java源文件Idea给的警告信息:

    http://img1.sycdn.imooc.com//climg/611cca22098301ca07240067.jpg

    2021-08-18 16:52:08
  • 好帮手慕小尤 回复 提问者 李泉成278 #3

    同学你好,1、java.lang.NullPointerException是空指针异常,是由null调用方法导致的。则建议同学在调用方法前,先判断一下要操作的数组是否为null,如果不为null再进行下一步的操作,如果为null,可以提示用户请先插入数据。修改后得代码如下:

    http://img1.sycdn.imooc.com//climg/611cd327094ad2cb11360570.jpg

    2、执行case1-4会执行下方case中代码,则建议同学在case1-4中添加break。如上图所示:

    3、未成功添加成绩到数组中,则建议同学使用for(int i=0;i<n;i++) 进行循环,然后为数组赋值。如下所示:

    http://img1.sycdn.imooc.com//climg/611cd46f09a832d411610741.jpg

    并将float[] arr = null;书写到循环外,避免将初始化的成绩覆盖为null。

    http://img1.sycdn.imooc.com//climg/611cd486099cc78710330471.jpg

    祝学习愉快!

    2021-08-18 17:37:19
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师