精华内容
下载资源
问答
  • 数组下标越界异常代码
    2021-12-03 20:14:04

    引言

    最近突然想到当数组array有2个元素,而访问其array[2]时会不会编译错误的问题,答案是编译的时候不报错,只有运行的时候才报错。

    感悟

    以下是我测试用的代码,程序可以正常编译,且编译正确,只是在运行的时候出现程序崩溃。

        char array[2] = {'2','3'};
        std::cout<<array[2]<<std::endl;//编译正常,运行的时候出现问题
    

    基于上述现象,说明程序在编译的时候没有进行下标越界的检查,当一个程序生成可执行文件的时候,总共经过四步:预处理,编译。汇编,链接。编译的时候进行代码的优化,语法分析,但未进行下标越界检查。

    更多相关内容
  • java 数组下标越界异常(ArrayIndexOutOfBoundsException) java 数组下标越界异常(ArrayIndexOutOfBoundsException)
  • 编写程序,捕获并处理数组越界异常。 1、定义长度为10的数组,并赋初始值。 2、数组下标从0到10循环遍历数组,输出数组元素的值。 3、使用异常处理语句检测上述输出语句,控制程序正常退出 (1)然后在捕获处理时...

    前言

    一、任务介绍

    1.任务描述

    编写程序,捕获并处理数组越界异常。
    1、定义长度为10的数组,并赋初始值。
    2、数组下标从0到10循环遍历数组,输出数组元素的值。
    3、使用异常处理语句检测上述输出语句,控制程序正常退出
    (1)然后在捕获处理时调用toString方法,实现以下运行效果。
    在这里插入图片描述
    (2)当满足产生异常对象条件时,结合throw抛出一个具体的由异常信息构建的ArrayIndexOutOfBoundsException异常对象。
    然后在捕获处理时调用toString方法。
    实现以下运行效果
    在这里插入图片描述

    2.运行结果

    如上所示

    3.任务目标

     学会利用try…catch…finally处理异常,控制程序正常退出。
     掌握调用异常类的toString、getMessage、printStackTrace
    相关方法输出异常信息。
     掌握用异常信息组合成字符串再构造具体异常对象,然后结合throw将异常对象抛出的方法。

    4.实现思路

    1、数组越界异常(IndexOutOfBoundsException)是运行时异常,程序员是可以不处理的,虚拟机可以处理,但处理的结果是非正常退出。故本题希望通过程序员自己处理,以便用来控制程序正常退出。
    2、怎么处理呢?在整个输出数组的过程中,每一次访问数组元素,如果数组下标越界都可能出问题。我们想要的结果是只要第一次越界就报相应的异常信息,结束数组的整个访问。那就应该把整个for循环放到try中,结合catch进行捕捉处理。
    3、如果只是要控制正常退出,那完全不用自定义异常类,因为Java里本身就有ArrayIndexOutOfBoundsException。
    4、要获得一个具体的ArrayIndexOutOfBoundsException异常类对象,就需要调用ArrayIndexOutOfBoundsException异常类的有参构造方法,该方法接收一个字符串作为参数,那么我们就可以在发生异常时将引发异常的当前下标i和当前数组的长度值组合成一个串去构造就行。

    二、程序实现

    1.代码

    public class Main {
    
        public static void main(String[] args) {
            int[] a=new int[10] ;
            int i;
            for(i=0; i<10; i++)
                a[i] =i;
    
            try{
                for(i=0; i<=10; i++) {
                    if(i>=a.length){
                        throw new ArrayIndexOutOfBoundsException("当前要访问下标为:"+i+",数组长度为"+a.length+",发生数组越界异常");
                    }
                    else{
                        System.out.print(a[i]+" ");
                    }
                }
    
            }
            catch(ArrayIndexOutOfBoundsException e){
                System.out.println();
                System.out.println(e.toString());
            }
            finally {
                System.out.println("由程序员负责处理越界异常");
    
    
    
    

    2.实验结果(输出结果)

    在这里插入图片描述

    三、总结

    1. 如果在try里在数组遍历后写throw无法正确达到实验要求结果输出异常,因为异常后面的语句不会再执行
    2. 解决方法:加上判断语句,如果判断为异常直接抛出,如果不是就正常输出
    展开全文
  • 数组下标越界是一个编程初学者最容易犯的错误。 以一个简单的一维数组为例: int a[10];这是一个整型的数组a,有10个元素:a[0]-a[9],因为正确的下标应该是从0开始,到9结束,与生活习惯中的1-10不一样,于是...

    数组下标越界是一个编程初学者最容易犯的错误。

    以一个简单的一维数组为例:

    • int a[10];这是一个整型的数组a,有10个元素:a[0]-a[9],因为正确的下标应该是从0开始,到9结束,与生活习惯中的1-10不一样,于是产生一个a[10]的错误,即数组下标越界。

    • c和c++语言中数组下标越界,编译器是不会检查出错误的,但是实际上后果可能会很严重,比如程序崩溃等,所以在日常的编程中,程序员应当养成良好的编程习惯,避免这样的错误发生。

    • 若编辑网页时提示“数组下标越界”,除检查下上述问题外,再检查下文件中变量名称是否一致,很多时候是变量名称不一致所致,使用的角标大于等于数组的长度或为负数!

    一. 异常示例

    对于刚开始学习Java的大部分人来说,在使用数组的过程中,经常会遇到数组下标越界的异常。下面以一个实际案例来给大家进行说明:

    public class ArrayTest {
        public static void main(String[] args) {
            int[] numbers = {1, 2, 3, 4, 5};
            int number = numbers[5];
            System.out.println(number);
        }
    }

    运行上面的程序,会出现如下异常:

    Exception in thread "mainjava.lang.ArrayIndexOutOfBoundsException: 5
            at ArrayTest.main(ArrayTest.java:4)

    二. 解决思路

    很多初学者遇到异常时通常都不会查看异常信息,而是通过看代码来找出原因。当然,在代码很少的情况下,这是可以的。但这样会形成一个不良的习惯:在后续编码的过程中经常忽视异常信息,直接在编码中查找异常,在代码很多的情况下,找出异常的效率极低,还可能无法找到异常引发的原因。

    正确解决异常的方式应该是首先查看异常信息,比如该案例中出现了ArrayIndexOutOfBoundsException 异常,这是一个数组下标超出范围的异常,也就是业内人士常说的数组下标越界。这个异常出现的位置如下:

    at ArrayTest.main(ArrayTest.java:4)

    由这一行异常信息确定。也就是在 ArrayTest 这个类的第4行出现了数组下标越界异常。那么去查看第4行代码:

    int number = numbers[5];

    既然是数组下标越界,那就是说访问数组 numbers 中下标为5的元素时,出现的异常。说明这里的下标5超出了数组 numbers 的下标范围。而数组 numbers 的定义如下:

    int[] numbers = {1, 2, 3, 4, 5};

    由此可以看出,数组 numbers 的下标取值范围是0~4。而在使用过程中用了下标5,因此造成了数组下标越界异常。

    为什么这里下标的取值范围是0~4, 这是由数组的基本特性决定的,这些都是基础知识,这块儿薄弱的同学可以在网上查阅资料进行学习,比如千锋教育官网就有一些免费的学习资料,当然你也可以在B站上找到这套资料,完全免费,为初学者打牢基础提供的一些干货。

    扫码开始学习

    海量Java免费资源获取

    三. 总结

    我们在处理异常的时候,一定要注意查看异常信息,快速定位出异常的位置,找到问题,解决问题。

    展开全文
  • 数组下标越界异常是如何产生的

    千次阅读 2020-08-04 22:24:58
    首先,ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存。 对于ArrayList而言,它实现List接口、底层使用数组保存所有元素。其操作基本上是对数组的操作...
       首先,ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存。
    
       对于ArrayList而言,它实现List接口、底层使用数组保存所有元素。其操作基本上是对数组的操作。
    
       1、程序中报错的 at java.util.ArrayList.elementData(ArrayList.java:400) 和 at java.util.ArrayList.add(ArrayList.java:441),它们同属Add()方法。   
    

    添加操作,首先会调用ensureCapacityInternal(size + 1),其作用为保证数组的容量始终够用,其中size是elementData数组中元组的个数,初始为0。

    在ensureCapacityInternal()函数中,用if判断,如果数组没有元素,给数组一个默认大小,会选择实例化时的值与默认大小中较大值,然后调用ensureExplicitCapacity()。

    函数体中,modCount是数组发生size更改的次数。然后if判断,
    

    如果数组长度小于默认的容量10,则调用扩大数组大小的方法grow()。

    函数grow()解释了基于数组的ArrayList是如何扩容的。数组进行扩容时,会将老数组中的元素重新拷贝一份到新的数组中,每次数组容量的增长大约是其原容量的1.5倍。
       接下来回到Add()函数,继续执行,elementData[size++] = e; 这行代码就是问题所在,当添加一个元素的时候,它可能会有两步来完成:1. 在 elementData[Size] 的位置存放此元素;2. 增大 Size 的值。
       在单线程运行的情况下,如果 Size = 0,添加一个元素后,此元素在位置 0,而且 Size=1;
       而如果是在多线程情况下,比如有两个线程,线程 A 先将元素存放在位置 0。但是此时 CPU 调度线程A暂停,线程 B 得到运行的机会。线程B也向此 ArrayList 添加元素,因为此时 Size 仍然等于 0 (注意哦,我们假设的是添加一个元素是要两个步骤哦,而线程A仅仅完成了步骤1),所以线程B也将元素存放在位置0。然后线程A和线程B都继续运行,都增加 Size 的值。那好,我们来看看 ArrayList 的情况,元素实际上只有一个,存放在位置 0,而 Size 却等于 2。这就是“线程不安全”了。这就解释了为何集合中会出现null。
       但是数组下标越界还不能仅仅依靠这个来解释。我们观察发生越界时的数组下标,分别为10、15、22、33、49和73。结合前面讲的数组自动机制,数组初始长度为10,第一次扩容为15=10+10/2,第二次扩容22=15+15/2,第三次扩容33=22+22/2...以此类推,我们不难发现,越界异常都发生在数组扩容之时。
       由此给了我想法,我猜想是,由于没有该方法没有同步,导致出现这样一种现象,用第一次异常,即下标为15时的异常举例。当集合中已经添加了14个元素时,一个线程率先进入add()方法,在执行ensureCapacityInternal(size + 1)时,发现还可以添加一个元素,故数组没有扩容,但随后该线程被阻塞在此处。接着另一线程进入add()方法,执行ensureCapacityInternal(size + 1),由于前一个线程并没有添加元素,故size依然为14,依然不需要扩容,所以该线程就开始添加元素,使得size++,变为15,数组已经满了。而刚刚阻塞在elementData[size++] = e;语句之前的线程开始执行,它要在集合中添加第16个元素,而数组容量只有15个,所以就发生了数组下标越界异常!
    
    展开全文
  • 数组下标越界,该怎么解决

    千次阅读 2021-04-14 03:16:42
    数组下标越界packageimport_csv;importjava.io.BufferedReader;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.Un....
  • /** *需求:在一段字符串中,找出以国子结尾的字段,并存入一个数组中,然后打印该数组中的所有数据 ...所以刚开始给strGuo的长度定义为0了,不管下标是什么都会报数组下标越界! //更正后的代码: ...
  • 对于数组把握和理解不深的同学·们来说,数组下标越界一直是个头疼的问题,有没有什么好的方法去检测变量什么时候会导致数组越界呢?这是这篇文章介绍的重点 assert断言函数 头文件 <assert.h>,C++中是<...
  • 数组下标越界异常解决方法

    千次阅读 2017-08-11 13:39:00
    代码: 运行结果下标越界异常: 修改方法: 转载于:https://www.cnblogs.com/GreenCode/p/7345508.html
  • Android Q(10.0)及以上版本 SparseArray ArrayIndexOutOfBoundsException问题处理 ...根据崩溃日志分析发现,崩溃原因是数组下标越界,跟踪代码发现,是因为项目中使用了SparseArray,在使用SparseArray的keyA
  • 这两天被人问了一个问题说假如C/C++访问下表越界数组元素会报错么,于是充满好奇心的我动手试了一下,WTF,果然没有报错,但是会给程序带来莫名其妙的结果(比如十次的循环但是变成了死循环,但八次却可以)例:1 #...
  • 数组下标越界异常

    千次阅读 2017-03-31 11:27:09
    java.lang.ArrayIndexOutOfBoundsException :数组下标越界
  • Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 7 at SL.cn.test2_9_1.partition(test2_9_1.... ... ...如此说明:下标越界发生在代码第46行、38行。。22行,发生下标越界时下标为“7”。
  • Java错误提示-------数组下标越界

    千次阅读 2019-05-04 11:43:37
    原文:... 错误提示:提示出错:Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 意思是数组下标越界 //at Array.main(Array.java:30) import java.u...
  • 数组下标越界拦截(OC)

    2021-01-15 14:16:28
    } // 为了避免和系统的方法冲突,我一般都会在swizzling方法前面加前缀 - (id)lxz_objectAtIndex:(NSUInteger)index { // 判断下标是否越界,如果越界就进入异常拦截 if (self.count-1 ) { @try { return [self lxz...
  • GCC --version6.3.0-18+deb9u1 20170516代码#include&lt;stdio.h&gt; int main{ int a[3]={1,2,3}; int i; printf("%p %p %p %p %p\n",&amp;a[0],&amp;a[1],&amp;a[2],&amp;.....
  • 对于刚开始学习Java的大部分人来说,在使用数组的过程中,经常会遇到数组下标越界异常。下面壹哥就以一个实际案例来给大家进行说明: 运行上面的程序,会出现如下异常: 二. 解决思路 很多初学者遇到异常时...
  • 我经常遇到数组下标越界问题,看不出来哪里错误,想问大家一般遇到这类问题都怎么处理? 1049. 数列的片段和(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 给定一...
  • (Java)数组越界异常

    千次阅读 2021-03-14 11:02:35
    所以,我一直在为我的计算机科学课程编写一些代码来计算热指数。我有麻烦加载数据从文本文件,我被指示与该程序...(Java)数组越界异常import java.util.Scanner;import java.io.File;import java.io.IOException;p...
  • System.out.println("数组下标越界异常:请输入两个数"); continue; }catch(NumberFormatException ex){ System.out.println("数字格式异常:请输入两个整数"); continue; }...
  • 数组的四个基本特点: 其长度是确定的。数组一旦被创建,它的大小就是不可改变的。 其元素必须是相同类型,不允许出现混合类型。...下标的合法区间:[0, length - 1] ,如果越界就会报错: public static void
  • BUG-并行流与数组下标越界-思考与总结今天线上环境报异常,发现了一个之前没注意过的问题,记录一下。1. 异常信息异常信息如下:···Caused by: java.lang.ArrayIndexOutOfBoundsExceptionat java.lang.String....
  • 主要介绍了Java数组越界问题实例解析,具有一定参考价值,需要的朋友可以了解下。
  • 异常部分代码: 原因:代码中codenum_new为一个int类型,默认值为0,所以0-1之后为-1,而codeNumlist(一个List集合)的下标是从0开始的,也就是第一个参数的下标为0,当这里需要找到下标为-1的String时,就会...
  • 问题:在指定数组:{99,88,77,66,55};中插入一个数字并使之保持降序。
  • 数组下标越界 :在引用数组元素时,使用的下标超过了该数组下标的应有范围。 但应注意的是: C/C++不对数组做边界检查。 可以重写数组的每一端,并写入一些其他变量的数组或者甚至是写入程序的代码。不检查下标是否...
  • //a[10]定义了一个从a[0]到a[9]的数组 printf("顺序为:"); for(i=0;i<10;i++) { a[i]=i; printf("%d ",a[i]); } printf("\n"); printf("逆序为:"); for(i=10;i>=0;i--) { printf("%d ",a[i]...
  • 开发过程中,经常会遇到空指针异常,尤其是在线上 bug 中,由于未进行 null 判断处理导致的 bug 比例肯定不低。 另外,model 层经常需要根据服务端接口返回的数据结构进行建模,实体类中常见的有 String 类型和 ...
  • 数组越界会发生什么

    千次阅读 多人点赞 2021-09-14 21:11:20
    (检查数据越界,编译器就必须在生成的目标代码中加入额外的代码用于程序运行时检测下标是否越界,这就会导致程序的运行速度下降)。看下面一段代码: #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> ...
  • 一、数组赋值 数组名就代表着该数组的首地址,后面的所有元素都可以根据数组名加上偏移量取到。 1. 一维数组 第一个小例子:编程实现显示用户输入的月份(不考虑闰年)拥有的天数。** #include<stdio.h> #...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,683
精华内容 12,673
关键字:

数组下标越界异常代码