Java数组越界问题实例解析

Java中数组初始化和OC其实是一样的,分为动态初始化和静态初始化,

动态初始化:指定长度,由系统给出初始化值

静态初始化:给出初始化值,由系统给出长度

在我们使用数组时最容易出现的就是数组越界问题,好了,这里有个简单的例子

     int [][] array = {{1,2,3},{1,4}};
    System.out.println(array[1][2]);

这是一个二维数组,很明显,数组越界了,控制台中会打印如下信息:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2

 at demo.Array.main(Array.java:31)

很准确的定位到31行。

下面看看一个完整的代码示例:

package home_work_4_17;
abstract class Employee{
	abstract double earnings();
}
class YearWorker extends Employee{
	double earnings(){
		System.out.println("按年领取1000");
		return 1000;
	}
}
class MonthWorker extends Employee{
	double earnings(){
		System.out.println("按月领取100");
		return 100;
	}
}
class WeekWorker extends Employee{
	double earnings(){
		System.out.println("按星期领取10");
		return 10;
	}
}
class Company{
	int n;
	//该公司的人数
	public Company(int n) {
		this.n=n;
		// TODO Auto-generated constructor stub
	}
	Employee E[]=new Employee[n];
	double cal(){
		//返回薪水综合
		double sum=0;
		for (int j=0;j<n;j++){
			sum+=E[j].earnings();
		}
		return sum;
	}
}
public class work_2 {
	public static void main(String args[]) {
		Company c=new Company(3);
		c.E[0]=new WeekWorker();
		c.E[1]=new MonthWorker();
		c.E[2]=new YearWorker();
		System.out.println("总支出:"+c.cal());
	}
}

编译器显示数组越界错误。

经检查发现划线部分语句出错

应当做如下修改:

class Company{
  int n;  //该公司的人数
   Employee E[];
  public Company(int n) {
    this.n=n;// TODO Auto-generated constructor stub
    E=new Employee[n];
   }
  double cal(){    //返回薪水综合
    double sum=0;
    for(int j=0;j<n;j++){
      sum+=E[j].earnings();
    }
    return sum;
  }
}

出错原因是:当Company构造方法中并未对数组E进行初始化操作,故而E数组大小仍然为0,发生数组越界错误。

利用上述错误方式编写的测试程序如下:

package test_a;
class people{
  int n;
  Student s[]=new Student[n];
  public people(int n) {
    this.n=n;// TODO Auto-generated constructor stub
  }
}
class Student{
  int number;
}
public class Cdcs {
  public static void main(String args[]) {
    people p=new people(3);
    System.out.println(p.s.length);
  }
}

输出结果为0。即数组大小为零。

总结

以上就是本文关于Java数组越界问题实例解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:Java异常退出条件的判断示例代码、Java编程异常处理最佳实践【推荐】等。有什么问题可以随时留言,小编会及时回复大家的。

(0)

相关推荐

  • 利用Java异常机制实现模拟借书系统

    本文介绍的是利用java语言实现一个控制台版的模拟借书系统,在开始本文的正式内容之前,我们先来了解一下Java异常机制. 什么是异常? 异常,不正常也.Exception是Exception event的缩写,因此异常是一个事件,该事件发生在程序运行时. 异常会影响程序的连续性,使程序中断.在Java中,一切皆对象,所以要定义异常,也需要使用对象.异常对象里 封装了异常类型和程序发生异常时的状态. 我们经常说的抛出异常就是创建异常对象,并提交给运行系统. 异常捕获机制与try-catch 当异常

  • java中排序报:Comparison method violates its general contract异常的解决

    前言 上周线上的一段排序的java代码出现了一个Comparison method violates its general contract,在解决这个问题的途中学到了一些知识这里总结分享一下. 异常原因 这个排序导致的异常将会在java7以上的版本出现,所以如果你的JDK从6升级到了7或者8,那一定要小心此异常. 在java7的兼容列表中,就有对此排序不兼容的说明: Area: API: Utilities Synopsis: Updated sort behavior for Arrays

  • java中的connection reset 异常处理分析

    在Java中常看见的几个connection rest exception, Broken pipe, Connection reset,Connection reset by peer Socked reset case Linux中会有2个常见的sock reset 情况下的错误代码 ECONNRESET 该错误被描述为"connection reset by peer",即"对方复位连接",这种情况一般发生在服务进程较客户进程提前终止.当服务进程终止时会向客户

  • Java中内存异常StackOverflowError与OutOfMemoryError详解

     Java中内存异常StackOverflowError与OutOfMemoryError详解 使用Java开发,经常回遇到内存异常的情况,而StackOverflowError和OutOfMemoryError便是最常遇见的错误. 首先,看看这两种错误的解释: 如果当前线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常. 如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常. 这里把异常分为两种情况,但是存在一些相互重

  • java.net.MalformedURLException异常的解决方法

    java.net.MalformedURLException at java.net.URL.<init>(URL.java:619) at java.net.URL.<init>(URL.java:482) at java.net.URL.<init>(URL.java:431) 代码中URL url = new URL(someUrl);这一行出现java.net.MalformedURLException异常 解决方法是,对someUrl中的参数名和参数值都URL

  • Java异常处理运行时异常(RuntimeException)详解及实例

      Java异常处理运行时异常(RuntimeException)详解及实例 RuntimeException RunntimeException的子类: ClassCastException 多态中,可以使用Instanceof 判断,进行规避 ArithmeticException 进行if判断,如果除数为0,进行return NullPointerException 进行if判断,是否为null ArrayIndexOutOfBoundsException 使用数组length属性,避免越

  • Java数组越界问题实例解析

    Java中数组初始化和OC其实是一样的,分为动态初始化和静态初始化, 动态初始化:指定长度,由系统给出初始化值 静态初始化:给出初始化值,由系统给出长度 在我们使用数组时最容易出现的就是数组越界问题,好了,这里有个简单的例子 int [][] array = {{1,2,3},{1,4}}; System.out.println(array[1][2]); 这是一个二维数组,很明显,数组越界了,控制台中会打印如下信息: Exception in thread "main" java.l

  • java常用数据流应用实例解析

    这篇文章主要介绍了java常用数据流应用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 按操作单位的不同分为:字节流(8bit)(InputStream.OuputStream).字符流(16bit)(Reader.Writer) 按数据流的流向不同分为:输入流.输出流 按角色的不同分为:节点流.处理流 一.不带缓冲的流 1.文件字节输入流.文件字节输出流 package anno; import java.io.File; impor

  • java 数组越界判断和获取数组长度的实现方式

    目录 1. 背景介绍 2. 原始java代码 3. java代码对应的反编译字节码 4. jvm实现分析 4.1 获取数组长度arraylength指令核心代码分析 4.2 获取数组元素iaload指令分析 5. 小结一下 java 数组越界问题 1. 背景介绍 java中的数组比c语言中的数组,多了两个很重要的功能 当索引越界时, 会自动抛出ArrayIndexOutOfBoundsException, 避免一错再错 另一个很重要的方法是获取数组长度 这两个功能都不是通过java代码层面实现的

  • Java Web开发入门书籍实例解析(总结一)

    从事Java Web开发这一段时间来,对Java 面向对象的思想和MVC开发模式可以说已经熟悉了.我当前参与的项目使用的框架是Spring.SpringMVC.Hibernate.下面我们小编给大家整理一篇教程帮助大家学习javaweb相关知识,感兴趣的朋友可以参考下. 一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 1.静态web资源(如html 页面):指w

  • Java多线程回调方法实例解析

    所谓回调,就是客户程序C调用服务程序S中的某个方法A,然后S又在某个时候反过来调用C中的某个方法B,对于C来说,这个B便叫做回调方法. 下面看一个实际例子来理解: 本示例设置一个提问者,一个回答者,而回答者需要回答提问者一个很深奥的问题时,这时需要很多时间去查找,提问者又开始做其他的事情, 等回答者找到答案后,再把答案告诉提问者. 一.提问者的类 涉及到长时间的思考,要sleep,要继承Thread package com.xykj.thread; public class XiaoZhang

  • java线程的基础实例解析

    java中建立线程可以有两种方式,分别是继承Thread类和实现Runnable接口. 继承Thread public class MyThread extends Thread{ public MyThread(String name){ super(name); } int i; public void run(){ for(i=0;i<5;i++){ System.out.println(getName()+"--"+i); } } public static void m

  • java编程多线程并发处理实例解析

    本文主要是通过一个银行用户取钱的实例,演示java编程多线程并发处理场景,具体如下. 从一个例子入手:实现一个银行账户取钱场景的实例代码. 第一个类:Account.java 账户类: package cn.edu.byr.test; public class Account { private String accountNo; private double balance; public Account(){ } public Account(String accountNo,double

  • Java中后台线程实例解析

    本文研究的主要是Java中后台线程的相关问题,具体介绍如下. 以前从来没有听说过,java中有后台线程这种东西.一般来说,JVM(JAVA虚拟机)中一般会包括俩种线程,分别是用户线程和后台线程.所谓后台线程(daemon)线程指的是:在程序运行的时候在后台提供的一种通用的服务的线程,并且这种线程并不属于程序中不可或缺的部分.因此,当所有的非后台线程结束的时候,也就是用户线程都结束的时候,程序也就终止了.同时,会杀死进程中的所有的后台线程.反过来说,只要有任何非后台线程还在运行,程序就不会结束.不

  • Java数组扩容实现方法解析

    这篇文章主要介绍了Java数组扩容实现方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 第一种 int[] arr2=new int[arr1.length*2] //新数组的长度 第二种 int[] arr2=java.util.Arrays.copyOf(原数组名,新数组的长度); 第三种 int[] arr2=new int[arr1.length*2] System.arraycopy(原数组名,起始下标,新数组名,起始下标,复制

  • java抛出异常与finally实例解析

    这篇文章主要介绍了java抛出异常与finally实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码如下: package test1; public class EmbededFinally { public static void main(String args[]) { int result; try { System.out.println("in Level 1"); try { System.out.print

随机推荐