数组下标越界问题,

数组下标越界问题,

在指定位置插入数据的时候总提示数组下标越界输入9报错,但是输入8就把原来的9替换成10了:

package com.imooc;

import java.util.Scanner;

public class ArrayManage {
    //插入数据
    public int[] insertData() {
        int[] arr = new int[9];
        Scanner sc = new Scanner(System.in);
        for(int i=0;i<arr.length;i++) {
            System.out.println("请输入第"+ (i+1) + "个数据:");
            int a = sc.nextInt();
            if(a>0){
                arr[i] = a;
            }else{
                System.out.println("请输入正整数!");
                break;
            }
        }
        return arr;
    }
    
    
    //显示数据
    public void showData(int[] arr) {
        //定义数组
        System.out.println("数组元素的内容为: ");
        for(int i = 0; i<arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
    //在指定位置处插入数据
    public void insertAtArray(int[] a , int n, int k){
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入插入的数字: ");
        n = sc.nextInt();
        System.out.println("请输入要插入数字的位置: ");
        k = sc.nextInt();
        for(int i=(a.length-1);i>=k;i--) {
            a[i] = a[i-1];
        }
        a[k] = n;
        
    }
    //查询能被3整除的数据
    public void divThree(int[] a){
        //a = insertData();
        System.out.println("能被3整除的数据为:");
        for(int i=0;i<a.length;i++) {
            if(a[i]%3==0) {
                System.out.print(a[i] + " ");
            }
        }
        System.out.println();
    }
    //提示信息方法
    public void notice() {
        
        System.out.println("*************************");
        System.out.println("     1--插入数据");
        System.out.println("     2--显示所有数据");
        System.out.println("     3--在指定位置处插入数据");
        System.out.println("     4--查询能被3整除的数据");
        System.out.println("     0--退出");
        System.out.println("*************************");
        
    }
    public static void main(String[] args) {
        boolean flag = true;
        ArrayManage am = new ArrayManage();
        int a[] = new int[10];
        // 循环输出操作数组的提示信息
        while(flag){
            //循环调用提示
            am.notice();
            System.out.println("请输入对应数字进行操作: ");
            Scanner sc = new Scanner(System.in);
            int m = sc.nextInt();
            switch(m){
                case 1:
                    //执行1对应的插入数据
                    a = am.insertData();
                    am.showData(a);
                    break;
                case 2:
                    //执行2对应的显示数组的操作
                    am.showData(a);
                    break;
                case 3:
                    //执行3对应的在指定位置插入数据的操作
                    am.insertAtArray(a, m, m);
                    am.showData(a);
                    break;
                case 4:
                    //执行4对应的输出数组中能被三整除的数
                    am.divThree(a);
                    break;
                case 0:
                    //退出程序
                    flag = false;
                    System.out.println("退出程序!");
                    break;
            }
        }
        

    }
    

}

正在回答

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

6回答

1、在insertData方法中,将数组长度修改为10,同时,为了保证只插入9个数据,需要将for循环判断条件修改为arr.length-1。

2、在insertAtArray方法中,for循环的初始值应该是i=a.length-1,而不是i=a.length。


  • 慕粉3838620 提问者 #1
    好的 一直在纠结数组的长度问题 忘了可以调整循环数组的长度 谢谢
    2017-08-03 11:23:58
提问者 慕粉3838620 2017-08-02 14:14:57

package com.imooc;

import java.util.Scanner;

public class ArrayManage {
    //插入数据
    public int[] insertData() {
        int[] arr = new int[9];
        Scanner sc = new Scanner(System.in);
        for(int i=0;i<arr.length;i++) {
            System.out.println("请输入第"+ (i+1) + "个数据:");
            int a = sc.nextInt();
            if(a>0){
                arr[i] = a;
            }else{
                System.out.println("请输入正整数!");
                break;
            }
        }
        return arr;
    }
    
    
    //显示数据
    public void showData(int[] arr) {
        //定义数组
        System.out.println("数组元素的内容为: ");
        for(int i = 0; i<arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
    //在指定位置处插入数据
    public void insertAtArray(int[] a , int n, int k){
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入插入的数字: ");
        n = sc.nextInt();
        System.out.println("请输入要插入数字的位置: ");
        k = sc.nextInt();
        for(int i=a.length;i>k;i--) {
            a[i] = a[i-1];
        }
        a[k] = n;
        
    }
    //查询能被3整除的数据
    public void divThree(int[] a){
        //a = insertData();
        System.out.println("能被3整除的数据为:");
        for(int i=0;i<a.length;i++) {
            if(a[i]%3==0) {
                System.out.print(a[i] + " ");
            }
        }
        System.out.println();
    }
    //提示信息方法
    public void notice() {
        
        System.out.println("*************************");
        System.out.println("     1--插入数据");
        System.out.println("     2--显示所有数据");
        System.out.println("     3--在指定位置处插入数据");
        System.out.println("     4--查询能被3整除的数据");
        System.out.println("     0--退出");
        System.out.println("*************************");
        
    }
    public static void main(String[] args) {
        boolean flag = true;
        ArrayManage am = new ArrayManage();
        int a[] = new int[10];
        // 循环输出操作数组的提示信息
        while(flag){
            //循环调用提示
            am.notice();
            System.out.println("请输入对应数字进行操作: ");
            Scanner sc = new Scanner(System.in);
            int m = sc.nextInt();
            switch(m){
                case 1:
                    //执行1对应的插入数据
                    a = am.insertData();
                    am.showData(a);
                    break;
                case 2:
                    //执行2对应的显示数组的操作
                    am.showData(a);
                    break;
                case 3:
                    //执行3对应的在指定位置插入数据的操作
                    am.insertAtArray(a, m, m);
                    am.showData(a);
                    break;
                case 4:
                    //执行4对应的输出数组中能被三整除的数
                    am.divThree(a);
                    break;
                case 0:
                    //退出程序
                    flag = false;
                    System.out.println("退出程序!");
                    break;
            }
        }
        

    }
    

}

耶嘿呦呦奥 2017-08-02 14:12:26

你把修改过后的代码重新发一遍,我们给你看看。

  • 提问者 慕粉3838620 #1
    重新发了一回,看最新的就行,如果把插入数据方法中的数组长度改成10的话 在选择1的时候就会让你输入10个数的,感觉这样也不对
    2017-08-02 14:16:43
  • 提问者 慕粉3838620 #2
    你好 我的代码已经上传,请帮忙指点一下 谢谢
    2017-08-03 10:24:09
耶嘿呦呦奥 2017-08-02 12:18:39

在你的插入数据方法中,将数组长度修改为10。

  • 提问者 慕粉3838620 #1
    还是报同样的错,搞不懂
    2017-08-02 13:34:02
耶嘿呦呦奥 2017-08-01 18:17:51

在指定位置插入数据方法中,按你的写法,不能将数据插入到数组的第0个位置。

解决方案:将i>=k修改为i>k即可。

如果解决了你的疑惑,请采纳,祝学习愉快~


  • 提问者 慕粉3838620 #1
    试过 还是不行
    2017-08-01 21:45:30
  • 提问者 慕粉3838620 #2
    单独调用3,10被插入最后一个位置,但是调用整个方法时从1开始数组变成9个固定的长度之后 运行到3时如果把10插入最后一个位置就会报错 数组下标越界
    2017-08-01 22:06:32
好帮手慕雪 2017-08-01 17:57:47

测试了你的方法,但没有问题呀,没有你说的越界问题。建议把insertAtArray(int[] a , int n, int k)改成insertAtArray(int[] a),或者把插入的数字,位置提到主方法中。祝:学习愉快

http://img1.sycdn.imooc.com/climg//59804ff90001b65c08610839.jpg

  • 提问者 慕粉3838620 #1
    我这还是不行 不知道哪个地方出了问题
    2017-08-02 09:25:14
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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