這種講法不夠科學(xué),在Nicholas的javascript for web developers中講得比較科學(xué)
{
background:orange; /*for all (包括FF)*/
background:red\0; /*for ie8*/
*background:green; /*for ie7,ie6*/
_background:blue; /*for ie6 ,注意,這個(gè)會(huì)重寫前面*background的樣式*/
}
Java里有個(gè)很重要的特色是Exception ,也就是說允許程序產(chǎn)生例外狀況。而在學(xué)Java 的時(shí)候,我們也只知道Exception 的寫法,卻未必真能了解不同種類的Exception 的區(qū)別。
首先,您應(yīng)該知道的是Java 提供了兩種Exception 的模式,一種是執(zhí)行的時(shí)候所產(chǎn)生的Exception (Runtime Exception),另外一種則是受控制的Exception (Checked Exception)。
所有的Checked Exception 均從java.lang.Exception 繼承而來,而Runtime Exception 則繼承java.lang.RuntimeException 或java.lang.Error (實(shí)際上java.lang.RuntimeException 的上一層也是java.lang.Exception)。
當(dāng)我們撰寫程序的時(shí)候,我們很可能會(huì)對(duì)選擇某種形式的Exception 感到困擾,到底我應(yīng)該選擇Runtime Exception 還是Checked Exception ?
其實(shí),在運(yùn)作上,我們可以通過Class 的Method 如何產(chǎn)生某個(gè)Exception以及某個(gè)程序如何處理這個(gè)被產(chǎn)生來的Exception 來了解它們之間的差異。
首先我們先建立一個(gè)Exception
public class CException extends Exception
{
public CException() {}
public CException(String message)
{
super(message);
}
}
然后我們撰寫一個(gè)可能產(chǎn)生 CException 的 Class
public class testException
{
public void method1() throws CException
{
throw new CException("Test Exception");
}
public void method2(String msg)
{
if(msg == null)
{
throw new NullPointerException("Message is null");
}
}
public void method3() throws CException
{
method1();
}
// 以下省略
// ...
}
在這三個(gè)method 中,我們看到了method1 和method2 的程序碼內(nèi)都會(huì)產(chǎn)生Exception,但method3 的程序碼中(大括號(hào)內(nèi)),并沒產(chǎn)生Exception,但在method3 的定義中,暗示了這個(gè)method 可能產(chǎn)生CException。
呼叫method1() 的程序,必須將method1() 包含在try 與catch 中,如:
public class runtest
{
// ....
public static void main(String argv[])
{
testException te = new testException();
try
{
te.method1();
}
catch(CException ce)
{
// ....
}
}
// ...
}
雖然包含在try 與catch 中,并不表示這段程序碼一定會(huì)收到CException,但它的用意在于提醒呼叫者,執(zhí)行這個(gè)method 可能產(chǎn)生的意外,而使用者也必須要能針對(duì)這個(gè)意外做出相對(duì)應(yīng)的處理方式。
當(dāng)使用者呼叫method2() 時(shí),并不需要使用try 和catch 將程序碼包起來,因?yàn)閙ethod2 的定義中,并沒有throws 任何的Exception ,如:
public class runtest
{
// ....
public static void main(String argv[])
{
testException te = new testException();
// 不會(huì)產(chǎn)生 Exception
te.method2("Hello");
// 會(huì)產(chǎn)生 Exception
te.method2(null);
}
// ...
}
程序在執(zhí)行的時(shí)候,也不見得會(huì)真的產(chǎn)生NullPointerException ,這種Exception 叫做runtime exception 也有人稱為unchecked exception ,產(chǎn)生Runtime Exception 的method (在這個(gè)范例中是method2) 并不需要在宣告method 的時(shí)候定義它將會(huì)產(chǎn)生哪一種Exception 。
在testException 的method3() 中,我們看到了另外一種狀況,也就是method3里呼叫了method1() ,但卻沒有將method1 包在try 和catch 之間。相反,在method3() 的定義中,它定義了CException,實(shí)際上就是如果method3 收到了CException ,它將不處理這個(gè)CException ,而將它往外丟。當(dāng)然,由于method3 的定義中有throws CException ,因此呼叫method3 的程序碼也需要有try catch 才行。
因此從程序的運(yùn)作機(jī)制上看,Runtime Exception與Checked Exception 不一樣,然而從邏輯上看,Runtime Exception 與Checked Exception 在使用的目的上也不一樣。
一般而言,Checked Exception 表示這個(gè)Exception 必須要被處理,也就是說程序設(shè)計(jì)者應(yīng)該已經(jīng)知道可能會(huì)收到某個(gè)Exception(因?yàn)橐猼ry catch住) ,所以程序設(shè)計(jì)者應(yīng)該能針對(duì)這些不同的Checked Exception 做出不同的處理。
而Runtime Exception 通常會(huì)暗示著程序上的錯(cuò)誤,這種錯(cuò)誤會(huì)導(dǎo)致程序設(shè)計(jì)者無法處理,而造成程序無法繼續(xù)執(zhí)行下去。
看看下面的例子:
String message[] = {"message1", "message2","message3"};
System.out.println(message[3]);
這段程序碼在Compile 時(shí)并沒問題,但在執(zhí)行時(shí)則會(huì)出現(xiàn)ArrayIndexOutOfBoundException 的例外,在這種狀況下,我們亦無法針對(duì)這個(gè)Runtime Exception 做出有意義的動(dòng)作,這就像是我們呼叫了testException 中的method2 ,卻引發(fā)了它的NullPointerException 一樣,在這種狀況下,我們必須對(duì)程序碼進(jìn)行修改,從而避免這個(gè)問題。
因此,實(shí)際上我們應(yīng)該也必須要去抓取所有的Checked Exception,同時(shí)最好能在這些Checked Exception 發(fā)生的時(shí)候做出相對(duì)應(yīng)的處理,好讓程序能面對(duì)不同的狀況。
然而對(duì)于Runtime Exception ,有些人建議將它c(diǎn)atch 住,然后導(dǎo)向其它地方,讓程序繼續(xù)執(zhí)行下去,這種作法并非不好,但它會(huì)讓我們?cè)谀承y(cè)試工具下認(rèn)為我們的程序碼沒有問題,因?yàn)槲覀儗untime Exception "處理"掉了,事實(shí)卻不然!譬如很多人的習(xí)慣是在程序的進(jìn)入點(diǎn)后用個(gè)大大的try catch 包起來,如:
public class runtest1
{
public static void main(String argv[])
{
try
{
//...
}
catch(Exception e)
{
}
}
}
在這種情況下,我們很可能會(huì)不知道發(fā)生了什么Exception 或是從哪一行發(fā)出的,因此在面對(duì)不同的Checked Exception時(shí),我們可已分別去try catch它。而在測(cè)試階段時(shí),如果碰到Runtime Exception ,我們可以讓它就這樣發(fā)生,接著再去修改我們的程序碼,讓它避免Runtime Exception,否則,我們就應(yīng)該仔細(xì)追究每一個(gè)Exception ,直到我們可以確定它不會(huì)有Runtime Exception 為止!
對(duì)于Checked Exception 與Runtime Exception ,我想應(yīng)該有不少人會(huì)有不同的觀點(diǎn),無論如何,程序先要能執(zhí)行,這些Exception 才有機(jī)會(huì)產(chǎn)生。因此,我們可以把這些Exception 當(dāng)成是Bug ,也可以當(dāng)成是不同的狀況(Checked Exception),或當(dāng)成是幫助我們除錯(cuò)的工具(Runtime Exception),但前提是我們需要處理這些Exception ,如果不處理,那么問題或狀況就會(huì)永遠(yuǎn)留在那里。
用了一段時(shí)間,有米確實(shí)做得不錯(cuò)哦,感謝樓主的推薦!
String就相當(dāng)于是char[]的包裝類。包裝類的特質(zhì)之一就是在對(duì)其值進(jìn)行操作時(shí)會(huì)體現(xiàn)出其對(duì)應(yīng)的基本類型的性質(zhì)。在參數(shù)傳遞時(shí)對(duì)這些包裝類的值操作實(shí)際上都是通過對(duì)其對(duì)應(yīng)的基本類型操作而實(shí)現(xiàn)的。在參數(shù)傳遞時(shí),包裝類采用的是傳值的方式,而不是傳地址的方式,所以函數(shù)中的值改變并不會(huì)影響原來的值。
基本類型的表面特征就是第一個(gè)字母小寫。
8種byte char short int long float double boolean
對(duì)基本數(shù)據(jù)類型賦值存儲(chǔ)了實(shí)際的值,而并非指向一個(gè)對(duì)象。
參數(shù)拷貝是不存在的,應(yīng)該說成是值拷貝
re: Java 泛型 lau 2009-03-05 13:54