共计 14598 个字符,预计需要花费 37 分钟才能阅读完成。
这篇文章给大家介绍 Java 程序设计基础是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
3.1Java 编程概况
现在你可以复习一下 Java 语言的背景材料,它的基本结构象 C /C++,但任何用面向过程语言编写过程序的人都可以了解 Java 语言的大部分结构.
3.1.1 程序结构
Java 语言的源程序代码由一个或多个编译单元 (compilationunit) 组成,每个编译单元只能包含下列内容 (空格和注释除外):* 一个程序包语句(packagestatement)* 入口语句(importstatements)* 类的声明(classdeclarations)* 界面声明(interfacedeclarations) 每个 Java 的编译单元可包含多个类或界面,但是每个编译单元最多只能有一个类或者界面是公共的。Java 的源程序代码被编译之后,便产生了 Java 字节代码。Java 的字节代码由一种不依赖于机器的指令组成,这种指令能被 Java 的运行系统 (runtimesystem) 有效地解释。Java 的运行系统工作起来如同一台虚拟机。在当前的 Java 实现中,每个编译单元就是一个以.java 为后缀的文件。每个编译单元有若干个类,编译后,每个类生成一个.class 文件。.class 文件是 Java 虚拟机能够识别的代码。
3.1.2 注释
三种类型如下:// 注释一行 /* 一行或多行注释 *//** 文档注释 **/
文档注释一般放在一个变量或函数定义之前, 指示在任何自动生成文档系统中调入。这种注释都是声明条目的描述.。
3.1.3 标识符
变量,函数,类和对象的名称都是标识符,程序员需要标识和使用的东西都需要标识符。在 Java 语言里, 标识符以字符或_,$ 开头, 后面可以包含数字,标识符是大小写有区别的, 没有长度限制。
有效的标识符 mynameict_networkHello_sys_path$bill
例子:inta_number;char_onechar;float$bill;
关键词 abstractcontinuefornewswitch
booleandefaultgotonullsynchronized
breakdoifpackagethis
bytedoubleimplementsprivatethreadsafe
byvalueelseimportprotectedthrow
caseextendsinstanceofpublictransient
catchfalseintreturntrue
charfinalinterfaceshorttry
classfinallylongstaticvoid
constfloatnativesuperwhile
其它保留词以下单词被保留使用:castfuturegenericinner
operatorouterrestvar
3.1.4 数据类型
Java 使用五种基本类型:integer(整数),floating(浮点数),point(指针),Boolean(布尔变量),CharacterorString(字符或字符?reg;)。integer 整数下边给出的数据表示都是整数的例子:4,15,089,0xAD00
整数长度数据类型表示
8bitsbyte
16bitsshort
32bitsint
64bitslong
floating 浮点数下边给出的数据表示都是浮点数的例子:6.37,3.7E15,3e8
浮点数长度数据类型表示
32bitsfloat
64bitsdouble
Boolean 布尔变量下边是布尔变量的两种可能取值:truefalse
Character 字符下边给出的都是字符的例子:a\t(tab)\u????(unicode)
String 字符?reg; 下边给出的都是字符?reg; 的例子:Thisisastringliteral 中国科学院计算所
数组你可以定义任意类型的数组.chars[]; 这是字符型数组;int[]array; 这是整型数组;你还可以定义数组的数组.intblock[][]=newint[2][3]; 数组边界在运行时被检测, 避免堆栈溢出和内存崩溃.
在 Java 里, 数组实际上是一个对象, 数组有一个成员变量:length。你可以用这个成员函数来查看任意数组的长度.inta[][]=newint[10][3]a.length/*10*/a[0].length/*3*/
创建数组在 Java 里创建数组, 你可使用两种基本方法?reg; 一。创建一个空数组:intlist[]=newint[50]; 或你可以用初始数值填充数组.Stringnames[]={ Chenji , Yuan , Chun , Yang 相当于下面功能:Stringnames[];names=newString[4];names[0]=newString(Chenji names[1]=newString(Yuan names[2]=newString(Chun names[3]=newString(Yang
在编译时你不能象下例那样创建静态数组。intname[50];// 将产生一个编译错误
你也不能用 new 操作去填充一个没定义大小的数组。intname[];for(inti=0;i i++){name[i]=i;}
3.1.5 表达式
Java 语言的表达式和 C 语言非常类似。
运算符运算符 (operator) 优先级从高到底排列如下:.[]()++–!~instanceof*/%+- = \==!= ^ ||?:=op=,
整数运算符在整数运算时,如果操作数是 long 类型,则运算结果是 long 类型,否则为 int 类型,绝不会是 byte,short 或 char 型。这样,如果变量 i 被声明为 short 或 byte,i+ 1 的结果会是 int。如果结果超过该类型的取值范围,则按该类型的最大值取模。单目整数运算符是:
运算符操作 - 单目非~位补码 ++ 加 1 – 减 1
++ 运算符用于表示直接加 1 操作。增量操作也可以用加运算符和赋值操作间接完成。++lvalue(左值?copy; 表示 lvalue+=1,++lvalue 也表示 lvalue=lvalue+1(只要 lvalue 没有副作用)。– 运算符用于表示减 1 操作。++ 和 – 运算符既可以作为前缀运算符,也可以做为后缀运算符。双目整数运算符是:
运算符操作 **+ 加 - 减 * 乘 / 除 % 取模 位与|位或 ^ 位异或 左移 右移(带符号) 添零右移
整数除法按零舍入。除法和取模遵守以下等式:(a/b)*b+(a%b)== a 整数算术运算的异常是由于除零或按零取模造成的。它将引发一个算术异常。下溢产生零,上溢导致越界。例如:加 1 超过整数最大值,取模后,变成最小值。一个 op= 赋值运算符,和上表中的各双目整数运算符联用,构成一个表达式。整数关系运算符,,=,=,== 和!= 产生 boolean 类型的数据。
布尔运算符布尔 (boolean) 变量或表达式的组合运算可以产生新的 boolean 值。单目运算符! 是布尔非。双目运算符&,|和 ^ 是逻辑 AND,OR 和 XOR 运算符,它们强制两个操作数求布尔值。为避免右侧操作数冗余求值,用户可以使用短路求值运算符&&和||。用户可以使用 == 和!=,赋值运算符也可以用 =、|=、^=。三元条件操作符?: 和 C 语言中的一样。
浮点运算符浮点运算符可以使用常规运算符的组合:如单目运算符 ++、–,双目运算符 +、-、* 和 /,以及赋值运算符 +=,-=,*=,和 /=。此外,还有取模运算:% 和 %= 也可以作用于浮点数,例如:a%b 和 a -((int)(a/b)*b)的语义相同。这表示 a%b 的结果是除完后剩下的浮点数部分。只有单精度操作数的浮点表达式按照单精度运算求值,产生单精度结果。如果浮点表达式中含有一个或一个以上的双精度操作数,则按双精度运算,结果是双精度浮点数。
数组运算符数组运算符形式如下:expression [expression]可给出数组中某个元素的值。合法的取值范围是从 0 到数组的长度减 1。取值范围的检查只在运行时刻实?copy;。
?reg; 运算符?reg; 以 String 对象实现。运算符 + 完成并?reg; 操作,如果必要则自动把操作数转换为 String 型。如果操作数是一个对象,它可定义一个方法 toString()返回该对象的 String 方式,例如 floata=1.0print(“Thevalueofais”+a+“\n”);+ 运算符用到?reg; 上的例子 Strings=“a=”+a;+= 运算符也可以用于 String。注意,左边 (下例中的 s1) 仅求值一次。s1+=a;//s1=s1+a// 若 a 非 String 型,自动转换为 String 型。
对象运算符双目运算符 instanceof 测试某个对象是否是指定类或其子类的实例。例如:if(myObjectinstanceofMyClass){MyClassanothermyObject=(MyClass)myObject;…}是判定 myObject 是否是 MyClass 的实例或是其子类的实例。
强制和转换 Java 语言和解释器限制使用强制和转换,以防止出错导致系统崩溃。整数和浮点数?reg; 间可以来回强制转换,但整数不能强制转换成数组或对象。对象不能被强制为基本类型。
3.1.6Java 流控制
下面几个控制结构是从 C 语言借鉴的。
分支结构
if/else 分支结构
if(Boolean){statemanets;}else{statements;}
switch 分支结构
switch(expr1){caseexpr2:statements;break;caseexpr3:statements;break;default:statements;break;}
循环结构 for 循环结构
for(initexpr1;testexpr2;incrementexpr3){statements;}
While 循环结构
While(Boolean){statements;}
Do 循环结构
do{statements;}while(Boolean);
一般顺序控制
break[label]continue[label]reutrnexpr;label:statement;
for 循环例子下面是一个程序例子,画几条线,分别用红, 绿, 蓝颜色,这段程序可能是 Java 函数的一部分:
intcount;for(count=1;count count++){switch(count%3)}case0:setColor(Color.red);break;case1:setColor(Color.blue);break;case2:setColor(Color.green);break;}g.drawLine(10,count*10,80,count*10);}
3.2Java 变量和函数的实例
Java 的类包含变量和函数。数据变量可以是一?copy; 原始的类型, 如 int,char 等。成员函数是一?copy; 可执行的过程。例如, 下面程序里:publicclassClassOne{inti;publicClassOne(){i=10;}
publicvoidAdd_i(intj){i=i+j;}}
ClassOne 包含一个变量 i 和两个成员函数,ClassOne(intfirst)和 Add_i(intj)。
成员函数成员函数是一?copy; 可被其它类或自己类调用的处理子程序。一个特殊的成员函数叫构造函数, 这个函数名称一般与本类名程相同。它没有返回值。
构造函数和成员函数当你在 Java 里定义一个类时, 你可定义一个或多个可选的构造函数, 当创建本类的一个对象时用某一个构造函数来初始化本对象。用前面的程序例子来说明, 当 ClassOne 类创建一个新实例时, 所有成员函数和变量被创建(创建实例)。构造函数被调用。ClassOnemc:mc=newClassOne();
关键词 new 用来创建一个类的实例, 一个类用 new 初始化?reg; 前并不占用内存, 它只是一个类型定义, 当 mc 对象初始化后,mc 对象里的 i 变量等于 10。你可以通过对象名来引用变量 i。(有时称?reg; 为实例变量)mc.i++;//mc 实例变量加 1 因为 mc 有 ClassOne 类的所有变量和成员函数,我们可以使用同样的语法来调用成员函数 Add_i:Add_i(10); 现在 mc.i 变量等于 21.
结束函数 Java 并不支持析构函数(C++ 里的定义), 因为 java 本身提?copy; 对象无用时自动清除的功能, 同时它也提?copy; 了一个自动拉圾箱的成员函数,在清除对象时被调用:Protectedvoidfinalize(){close();}
3.3 对象有效范围和废物自动回收
对象有一定的生命期并在它的生命期间使用资源, 当一个对象不再被使用时, 它应释放内存, 避免内存溢出。在 Java 里, 收集和释放内存是一个叫自动废品回收站的线程的责任。这个线程监视对象有效范围并给一个走出有效范围的对象作上标识。
例如:Strings;// 没有分配内存 s =newString(oldstring // 分配内存 s = newstring // 重新分配内存(创建新对象)
我们将在以后访问 String 类时将更加明白它的工作过程, 但它的快速工作过程是这样的:1. 创建一个新的 String 类对象并填充以 oldstring 2. 创建另一个 String 对象并填充以 newstring 注意我们创建了两个对象。Stirng 对象 oldstring Stirng 对象 newstring
在第三条语句里, 第一个包括 oldstring 的叫做 s 的对象已走出了有效范围, 没有任何方法可以再访问他, 我们现在有一个新的对象也叫 s, 包含 newstring。在下一个废品回收线程, 前一个对象将被标识并清除。
3.4 子类
子类是利用存在的对象创建一个新对象的机制, 比如, 如果你有一个 Horse 类, 你可以创建一个 Zebra 子类,Zebra 是 Horse 的一种。
classZebraextendsHorse{intnumber_OF_stripes:}
关键词 extends 来定义对象有的子类.Zebra 是 Horse 的子类。Horse 类里的所有特征都将拷贝到 Zebra 类里, 而 Zebra 类里可以定义自己的成员函数和实例变量。Zebra 称为 Horse 的派生类或继承。另外, 你也许还想覆盖基类的成员函数。用 ClassOne 说明, 下面是一个派生类覆盖 Add_i 功能的例子.
importClassOne;publicclassNewClassextendsClassOne{publicvoidAdd_i(intj){i=i+(j/2);}}
当 NewClass 类的实例创建时, 变量 i 初始化值为 10, 但调用 Add_i 产生不同的结果。NewClassmnc;mnc=newNewClass();mnc.Add_i(10);
访问控制 Java 里当你创建一个新类时, 你可以标明变量和成员函数的访问层次。
publicpublicvoidAnyOneCanAccess(){}public 实例变量和成员函数可以任意其它类调用。
protectedprotectedvoidOnlySubClasses(){}protected 实例变量和成员函数只能被其子类调用.
privateprivateStringCreditCardNumber;private 实例变量和成员函数只能在本类里调用.
friendlyvoidMyPackageMethod(){}缺省的, 如果没有定义任何防火控制, 实例变量或函数缺省定义成 friendly, 意味着可以被本包里的任意对象防问, 但其它包里的对象不可防问。
静态成员函数和变量有?copy; 时候, 你创建一个类, 希望这个类的所有实例都公用一个变量。也就是说, 所有这个类的对象都只有实例变量的同一个拷贝。这种方法的关键词是 static,例如:
classBlock{staticintnumber=50;}
所有从 Block 类创建的对象的 number 变量值都是相同的。无任在哪个对象里改变了 number 的值, 所有对象的 number 都跟着改变。同样的, 你可以定义 static 成员函数, 但这个成员函数不能访问非 static 函数和变量。
classBlock{staticintnumber=50;intlocalvalue;staticvoidadd_local(){localvalue++;// 没有运行}staticvoidadd_static(){number++;// 运行}}
3.5this 和 super
访问一个类的实例变量时,this 关键词是指向这个类本身的指针, 在前面 ClassOne 例子中, 我们可以增加构造函数如下:
publicclassClassOne{inti;publicClassOne(){i=10;}
publicClassOne(intvalue)this.i=value;}
publicvoidAdd_i(intj){i=i+j;}}
这里,this 指向 ClassOne 类的指针。如果在一个子类里覆盖了父类的某个成员函数, 但又想调用父类的成员函数, 你可以用 super 关键词指向父类的成员函数。
importClassOne;publicclassNewClassextendsClassOne{publicvoidAdd_i(intj){i=i+(j/2);super.Add_i(j);}}
下面程序里,i 变量被构造函数设成 10, 然后 15,最后被父类 (ClassOne) 设成 25。
NewClassmnc;mnc=newNewClass();mnc.Add_i(10);
3.6 类的类型
至今为止, 我用在类前面只用了一个 public 关键词, 其实它有下面 4 种选择:
abstract 一个 abstract 类必须至少有一个虚拟函数, 一个 abstract 类不能直接创建对象, 必须继承子类后才能。
final 一个 final 类声明了子类链的结尾, 用 final 声明的类不能再派生子类。
publicpublic 类能被其它的类访问。在其它包里, 如果想使用这个类必须先 import, 否则它只能在它定义的 package 里使用。
synchronicable 这个类标识表示所有?copy; 类的成员函数都是同步的。
3.7 抽象类
面向对象的一个最大优点就是能够定义怎样使用这个类而不必真正定义好成员函数。如果程序由不同的用户实现时是很有用的,这不需用户使用相同的成员函数名。
在 java 里 Graphics 类里一个 abstract 类的例子如下:publicabstractclassGraphics{publicabstractvoiddrawLine(intx1,inty1,intx2,inty2);publicabstractvoiddrawOval(intx,inty,intwidth,intheight);publicabstractvoiddrawRect(intx,inty,intwidth,intheight);…}
在 Graphics 类里声明了几个成员函数, 但成员函数的实际代码是在另外一?copy; 地方实现的。
publicclassMyClassextendsGraphics{publicvoiddrawLine(intx1,inty1,intx2,inty2){画线程序代码}}
当一个类包含一个 abstract 成员函数, 这个类必须定义为 abstract 类。然而并不是 abstract 类的所有的成员函数都是 abstract 的。Abstract 类不能有私有成员函数(它们不能被实现), 也不能有静态成员函数。
3.8 接口
当你确定多个类的操作方式都很相象时,abstract 成员函数是很有用的。但如果你需要使用这?copy;abstract 成员函数,必须创建一个新类,这样有时很繁琐。接口提?copy; 了一种抽象成员函数的有利方法。一个接口包含了在另一个地方实现的成员函数的收集。成员函数在接口里定义为 public 和 abstract。接口里的实例变量是 public,static 和 final。接口和抽象的主要区别是一个接口提?copy; 了封装成员函数协议的方法而不必强迫用户继承类。
例子:publicinterfaceAudiClip{//Startplayingtheclip.voidplay();//Playtheclipinaloop.voidloop();//Stopplayingtheclipvoidstop();}
想使用 AudioClip 接口的类使用 implenents 关键词来提?copy; 成员函数的程序代码。classMyClassimplementsAudioClip{voidplay(){实现代码}voidloop 实现代码 }voidstop 实现代码 }}
优点一个接口类可以被任意多的类实现,每个类可以共享程序接口而不必关心其它类是怎样实现的。classMyOtherClassimplementsAudioClip{voidstop(){实现代码}…}
内部成员函数 Java 还提?copy; 了调用 C 和 C ++ 函数的方法。用 native 关键词来定义 C 和 C ++ 的函数。
publicclassDate{intnow;publicDate(){now=time();}privatenativeinttime();
static{System.loadLibrary( time}}
一?copy;Java 代码写好后, 就需要以下步骤执行:1. 用 javah 来创建头文件(.h)2. 用 javah 来创建 stub 文件 3. 用 C 和 C ++ 写 native 成员函数的代码 4. 编译 stub 文件和.C 文件成一个动态可加载库 5. 用 java 运行 java 程序或 appletviewer 运行 applet
注意:Native 成员函数超出了类的范围。
3.9 包(Packages)
包 (Package) 由一组类 (class) 和界面 (interface) 组成。它是管理大型名字空间,避免名字冲突的工具。每一个类和界面的名字都包含在某个包中。按照一般的习惯,它的名字是由“.”号分隔的单词构成,第一个单词通常是开发这个包的组织的名称。
定义一个编译单元的包编译单元的包由 package 语句定义。如果使用 package 语句,编译单元的第一行必须无空格,也无注释。其格式如下:packagepackageName; 若编译单元无 package 语句,则该单元被置于一个缺省的无名的包中。
使用其它包中的类和界面在 Java 语言里提?copy; 一个包可以使用另一个包中类和界面的定义和实现的机制。用 import 关键词来标明来自其它包中的类。一个编译单元可以自动把指定的类和界面输入到它自己的包中。在一个包中的代码可以有两种方式来定义来自其它包中的类和界面:* 在每个引用的类和界面前面给出它们所在的包的名字;// 前缀包名法 acme.project.FooBarobj=newacme.project.FooBar();* 使用 import 语句,引入一个类或一个界面,或包含它们的包。引入的类和界面的名字在当前的名字空间可用。引入一个包时,则该包所有的公有类和界面均可用。其形式如下:// 从 acme.project 引入所有类 importacme.project.*; 这个语句表示 acme.project 中所有的公有类被引入当前包。以下语句从 acme.project 包中进入一个类 Employec_List。// 从 acme.project 而引入 Employee_Listimportacme.project.Employee_list;Employee_Listobj=newEmployee_List(); 在使用一个外部类或界面时,必须要声明该类或界面所在的包,否则会产生编译错误。
import(引用)类包 (classpackage) 用 import 关键词调入, 指定 package 名字如路径和类名, 用 * 匹配符可以调入多于一个类名。
importjava.Date;importjava.awt.*;
如果 java 源文件不包含 package, 它放在缺省的无名 package。这与源文件同目录,类可以这样引入:importMyClass。
Java 系统包:Java 语言提?copy; 了一个包含窗口工具箱,实用程序,一般 I /O, 工具和网络功能的包。
java.applet 这个包包含量了一?copy; 设计 applet 的类, 用一个类 Applet 和三个接口.AppletContext;AppletStub; 和 AudioClip.
java.awt 另一个窗口工具箱包.awt, 包含了一?copy; 产生装饰物和 GUI 成员的类。这个 package 包括:Button,Checkbox,Choice,Component,Graphics,Menu,Pane1,TextArea 和 TextField。
java.ioI/Opackage 包含文件输入 / 输出类,FileInputStream 和 FileOutputStream.
java.lang 这个包包含 Java 语言类, 包含: 对象, 线程, 异常出口, 系统, 整数, 原点, 数学, 字符等。
java.net 这个类支持 TCP/IP 网络协议,并包含 Socket 类,URL 和 URL 相联系的类。
java.util 这个类包含一?copy; 程序的同步类, 它包含 Date,Dictionary 类等。
3.10 异常
当在 Java 程序中发生一个错误时,例如:一个变元的值非法,代码会发现这个错误,并引发一个异常 (exception)。在缺省的情况下,异常会输出一个错误消息,然后中止线程的执行。但是,程序自己可以定义异常处理段(exceptionhandler) 来截获 (catch) 异常,并从错误中恢复。有一?copy; 异常是由 Java 解释器在运行时刻引发的。实际上,任何类都可以定义属于自己的异常,并使用 throw 语句引发它们。一个 throw(引发?copy; 语句是由 throw 关键字和一个对象构成。按常规,该对象应该是 Exception 类的实例或其子类的实例。throw 语句会引起执行转向相应的异常处理段。当一个 throw 语句执行时,它下面的所有代码不再执行了,它所在的方法也不再返回值。下面的例子将演示如何创建一个 Exception 的子类,然后引发一个异常。classMyExceptionextendsException{}classMyClass{voidoops(){if(/* 不出现错误 */){…}else{/* 出错 */
}else{/* 出错 */thrownewMyException();}}}为了定义一个异常处理段,程序必须用 try 语句把可能产生异常的代码成组。在 try 语句后面跟上一个或多个 catch(截获?copy; 语句,每个异常对应一个 catch 语句。每个 catch 语句中包含着异常处理段。例如:try{p.a=10;}catch(NullPointerExceptione){println(“pwasnull”);}catch(Exceptione){println(“othererrorsoccured”);}catch(Objectobj){println(“Whothrewthatobject?”);}catch 语句和一个方法定义类似,只不过该方法只有一个参数,且无返回类型。参数可以是一个类或一个界面。当一个异常发生时,嵌套的 try/catch 语句会寻找出与该异常类相匹配的参数。如果一个参数和指定异常匹配则:* 该参数和指定的异常是同一个类,或 * 该参数是指定异常的子类,或 * 如果参数是一个界面,指定异常类实现了这个界面。第一个参数和异常匹配的 try/catch 语句,则与其匹配的 catch 语句执行。在 catch 语句执行完后,程序的执行被恢复。但已不可能恢复到异常发生处再次执行。例如:print(now try{print( is thrownewMyException();print(a}catch(MyExceptione){print( the}print(time\n 打印为“nowisthetime”。正如这个例子所示,异常应该主要用于错误处理,若用于其它方面会使代码晦涩难?reg;。异常处理段是可以嵌套的,允许异常处理可以发生在多个地方。嵌套异常处理通常用于当第一个处理程序无法完全从错误中恢复过来的时候,而不得不执行一?copy; 清除代码。为了把异常处理控制传递给更高层的处理段,可以再一次对截获对象实?copy;throw 操作。注要再次实?copy;throw 异常的方法,throw 语句执行完后,会终止执行。try{f.open();}catch(Exceptione){f.close();throwe;}
定局语句 finally(定局?copy; 语句是用于保证无论在异常是否发生的情况下,某?copy; 代码被执行。下例说明 finally 语句的用法:try{// 做某?copy; 动作;}finally{// 此后清除;}和以下代码类似 try{// 做某?copy; 动作}catch(Objecte){// 此后清除;throwe;}
}// 此后清除;即使 try 块中包含 return,break,continue,throw 语句,finally 语句也会被执行。例如:下面的代码“finally”总是被输出,而“aftertry”仅在 a!=10 时被输出。try{if(a==10){return;}}finally{print( finally\n }print( aftertry\n
运行时刻异常本节列出的清单是 Java 解释器引发的各种异常。当运行时刻发现各种错误,由解释器引发异常。
ArithmeticException 如果程序试图除 0,或用 0 取模,会产生 ArithmeticException(算术异常?copy;,其它算术操作不会产生异常。有关 Java 如何处理其它算术错误的信息,见“整数运算符”和“浮点运算符”两节。例如:下面的代码将会引发 ArithmeticException 异常:classArith{publicstaticvoidmain(Stringargs[]){intj=0;j=j/j;}}
NullPointerException 当程序试图访问一个空对象中的变量或方法,或一个空数组中的元素时则引发 NullPointerException(空指针异常?copy;。例如,访问长度为 0 的数组 a[0]。有以下类声明,运行时会引发 NullPointerException 异常:classNull{publicstaticvoidmain(Stringargs[]){Stringo=null;inta[]=null;o.length();a[0]=0;}}有趣的是,如果我们引发一个空对象,也会产一 NullPointerException 异常。
IncompatibleClassChangeException 当一个类的定义被改变,而引用该类的其它类没有被重新编译时,会产生这一异常。有四种类更改会导致运行时刻引发 IncompatibleClassChangException 异常。* 一个类中的变量声明由 static 变成非 static,而其它访问该类这一变量的类没有被重新编译。* 一个类中的变量声明由非 static 变成 static,而其它访问该类这一变量的类没有被重新编译。* 类中声明的某个域被删除,而其它访问该域的类没有被重新编译。* 类中声明的某个方法被删除,而其它访问该方法的类没有被重新编译。
ClassCastException 如果试图把对象 o 强制成 ClassC,而 o 既不是 ClassC 的实例,也不是 ClassC 子类的实例,这时便会产生 ClassCastException。classClassCast{publicstaticvoidmain(Stringargs[]){Objecto=newObject();Strings=(string)o;s.length();}}
}
NagativeArraySizeException 如果一个数组的长度是负数,则会引发 NagativeArraySizeException(数组负下标?copy; 异常。例如下面类定义的代码在运行时引发这一异常:classNegArray{publicstaticvoidmain(Stringargs[]){inta[]=newint[-1];a[0]=0;}}
OutOfMemoryException 当系统无法再向应用程序提?copy; 内存时,会引发 OutOfMemoryException(内存溢出?copy; 异常。这种异常只能出现在创建新对象的时候,即 new 被调用的时候。例如,下面一段代码在运行时刻会引发 OutOfMemoryException 异常:classLink{inta[]=newint[1000000];Linkl;}ClassOutOfMem{publicstaticvoidmain(Stringargs[]){
publicstaticvoidmain(Stringargs[]){Linkroot=newlink();Linkcur=root;while(true){cur.l=newLink();cur=cur.l;}}}
NoClassDefFoundException 如果一个类被引用,但在运行时刻,系统没有找到被引用的类,这时会引发 NoClassDefFoundException(未找到类定义?copy; 异常。例如,NoClass 类的声明如下:classNoClass{publicstaticvoidmain(Stringargs[]){Cc=newC();}}当 NoClass 运行时,如果解释器找不到 C 类,则会产生 NoClassDefFoundException。注意,在 NoClass 被编译时 C 类一定要存在。
IncompatibleTypeException 如果试图为一界面作实例,则会引发 IncompatibleTypeException(类型不兼容?copy; 异常。例如,下面的代码会引发一个 IncompatibleTypeException。InterfaceI{}classIncompType{publicstaticvoidmain(Stringargs[]){Ir=(I)new(I}}
ArrayIndexOutOfBoundsException 试图访问数组中的一个非法元素时,会引发 ArrayIndexOutOfBoundsException(数组索引越界?copy; 异常。例如:ClassArrayOut{publicstaticvoidmain(Stringargs[]){inta[]=newint[0];a[0]=0;}}
publicstaticvoidmain(Stringargs[]){inta[]=newint[0];a[0]=0;}}UnsatisfiedLinkException 如果一个方法被声明为本机,但该方法在运行时刻却不能连接到一个例程体上去时,会产生 UnsatisfiedLinkException(无法连接?copy; 异常。例如:ClassNoLink{staticnativevoidfoo();publicstaticvoidmain(Stringargs[]){foo();}}
InternalExceptionInternalException(内部?copy; 异常是不能被引发的。只有在运行失败作一致性检查时,才会引发这个异常。
关于 Java 程序设计基础是怎样的就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。