------- android培訓(xùn)、java培訓(xùn)、期待與您交流! ----------
創(chuàng)新互聯(lián)長期為上1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為云城企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、網(wǎng)站制作,云城網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
異常:
是什么?是對問題的描述。將問題進(jìn)行對象的封裝。
-----------------------------------------------------
異常體現(xiàn):
Throwable
|--Error
|--Exception
|--RuntimeException
異常體系的特點(diǎn):異常體系中的所有類以及建立的對象都具備可拋性。也就是說可以被throw和throws關(guān)鍵字所操作。只有異常體系具備這個(gè)特點(diǎn)。
-------------------------------------------------------
throw和throws的用法:
throw定義在函數(shù)內(nèi),用于拋出異對象。
throws定義在函數(shù)上,用于拋出異常類,可以拋出多個(gè),用逗號隔開。
當(dāng)函數(shù)內(nèi)容有throw拋出異常對象,并未進(jìn)行try處理。必須要在函數(shù)上聲明,都在編譯失敗。
注意,RuntimeException除外。也就是說函數(shù)內(nèi)如果拋出RuntimeException異常,函數(shù)上可以不用聲明。
------------------------------------------------------
異常有兩種:
編譯時(shí)被檢測異常:
該異常在編譯時(shí),如果沒有處理(沒有throw也沒有try),編譯失敗。
運(yùn)行時(shí)異常(編譯時(shí)不檢測):
在編譯時(shí),不需要處理,編譯器不檢查。該異常的發(fā)生,建議不處理,讓程序停止。需要對代碼進(jìn)行修正。
如果函數(shù)聲明了異常,調(diào)用者需要進(jìn)行處理。處理方法可以throws,可以try。
--------------------------------------------------
異常處理語句:
try
{
需要被檢測的代碼;
}
catch ()
{
處理異常的代碼;
}
finally
{
一定會執(zhí)行的代碼;
}
有三個(gè)結(jié)合格式:
1.try
{
}
catch ()
{
}
2.try
{
}
catch ()
{
}
finally
{
}
3.try
{
}
finally
{
}
注意:
1,finally中定義的通常是 關(guān)閉資源代碼。因?yàn)橘Y源必須釋放。
2,finally只要一種情況不會執(zhí)行。當(dāng)執(zhí)行到System.exit(0);finally不會執(zhí)行。
--------------------------------------------
自定義異常:
定義類繼承Exception或者RuntimeException
1,為了讓該自定義類具備可拋性。
2,讓該類具備操作異常的共性方法。
當(dāng)要定義自定義異常的信息時(shí),可以使用父類已經(jīng)定義好的功能。
將信息傳遞給父類構(gòu)造函數(shù)。
class MyException extends Exception
{
MyException(String message)
{
super(message);
}
}
自定義異常:安卓java面向?qū)ο蟮乃枷?,將程序中出現(xiàn)的特有問題進(jìn)行封裝。
-------------------------------------------
異常的好處:
1,將問題進(jìn)行封裝。
2,將正常流程代碼和問題處理代碼相分離,方便于閱讀。
-------------------------------------------
異常的處理原則:
1,處理方式有兩種:try或者throws。
2,調(diào)用到拋出異常的功能時(shí),拋出幾個(gè)就處理幾個(gè)。
一個(gè)try對應(yīng)多個(gè)catch。
3,多個(gè)catch,父類的catch放到最下面。
4,catch內(nèi),需要定義針對性的處理方式。不要簡單的定義printStackTrace,輸出語句。也不要不寫。
5,當(dāng)捕獲到的異常,本功能處理不了時(shí),可以繼續(xù)在catch中拋出。
try
{
throw newAException();
}
catch (AException e)
{
throw e;
}
如果該異常處理不了,但并不屬于該功能出現(xiàn)的異常。可以將異常轉(zhuǎn)換后,在拋出和該功能相關(guān)的異常。
或者異??梢蕴幚恚?dāng)需要將異常產(chǎn)生的和本功能相關(guān)的問題提供出去。當(dāng)調(diào)用者知道,并處理。也可以將捕獲異常處理后,轉(zhuǎn)換新的異常。
try
{
throw new AException();
}
catch (AException e)
{
//對AException處理。
throw new BException();
}
比如:匯款的例子。
-------------------------------------------
異常的注意事項(xiàng):
在子父類覆蓋時(shí):
1,子類拋出的異常必須是父類的異常的子類或者子集。
2,如果父類或者接口沒有異常拋出時(shí),子類覆蓋出現(xiàn)異常只能try不能throw。
示例:ExceptionTest.java 老師用電腦上課。
/* 畢老師用電腦上課。 開始思考上課中出現(xiàn)的問題:電腦藍(lán)屏,電腦冒煙。 當(dāng)冒煙發(fā)生后,老師不能繼續(xù)講課。出現(xiàn)了講師的問題,課時(shí)計(jì)劃無法完成。 思路: 定義兩個(gè)類,老師和電腦。 老師有姓名,上課方法(使用電腦上課), 電腦冒煙時(shí),講師有無法完成課時(shí)計(jì)劃的問題。 電腦有運(yùn)行方法、重啟方法。 考慮電腦可能出現(xiàn)的問題:電腦藍(lán)屏,電腦冒煙,定義兩個(gè)異常類。 */ class LanPingException extends Exception { LanPingException(String message) { super(message); } } class MaoYanException extends Exception { MaoYanException(String message) { super(message); } } class NoPlanException extends Exception { NoPlanException(String message) { super(message); } } class Teacher { private String name; private Computer cmpt; Teacher(String name) { this.name = name; cmpt = new Computer(); } public void prelect()throws NoPlanException { try { cmpt.run();//調(diào)用拋出異常的run方法 } catch (LanPingException e) { cmpt.reset(); } catch (MaoYanException e) { test(); throw new NoPlanException("課時(shí)無法繼續(xù)"+e.getMessage());//處理不了,拋出異常,方法上拋出。 } System.out.println("講課"); } public void test() { System.out.println("練習(xí)"); } } class Computer { private int state = 3;//代表電腦的狀態(tài)。 public void run()throws LanPingException,MaoYanException { if (state == 2) throw new LanPingException("藍(lán)屏了"); if (state == 3) throw new MaoYanException("冒煙了"); System.out.println("電腦運(yùn)行"); } public void reset() { state = 1;//電腦恢復(fù)到正常狀態(tài)。 System.out.println("電腦重啟"); } } class ExceptionTest { public static void main(String[] args) { Teacher t = new Teacher("畢老師"); try { t.prelect(); } catch (NoPlanException e) { System.out.println(e.toString()); System.out.println("換老師或者放假"); } } }
示例:ExceptionTest1.java 圖形面積。
/* 有一個(gè)圓形和長方形。 都可以獲取面積。對于面積如果出現(xiàn)非法數(shù)值,視為是獲取面積出現(xiàn)問題。 問題通過一次來表示。 先要對這個(gè)程序進(jìn)行基礎(chǔ)設(shè)計(jì)。 思路: 1,定義抽象圖形類(或接口),獲取面積方法。 2,圓形,長方形類繼承圖形類。 3,對問題進(jìn)行描述。 */ class NoValueException extends RuntimeException { NoValueException(String message) { super(message); } } interface Shape { void getArea(); } class Rec implements Shape { private int len,wid; Rec(int len,int wid)//throws NoValueException { if (len<=0 || wid <= 0) throw new NoValueException("非法值"); this.len = len; this.wid = wid; } public void getArea() { System.out.println(len*wid); } } class Circle implements Shape { public static final double PI = 3.14; private int radius; Circle(int radius) { if (radius <=0) throw new NoValueException("非法半徑"); this.radius = radius; } public void getArea() { System.out.println(radius*radius*PI); } } class ExceptionTest1 { public static void main(String[] args) { /* try { Rec r = new Rec(-3,4); r.getArea(); } catch (NoValueException e) { System.out.println(e.toString()); } */ //Rec r = new Rec(-3,4); //r.getArea(); Circle c = new Circle(-3); c.getArea(); } }
包:
定義包用package關(guān)鍵字。
1:對類文件進(jìn)行分類管理。
2:給類文件提供多層名稱空間。
如果生成的包不在當(dāng)前目錄下,需要最好執(zhí)行classpath,將包所在父目錄定義到classpath變量中即可。
一般在定義包名時(shí),因?yàn)榘某霈F(xiàn)是為了區(qū)分重名的類。所以包名要盡量唯一。怎么保證唯一性呢?可以使用url域名來進(jìn)行包名稱的定義。
package pack;//定義了一個(gè)包,名稱為pack。 注意:包名的寫法規(guī)范:所有字母都小寫。
//package cn.itcast.pack.demo;
類的全名稱是 包名.類名
編譯命令:javac –d 位置(.當(dāng)前路徑) java源文件 (就可以自動生成包)
包是一種封裝形式,用于封裝類,想要被包以外的程序訪問,該類必須public;類中的成員,如果被包以外訪問,也必須public;
包與包之間訪問可以使用的權(quán)限有兩種:
1:public
2:protected:只能是不同包中的子類可以使用的權(quán)限。
java中的四種權(quán)限:
范圍 public protected default private
同一個(gè)類中 ok ok ok ok
同一包中 ok ok ok
子類 ok
不同包中 ok
----------------------------------------------------
Import- 導(dǎo)入:類名稱變長,寫起來很麻煩。為了簡化,使用了一個(gè)關(guān)鍵字:import,可以使用這個(gè)關(guān)鍵字導(dǎo)入指定包中的類。記住:實(shí)際開發(fā)時(shí),到的哪個(gè)類就導(dǎo)入哪個(gè)類,不建議使用*.
import packa.*;//這個(gè)僅僅是導(dǎo)入了packa當(dāng)前目錄下的所有的類。不包含子包。
import packa.abc.*;//導(dǎo)入了packa包中的子包abc下的當(dāng)前的所有類。
如果導(dǎo)入的兩個(gè)包中存在著相同名稱的類。這時(shí)如果用到該類,必須在代碼中指定包名。
常見的軟件包:
java.lang : language java的核心包,Object System String Throwable jdk1.2版本后,該包中的類自動被導(dǎo)入。
java.awt : 定義的都是用于java圖形界面開發(fā)的對象。
javax.swing:提供所有的windows桌面應(yīng)用程序包括的控件,比如:Frame , Dialog, Table, List 等等,就是java的圖形界面庫。
java.net : 用于java網(wǎng)絡(luò)編程方面的對象都在該包中。
java.io : input output 用于操作設(shè)備上數(shù)據(jù)的對象都在該包中。比如:讀取硬盤數(shù)據(jù),往硬盤寫入數(shù)據(jù)。
java.util : java的工具包,時(shí)間對象,集合框架。
java.applet: application+let 客戶端java小程序。server+let --> servlet 服務(wù)端java小程序。
jar :java的壓縮包,主要用于存儲類文件,或者配置文件等。
命令格式:jar –cf 包名.jar 包目錄
解壓縮:jar –xvf 包名.jar
將jar包目錄列表重定向到一個(gè)文件中:jar –tf 包名.jar >c:\1.txt