這篇文章給大家介紹Java程序設計基礎是怎樣的,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
現在你可以復習一下Java語言的背景材料,它的基本結構象C/C++,但任何用面向過程語言編寫過程序的人都可以了解Java語言的大部分結構.
Java語言的源程序代碼由一個或多個編譯單元(compilationunit)組成,每個編譯單元只能包含下列內容(空格和注釋除外):*一個程序包語句(packagestatement)*入口語句(importstatements)*類的聲明(classdeclarations)*界面聲明(interfacedeclarations)每個Java的編譯單元可包含多個類或界面,但是每個編譯單元最多只能有一個類或者界面是公共的。Java的源程序代碼被編譯之后,便產生了Java字節代碼。Java的字節代碼由一種不依賴于機器的指令組成,這種指令能被Java的運行系統(runtimesystem)有效地解釋。Java的運行系統工作起來如同一臺虛擬機。在當前的Java實現中,每個編譯單元就是一個以.java為后綴的文件。每個編譯單元有若干個類,編譯后,每個類生成一個.class文件。.class文件是Java虛擬機能夠識別的代碼。
三種類型如下://注釋一行/*一行或多行注釋*//**文檔注釋**/
文檔注釋一般放在一個變量或函數定義之前,指示在任何自動生成文檔系統中調入。這種注釋都是聲明條目的描述.。
變量,函數,類和對象的名稱都是標識符,程序員需要標識和使用的東西都需要標識符。在Java語言里,標識符以字符或_,$開頭,后面可以包含數字,標識符是大小寫有區別的,沒有長度限制。
有效的標識符mynameict_networkHello_sys_path$bill
例子:inta_number;char_onechar;float$bill;
關鍵詞abstractcontinuefornewswitch
booleandefaultgotonullsynchronized
breakdoifpackagethis
bytedoubleimplementsprivatethreadsafe
byvalueelseimportprotectedthrow
caseextendsinstanceofpublictransient
catchfalseintreturntrue
charfinalinterfaceshorttry
classfinallylongstaticvoid
constfloatnativesuperwhile
其它保留詞以下單詞被保留使用:castfuturegenericinner
operatorouterrestvar
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<9;i++){name[i]=i;}
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;間可以來回強制轉換,但整數不能強制轉換成數組或對象。對象不能被強制為基本類型。
下面幾個控制結構是從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<=12;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);}
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();}
對象有一定的生命期并在它的生命期間使用資源,當一個對象不再被使用時,它應釋放內存,避免內存溢出。在Java里,收集和釋放內存是一個叫自動廢品回收站的線程的責任。這個線程監視對象有效范圍并給一個走出有效范圍的對象作上標識。
例如:Strings;//沒有分配內存s=newString("oldstring");//分配內存s="newstring";//重新分配內存(創建新對象)
我們將在以后訪問String類時將更加明白它的工作過程,但它的快速工作過程是這樣的:1.創建一個新的String類對象并填充以"oldstring"2.創建另一個String對象并填充以"newstring"注意我們創建了兩個對象。Stirng對象"oldstring"Stirng對象"newstring"
在第三條語句里,第一個包括"oldstring"的叫做s的對象已走出了有效范圍,沒有任何方法可以再訪問他,我們現在有一個新的對象也叫s,包含"newstring"。在下一個廢品回收線程,前一個對象將被標識并清除。
子類是利用存在的對象創建一個新對象的機制,比如,如果你有一個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++;//運行}}
訪問一個類的實例變量時,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);
至今為止,我用在類前面只用了一個public關鍵詞,其實它有下面4種選擇:
abstract一個abstract類必須至少有一個虛擬函數,一個abstract類不能直接創建對象,必須繼承子類后才能。
final一個final類聲明了子類鏈的結尾,用final聲明的類不能再派生子類。
publicpublic類能被其它的類訪問。在其它包里,如果想使用這個類必須先import,否則它只能在它定義的package里使用。
synchronicable這個類標識表示所有?copy;類的成員函數都是同步的。
面向對象的一個最大優點就是能夠定義怎樣使用這個類而不必真正定義好成員函數。如果程序由不同的用戶實現時是很有用的,這不需用戶使用相同的成員函數名。
在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類不能有私有成員函數(它們不能被實現),也不能有靜態成員函數。
當你確定多個類的操作方式都很相象時,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成員函數超出了類的范圍。
包(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類等。
當在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程序設計基礎是怎樣的就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。