-
2022-06-14 08:53:19
一. 异常示例
对于刚开始学习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 "main" java.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站上找到这套资料,完全免费,为初学者打牢基础提供的一些干货。
三. 总结
我们在处理异常的时候,一定要注意查看异常信息,快速定位出异常的位置,找到问题,解决问题。现在你知道这个异常该怎么解决了吗?如果还有什么别的问题,可以在评论区给壹哥留言哦。
更多相关内容 -
数组下标越界
2021-05-21 04:44:51已结贴√问题点数:20回复次数:11 数组下标越界题目是一个有10个元素的数组,存有10个考生的分数,写5个函数,分别计算总分,最高分,最低分,平均分,分数升序排列。我写了5函数,问题出在最高分和最低分函数上。...已结贴√
问题点数:20 回复次数:11
数组下标越界
题目是一个有10个元素的数组,存有10个考生的分数,写5个函数,分别计算总分,最高分,最低分,平均分,分数升序排列。
我写了5函数,问题出在最高分和最低分函数上。我用了两种方法,第一种是最高分和最低分都用冒泡法分别排序,分别运行的时候没有问题,
但和其他3函数一起运行时候就打印最小值不是63了,而且一个很大的数,我想是一个垃圾值(下标越界造成的);但是我重新建个项目,只把
max函数和min函数两个函数放进去和main函数一起运行就没有出错。不明白问题出在哪里了。请教下各位帮我看下:我认为是下标越界造成的,
中间出个一次问题:最小值对了63,最大值就不对了。把最大值改对了,最小值就不对了。
下面附上具体的代码,求教:看计算max和min方法1就可以了。方法2是调用降序排列后输出的没有问题。
#include
#include
#define N 10
//求总分
int sum(int arr[])
{
int n=0; //局部变量,所以每个函数都可以声明n
int sum1=0;
for(;n<10;n++)
{
sum1+=arr[n];
}
return sum1;
}
//求最高分方法1
int max(int arr[])
{
int n=0;
int temp=0;
int max1=0;
for(n=0;n<9;n++)
{
if(arr[n]>arr[n+1])
{
temp=arr[n];
arr[n]=arr[n+1];
arr[n+1]=temp;
}
}
max1=arr[9];
return max1;
}
//求最低分1 注意数组下标越界
int min(int arr[])
{
int n=0;
int temp=0;
int min1=0;
for(n=9;n>=0;n--)
{
if(arr[n-1]>arr[n])
{
temp=arr[n-1];
arr[n-1]=arr[n];
arr[n]=temp;
}
}
min1=arr[0]; //此时循环后最小值在最上方;
return min1;
}
/*
//求最高分方法2
int max(int arr[])
{
int max1=0;
int LtoH(int arr[]); //排序函数LtoH在max后面,所以先声明排序函数
LtoH(arr); //声明之后才能调用
max1=arr[9];
return max1;
}
//求最低分方法2
int min(int arr[])
{
int min1=0;
int LtoH(int arr[]);
LtoH(arr);
min1=arr[0];
return min1;
}
*/
//求平均分,调用求总分函数sum()
float avg(int sum)
{
float avg1;
avg1=(float)sum/10;
return avg1;
}
//成绩升序排序,从低分到高分
int LtoH(int arr[])
{
int n=0,m=0,temp=0;
for(n=9;n>0;n--)
{
for(m=0;m
{
if(arr[m]>arr[m+1])
{
temp=arr[m];
arr[m]=arr[m+1];
arr[m+1]=temp;
}
}
}
}
int main()
{
int score[N]={67,98,75,63,82,79,81,91,66,84};
int sum2=0,max2=0,min2=0;
float avg2;
int n=0;
sum2=sum(score);
printf("总分:%d\n",sum2);
max2=max(score);
printf("最高分:%d\n",max2);
min2=min(score);
printf("最低分:%d\n",min2);
avg2=avg(sum2);
printf("平均分:%.1f\n",avg2);
LtoH(score);
printf("成绩降序排列:");
for(n=0;n<10;n++)
printf("%d ",score[n]);
printf("\n");
system("pause");
return 0;
}
[此贴子已经被作者于2016-3-10 14:12编辑过]
搜索更多相关主题的帖子:
而且 项目 元素
-
C语言 数组下标越界 - C语言零基础入门教程
2021-08-19 09:36:40数组下标越界简介 1、什么是数组访问越界? 2、访问越界会出现什么结果? 二.数组下标越界案例 三.防止数组下标越界方法 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一...目录
零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门
一.数组下标越界简介
1、什么是数组访问越界?
在
C
语言中,我们可以直接通过数组下标来访问数组中的元素;如果一个数组定义为有
n
个元素,那么,对这n
个元素(下标为0
到n-1
的元素)的访问都合法,如果对这n
个元素之外的访问,就是非法的,称为**越界**,例如:int a[5] = {0}; //等价 int a[5] = {0,0,0,0,0}; a[0] = 1; // ok a[1] = 2; // ok a[2] = 3; // ok a[3] = 4; // ok a[4] = 5; // ok a[5] = 6; // 数组下标越界
在上面代码中,声明一个数组
a[5]
,该数组中只能存放5
个元素,下标索引值取值范围0~4
,超过这个范围就属于下标越界;2、访问越界会出现什么结果?
首先,它并不会 造成编译错误!就是说,
C
,C++
的编译器并不判断和指出你的代码访问越界了。一个明明是错误的东西,就这样“顺利”地通过了编译;数组访问越界在运行时,它的表现是不定的,有时似乎什么事也没有,程序一直运行(当然,某些错误结果已造成);有时,则是程序一下子崩溃。因此在使用数组时,一定要在编程中判断是否越界以保证程序的正确性。
二.数组下标越界案例
/******************************************************************************************/ //@Author:猿说编程 //@Blog(个人博客地址): www.codersrc.com //@File:C语言教程 - C语言 数组下标越界 //@Time:2021/06/10 08:00 //@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累! /******************************************************************************************/ #include <stdio.h> int main() { int i, a[10]; for(i = 1; i <= 10; ++i) a[i] = 0; return 0; }
数组中的下标从 0 开始,那么在上面代码中只能访问:
a[1]
、a[2]
、a[3]
、a[4]
、a[5]
、a[6]
、a[7]
、a[8]
、a[9]
;当i
自加到10
时,a[10]
属于数组下标越界。三.防止数组下标越界方法
如果数组的长度和下标访问值弄错,都会造成数组下标越界;数组的下标是从 0 开始的,最大的访问值是数组的长度-1;
//如果是整形数组 int len = sizeof(array)/sizeof(int); //如果是字符数组 int len = sizeof(array)/sizeof(char); //如果是浮点数数组 int len = sizeof(array)/sizeof(double); //如果是浮点数数组 int len = sizeof(array)/sizeof(float); for(int i = 0;i < len ; i++) { //..... }
四.猜你喜欢
- 安装 Visual Studio
- 安装 Visual Studio 插件 Visual Assist
- Visual Studio 2008 卸载
- Visual Studio 2003/2015 卸载
- C 语言格式控制符/占位符
- C 语言逻辑运算符
- C 语言三目运算符
- C 语言逗号表达式
- C 语言 sizeof 和 strlen 函数区别
- C 语言 strcpy 和 strcpy_s 函数区别
- C 语言 memcpy 和 memcpy_s 区别
- C 语言 数组定义和使用
- C 语言 数组遍历
- C 语言 数组排序 – 冒泡法排序
- C 语言 数组排序 – 选择法排序
- C 语言 数组排序 – 插入法排序
- C 语言 数组排序 – 快速法排序
- C 语言 数组下标越界
未经允许不得转载:猿说编程 » C 语言 数组下标越界
-
数组下标越界,该怎么解决
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....数组下标越界
package import_csv;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class csv_sqlite {
public static void main(String[] args) throws ClassNotFoundException, IOException {
String b[] = { "2012060101", "2012060201", "2012060202", "2012060203",
"2012060204", "2012060205", "2012060206", "2012060207",
"2012060208", "2013010101", "2013010102", "2013010103",
"2013010104", "2013010105", "2013010106", "2013010107",
"2013010108", "2013010201", "2013010202", "2013010203",
"2013010204", "2013010301", "2013010302", "2013020101",
"2013020102", "2013020103", "2013020104", "2013020201",
"2013020202", "2013020203", "2013020204", "2013020301",
"2013020302", "2013030101", "2013030102", "2013030103",
"2013030104", "2013030105", "2013030106", "2013030107",
"2013030108", "2013030109", "2013030110", "2013030111",
"2013030112", "2013030113", "2013030114", "2013030115",
"2013030116", "2013030117", "2013030118", "2013030119",
"2013030120", "2013030121", "2013030122", "2013030123",
"2013030124", "2013030125", "2013030126", "2013030127",
"2013030128", "2013030129", "2013030130", "2013040101",
"2013040102", "2013040103", "2013050101", "2013050102",
"2013050201", "2013050202", "2013050203", "2013050301",
"2013050302", "2013060101", "2013060102", "2013060103",
"2013060104", "2013060105", "2013060106", "2013060201",
"2013060202", "2013060203", "2013060204", "2013060205",
"2013060206", "2013060207", "2013060208", "2013060209",
"2013060210" };
int n = b.length;
System.out.println("数组长度:"+n);
Class.forName("org.sqlite.JDBC");
/*Connection conn = DriverManager
.getConnection("jdbc:sqlite:d:/classtable.db");*/
for (int j = 0; j
String file = "D:\\编程\\" + b[j] + ".csv";
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(file), "GBK"));
String line;
while ((line = br.readLine()) != null) {
String[] value = line.split(",");
String sql = "INSERT INTO [" + b[j] + "] VALUES('" + value[0]
+ "','" + value[1] + "','" + value[2] + "','"
+ value[3] + "','" + value[4] + "')";
System.out.println(sql);
}
br.close();
}
}
}
我想先看看运行出的SQL语句,然后一直提示数组下标越界
以下是运行结果:
数组长度:89
INSERT INTO [2012060101] VALUES('国际贸易实务','实2-205','MON1','8','11')
INSERT INTO [2012060101] VALUES('财政学','教1-315','MON2','8','19')
INSERT INTO [2012060101] VALUES('国际贸易实务','教1-313','MON3','1','11')
INSERT INTO [2012060101] VALUES('中国对外贸易概论','教1-105','MON4','1','9')
INSERT INTO [2012060101] VALUES('广告学概论','教2-106','TUE2','1','15')
INSERT INTO [2012060101] VALUES('国际经济学','教1-206','TUE3','1','15')
INSERT INTO [2012060101] VALUES('外贸英文函电','教1-113','TUE4','1','11')
INSERT INTO [2012060101] VALUES('财政学','教1-315','WED1','8','19')
INSERT INTO [2012060101] VALUES('国际贸易','教1-113','WED3','12','19')
INSERT INTO [2012060101] VALUES('大学英语听说','教1-403','WED4','12','19')
INSERT INTO [2012060101] VALUES('中国对外贸易概论','教1-105','WED4','1','9')
INSERT INTO [2012060101] VALUES('国际贸易实务','教1-313','THU1','1','11')
INSERT INTO [2012060101] VALUES('外贸英文函电','实1-211','THU2','8','11')
INSERT INTO [2012060101] VALUES('外贸英文函电','教1-113','THU3','1','11')
INSERT INTO [2012060101] VALUES('广告学概论','教2-106','THU4','1','15')
INSERT INTO [2012060101] VALUES('国际贸易','教1-113','FRI1','12','19')
INSERT INTO [2012060101] VALUES('大学英语听说','教1-403','FRI2','12','19')
INSERT INTO [2012060101] VALUES('国际经济学','教1-206','FRI3','1','15')
INSERT INTO [2012060201] VALUES('财政学','教2-203','MON2','8','19')
INSERT INTO [2012060201] VALUES('保险学','教2-109','MON3','8','19')
INSERT INTO [2012060201] VALUES('广告学概论','教2-106','TUE1','1','15')
INSERT INTO [2012060201] VALUES('经济法','教1-206','TUE2','8','19')
INSERT INTO [2012060201] VALUES('国际经济学','教1-206','TUE3','1','15')
INSERT INTO [2012060201] VALUES('保险学','教2-109','WED2','8','19')
INSERT INTO [2012060201] VALUES('财政学','教2-203','THU1','8','19')
INSERT INTO [2012060201] VALUES('经济法','教1-206','THU2','8','19')
INSERT INTO [2012060201] VALUES('广告学概论','教2-106','THU3','1','15')
-
数组下标越界异常
2021-11-19 10:17:30数组下标越界异常:ArrayIndexOutOfBoundsException\ int[] arr={1,2,3}; for (int i = 0; i <= arr.length; i++) { System.out.println(arr[i]); } 把i <= arr.length改为i < arr.length即可解决 -
c语言中如何防止数组下标越界
2022-06-05 00:12:38点击上方蓝字关注我,了解更多咨询1、若数组长度和下标访问值出现错误,则会导致数组下标越界。数组下标从0开始,访问值为-1。2、在使用循环遍历数组元素时,注意防范off-by-one的错误。对于作为函数参数传入的数组... -
C语言数组下标越界
2021-08-31 23:46:59数组越界的严重性 在 C 语言里,数组需为静态的。数组的大小需要在程序运行前就确定下来。 C语言数组越界的严重性...i自加到10时,a[10]属于数组下标越界。 详细分析图 1、栈把内存分配给数组,并且自上而下从小地址开 -
数组下标越界问题
2021-11-29 19:06:25Exception in thread "main" java.lang....当使用不合法的数字下标输入访问数组时会报数组越界这种错误, 数组的起始下标从下标0开始 数组arr的合法范围是[0, arr.length-1],当访问超出数组长度的下. -
C++中数组下标越界
2021-12-03 20:14:04引言 最近突然想到当数组array有2个元素,而访问其array[2]时会不会编译错误的问题,答案是编译的时候不报错,只有运行...基于上述现象,说明程序在编译的时候没有进行下标越界的检查,当一个程序生成可执行文件的时候 -
Java实验4-1【数组下标越界异常处理】
2022-05-14 14:26:202、数组下标从0到10循环遍历数组,输出数组元素的值。 3、使用异常处理语句检测上述输出语句,控制程序正常退出 (1)然后在捕获处理时调用toString方法,实现以下运行效果。 (2)当满足产生异常对象条件时,结合... -
1.数组下标越界:ArrayIndexOutOfBoundsException
2022-04-09 13:16:57/** *需求:在一段字符串中,找出以国子结尾的字段,并存入一个数组中,然后打印该数组中的所有数据 ...所以刚开始给strGuo的长度定义为0了,不管下标是什么都会报数组下标越界! //更正后的代码: ... -
数组下标越界异常解决方法
2021-03-08 10:36:52数组下标越界异常解决方法 -
C语言 数组下标越界和内存溢出区别 - C语言零基础入门教程
2021-08-20 09:38:23数组下标越界和内存溢出简介 二.数组下标越界和内存溢出区别 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.数组下标越界和内存溢出简介 **溢出本义是算术... -
C语言编译器不检查数组下标越界
2021-05-20 17:26:18这两天被人问了一个问题说假如C/C++访问下表越界的数组元素会报错么,于是充满好奇心的我动手试了一下,WTF,果然没有报错,但是会给程序带来莫名其妙的结果(比如十次的循环但是变成了死循环,但八次却可以)例:1 #... -
java新手求助 数组下标越界异常
2021-03-13 16:49:36该楼层疑似违规已被系统折叠隐藏此楼查看此楼这是一个输入有n个数字的数组,选出k个最小值的函数。import java.util.*;public class example { public static void main(String[] args) {try{Scanner scan=new ... -
ArrayIndexOutOfBoundsException:数组下标越界异常
2022-03-02 07:48:04public class ArrayDemo02 { public static void main(String[] args) { //静态初始化 int[] a={1,2,3,4,5,6,7,8,9,10}; System.out.println(a[10]);//下标越界 } } -
C语言中关于数组下标越界却能运行的巧合
2022-01-11 03:09:40#include<stdio.h> int main() ...在这段代码中,很明显看出是有问题的,当for循环大于9以后下标就越界了,但这段代码放在vs2019中却能运行起来,这是为什么呢? 结论:因为i和arr是局部变.. -
为什么数组下标越界要检查
2020-08-28 12:04:29这里从JVM的角度说下自己的理解,不一定是对的哈,比如现在只在堆中给ints分配了相对应它长度100的内存空间,如果不检查数组下标越界,那么ints就可以无限分配了,直到堆内存的极限,那么问题来了,其他的对象也有被... -
初学java遇到疑惑,数组下标越界,求解答!
2021-03-13 17:38:06一个学生考试成绩录入程序的模块化设计,在编译时出现了数组下标越界错误提示:Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0;at Ch3Demo7.main(Ch3Demo7.java:26)classCh3Demo7//... -
在java中,解决数组下标越界的问题
2021-02-12 15:39:42//获取文本内容publicstaticListgetText(StringfilePath){Listsimples=newArrayList();try{FileReaderreader=newFileReader(filePath);BufferedReaderbfRead...// 获取文本内容public static List getText(String ... -
数组下标越界可能出现的问题
2021-09-26 18:44:03可以看一下这个代码会出现什么问题:答案是在VS2013-VS2019中下面代码出现了程序死循环 APP 中接收数据代码: #include<stdio.h> int main(){ ...2.arr数组的存储是随着下标的增长,地址由低到高 -
第7章 数组-数组下标越界问题分析.pdf
2020-03-15 14:10:47第7章数组 一维数组下标越界问题分析 第7章数组 数组元素的访问 访问数组元素时下标越界是大忌 编译器通常不检查下标越界导致程序运行时错误 下标越界将访问数组以外的空间 那里的数据是未知的不受我们掌控可能带来... -
一维数组下标越界但不提示仍可读写问题
2022-03-07 16:15:20//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]... -
java.lang.ArrayIndexOutOfBoundsException:数组下标越界越界
2021-08-03 11:30:04前台vue初始化 pinIds:[],但是当pinIds前台查询条件传值为空时,pinIds[0]、pinIds[1]取不到值,就会报数组下标越界越界 改为 就可以了 -
如何解决数组下标越界异常
2020-12-30 23:17:28如何解决数组下标越界异常 今天在写接口的时候运行发现有一个数组的下标越界异常了, 检查了一下发现实在上面的数组中有一些字符串没有大写,造成跟下面的数组字符串不一样,所以导致了数组下标越界异常。 ... -
数组下标越界异常是如何产生的
2020-08-04 22:24:58首先,ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存。 对于ArrayList而言,它实现List接口、底层使用数组保存所有元素。其操作基本上是对数组的操作... -
关于C++中数组下标越界不报错的问题
2019-12-08 16:19:39C++中数组下标越界程序并不报错是因为编译器不会对数组下标作越界检查造成的。 C语言非常重视运行时的效率,所以没有进行数组越界检查,而C++继承了C的效率要求,自然也不做数组越界检查。(检查数据越界,编译器... -
java使用String的split()方法数组下标越界问题
2021-04-16 21:54:26今天做练习的时候使用String的split(",")方法在控制台进行信息截取,一开始出现数组下标越界的提示我就去用for循环遍历了一下,有三个片段的输出信息,然后我网上查了说有以下几种情况: 1.代码编码和控制台中文编码...