導航:首頁 > 源碼編譯 > 編譯器的錯誤處理機制

編譯器的錯誤處理機制

發布時間:2023-09-06 06:12:07

❶ Microsoft VBScript 編譯器錯誤 錯誤 '800a0408' 如何解決

800a0408表示無效的字元

錯誤原因:空格中可能包含中文的空格,代碼中間的那些空格中可能包含中文的空格,雖然都是空格,看起來都差不多,但英文的語言是半形的英文字元,而中文的字元是全形的。

解決辦法

可以把出錯的那行的空格都刪除,用tab鍵或是重新用半形空格來替代,切換英文半形認識如下:

1、在搜狗輸入法的英文狀態下,「英」字後邊的那個符號,為全形半形符號。

❷ 編譯器錯誤怎麼解決

❸ 在java中,異常處理的機制有哪幾種,分別是什麼

1 引子
try…catch…finally恐怕是大家再熟悉不過的語句了,而且感覺用起來也是很簡單,邏輯上似乎也是很容易理解。不過,我親自體驗的「教訓」告訴我,這個東西可不是想像中的那麼簡單、聽話。不信?那你看看下面的代碼,「猜猜」它執行後的結果會是什麼?不要往後看答案、也不許執行代碼看真正答案哦。如果你的答案是正確,那麼這篇文章你就不用浪費時間看啦。

package myExample.testException;

public class TestException {

public TestException() {

}

boolean testEx() throws Exception{

boolean ret = true;

try{

ret = testEx1();

}catch (Exception e){

System.out.println("testEx, catch exception");

ret = false;

throw e;

}finally{

System.out.println("testEx, finally; return value="+ret);

return ret;

}

}

boolean testEx1() throws Exception{

boolean ret = true;

try{

ret = testEx2();

if (!ret){

return false;

}

System.out.println("testEx1, at the end of try");

return ret;

}catch (Exception e){

System.out.println("testEx1, catch exception");

ret = false;

throw e;

}

finally{

System.out.println("testEx1, finally; return value="+ret);

return ret;

}

}

boolean testEx2() throws Exception{

boolean ret = true;

try{

int b=12;

int c;

for (int i=2;i>=-2;i--){

c=b/i;

System.out.println("i="+i);

}

return true;

}catch (Exception e){

System.out.println("testEx2, catch exception");

ret = false;

throw e;

}

finally{

System.out.println("testEx2, finally; return value="+ret);

return ret;

}

}

public static void main(String[] args) {

TestException testException1 = new TestException();

try{

testException1.testEx();

}catch(Exception e){

e.printStackTrace();

}

}

}

你的答案是什麼?是下面的答案嗎?

i=2

i=1

testEx2, catch exception

testEx2, finally; return value=false

testEx1, catch exception

testEx1, finally; return value=false

testEx, catch exception

testEx, finally; return value=false

如果你的答案真的如上面所說,那麼你錯啦。^_^,那就建議你仔細看一看這篇文章或者拿上面的代碼按各種不同的情況修改、執行、測試,你會發現有很多事情不是原來想像中的那麼簡單的。

現在公布正確答案:

i=2

i=1

testEx2, catch exception

testEx2, finally; return value=false

testEx1, finally; return value=false

testEx, finally; return value=false

2 基礎知識
2.1 相關概念
例外是在程序運行過程中發生的異常事件,比如除0溢出、數組越界、文件找不到等,這些事件的發生將阻止程序的正常運行。為了加強程序的魯棒性,程序設計時,必須考慮到可能發生的異常事件並做出相應的處理。C語言中,通過使用if語句來判斷是否出現了例外,同時,調用函數通過被調用函數的返回值感知在被調用函數中產生的例外事件並進行處理。全程變數ErroNo常常用來反映一個異常事件的類型。但是,這種錯誤處理機制會導致不少問題。

Java通過面向對象的方法來處理例外。在一個方法的運行過程中,如果發生了例外,則這個方法生成代表該例外的一個對象,並把它交給運行時系統,運行時系統尋找相應的代碼來處理這一例外。我們把生成例外對象並把它提交給運行時系統的過程稱為拋棄(throw)一個例外。運行時系統在方法的調用棧中查找,從生成例外的方法開始進行回朔,直到找到包含相應例外處理的方法為止,這一個過程稱為捕獲(catch)一個例外。

2.2 Throwable類及其子類
用面向對象的方法處理例外,就必須建立類的層次。類 Throwable位於這一類層次的最頂層,只有它的後代才可以做為一個例外被拋棄。圖1表示了例外處理的類層次。

從圖中可以看出,類Throwable有兩個直接子類:Error和Exception。Error類對象(如動態連接錯誤等),由Java虛擬機生成並拋棄(通常,Java程序不對這類例外進行處理);Exception類對象是Java程序處理或拋棄的對象。它有各種不同的子類分別對應於不同類型的例外。其中類RuntimeException代表運行時由Java虛擬機生成的例外,如算術運算例外ArithmeticException(由除0錯等導致)、數組越界例外等;其它則為非運行時例外,如輸入輸出例外IOException等。Java編譯器要求Java程序必須捕獲或聲明所有的非運行時例外,但對運行時例外可以不做處理。

圖1 例外處理的類層次

2.3 異常處理關鍵字
Java的異常處理是通過5個關鍵字來實現的:try,catch,throw,throws,finally。JB的在線幫助中對這幾個關鍵字是這樣解釋的:

Throws: Lists the exceptions a method could throw.

Throw: Transfers control of the method to the exception handler.

Try: Opening exception-handling statement.

Catch: Captures the exception.

Finally: Runs its code before terminating the program.

2.3.1 try語句
try語句用大括弧{}指定了一段代碼,該段代碼可能會拋棄一個或多個例外。

2.3.2 catch語句
catch語句的參數類似於方法的聲明,包括一個例外類型和一個例外對象。例外類型必須為Throwable類的子類,它指明了catch語句所處理的例外類型,例外對象則由運行時系統在try所指定的代碼塊中生成並被捕獲,大括弧中包含對象的處理,其中可以調用對象的方法。

catch語句可以有多個,分別處理不同類的例外。Java運行時系統從上到下分別對每個catch語句處理的例外類型進行檢測,直到找到類型相匹配的catch語句為止。這里,類型匹配指catch所處理的例外類型與生成的例外對象的類型完全一致或者是它的父類,因此,catch語句的排列順序應該是從特殊到一般。

也可以用一個catch語句處理多個例外類型,這時它的例外類型參數應該是這多個例外類型的父類,程序設計中要根據具體的情況來選擇catch語句的例外處理類型。

2.3.3 finally語句
try所限定的代碼中,當拋棄一個例外時,其後的代碼不會被執行。通過finally語句可以指定一塊代碼。無論try所指定的程序塊中拋棄或不拋棄例外,也無論catch語句的例外類型是否與所拋棄的例外的類型一致,finally所指定的代碼都要被執行,它提供了統一的出口。通常在finally語句中可以進行資源的清除工作。如關閉打開的文件等。

2.3.4 throws語句
throws總是出現在一個函數頭中,用來標明該成員函數可能拋出的各種異常。對大多數Exception子類來說,Java 編譯器會強迫你聲明在一個成員函數中拋出的異常的類型。如果異常的類型是Error或 RuntimeException, 或它們的子類,這個規則不起作用, 因為這在程序的正常部分中是不期待出現的。 如果你想明確地拋出一個RuntimeException,你必須用throws語句來聲明它的類型。

2.3.5 throw語句
throw總是出現在函數體中,用來拋出一個異常。程序會在throw語句後立即終止,它後面的語句執行不到,然後在包含它的所有try塊中(可能在上層調用函數中)從里向外尋找含有與其匹配的catch子句的try塊。

3 關鍵字及其中語句流程詳解
3.1 try的嵌套
你可以在一個成員函數調用的外面寫一個try語句,在這個成員函數內部,寫另一個try語句保護其他代碼。每當遇到一個try語句,異常的框架就放到堆棧上面,直到所有的try語句都完成。如果下一級的try語句沒有對某種異常進行處理,堆棧就會展開,直到遇到有處理這種異常的try語句。下面是一個try語句嵌套的例子。

class MultiNest {

static void procere() {

try {

int a = 0;

int b = 42/a;

} catch(java.lang.ArithmeticException e) {

System.out.println("in procere, catch ArithmeticException: " + e);

}

}

public static void main(String args[]) {

try {

procere();

} catch(java.lang. Exception e) {

System.out.println("in main, catch Exception: " + e);

}

}

}

這個例子執行的結果為:

in procere, catch ArithmeticException: java.lang.ArithmeticException: / by zero

成員函數procere里有自己的try/catch控制,所以main不用去處理 ;當然如果如同最開始我們做測試的例子一樣,在procere中catch到異常時使用throw e;語句將異常拋出,那麼main當然還是能夠捕捉並處理這個procere拋出來的異常。例如在procere函數的catch中的System.out語句後面增加throw e;語句之後,執行結果就變為:

in procere, catch ArithmeticException: java.lang.ArithmeticException: / by zero

in main, catch Exception: java.lang.ArithmeticException: / by zero

3.2 try-catch程序塊的執行流程以及執行結果
相對於try-catch-finally程序塊而言,try-catch的執行流程以及執行結果還是比較簡單的。

首先執行的是try語句塊中的語句,這時可能會有以下三種情況:

1. 如果try塊中所有語句正常執行完畢,那麼就不會有其他的「動做」被執行,整個try-catch程序塊正常完成。

2. 如果try語句塊在執行過程中碰到異常V,這時又分為兩種情況進行處理:

² 如果異常V能夠被與try相應的catch塊catch到,那麼第一個catch到這個異常的catch塊(也是離try最近的一個與異常V匹配的catch塊)將被執行;如果catch塊執行正常,那麼try-catch程序塊的結果就是「正常完成」;如果該catch塊由於原因R突然中止,那麼try-catch程序塊的結果就是「由於原因R突然中止(completes abruptly)」。

² 如果異常V沒有catch塊與之匹配,那麼這個try-catch程序塊的結果就是「由於拋出異常V而突然中止(completes abruptly)」。

3. 如果try由於其他原因R突然中止(completes abruptly),那麼這個try-catch程序塊的結果就是「由於原因R突然中止(completes abruptly)」。

3.3 try-catch-finally程序塊的執行流程以及執行結果
try-catch-finally程序塊的執行流程以及執行結果比較復雜。

首先執行的是try語句塊中的語句,這時可能會有以下三種情況:

1. 如果try塊中所有語句正常執行完畢,那麼finally塊的居於就會被執行,這時分為以下兩種情況:

² 如果finally塊執行順利,那麼整個try-catch-finally程序塊正常完成。

² 如果finally塊由於原因R突然中止,那麼try-catch-finally程序塊的結局是「由於原因R突然中止(completes abruptly)」

2. 如果try語句塊在執行過程中碰到異常V,這時又分為兩種情況進行處理:

² 如果異常V能夠被與try相應的catch塊catch到,那麼第一個catch到這個異常的catch塊(也是離try最近的一個與異常V匹配的catch塊)將被執行;這時就會有兩種執行結果:

² 如果catch塊執行正常,那麼finally塊將會被執行,這時分為兩種情況:

² 如果finally塊執行順利,那麼整個try-catch-finally程序塊正常完成。

² 如果finally塊由於原因R突然中止,那麼try-catch-finally程序塊的結局是「由於原因R突然中止(completes abruptly)」

² 如果catch塊由於原因R突然中止,那麼finally模塊將被執行,分為兩種情況:

² 如果如果finally塊執行順利,那麼整個try-catch-finally程序塊的結局是「由於原因R突然中止(completes abruptly)」。

² 如果finally塊由於原因S突然中止,那麼整個try-catch-finally程序塊的結局是「由於原因S突然中止(completes abruptly)」,原因R將被拋棄。

(注意,這里就正好和我們的例子相符合,雖然我們在testEx2中使用throw e拋出了異常,但是由於testEx2中有finally塊,而finally塊的執行結果是complete abruptly的(別小看這個用得最多的return,它也是一種導致complete abruptly的原因之一啊——後文中有關於導致complete abruptly的原因分析),所以整個try-catch-finally程序塊的結果是「complete abruptly」,所以在testEx1中調用testEx2時是捕捉不到testEx1中拋出的那個異常的,而只能將finally中的return結果獲取到。

如果在你的代碼中期望通過捕捉被調用的下級函數的異常來給定返回值,那麼一定要注意你所調用的下級函數中的finally語句,它有可能會使你throw出來的異常並不能真正被上級調用函數可見的。當然這種情況是可以避免的,以testEx2為例:如果你一定要使用finally而且又要將catch中throw的e在testEx1中被捕獲到,那麼你去掉testEx2中的finally中的return就可以了。

這個事情已經在OMC2.0的MIB中出現過啦:伺服器的異常不能完全被反饋到客戶端。)

² 如果異常V沒有catch塊與之匹配,那麼finally模塊將被執行,分為兩種情況:

² 如果finally塊執行順利,那麼整個try-catch-finally程序塊的結局就是「由於拋出異常V而突然中止(completes abruptly)」。

² 如果finally塊由於原因S突然中止,那麼整個try-catch-finally程序塊的結局是「由於原因S突然中止(completes abruptly)」,異常V將被拋棄。

3. 如果try由於其他原因R突然中止(completes abruptly),那麼finally塊被執行,分為兩種情況:

² 如果finally塊執行順利,那麼整個try-catch-finally程序塊的結局是「由於原因R突然中止(completes abruptly)」。

² 如果finally塊由於原因S突然中止,那麼整個try-catch-finally程序塊的結局是「由於原因S突然中止(completes abruptly)」,原因R將被拋棄。

3.4 try-catch-finally程序塊中的return
從上面的try-catch-finally程序塊的執行流程以及執行結果一節中可以看出無論try或catch中發生了什麼情況,finally都是會被執行的,那麼寫在try或者catch中的return語句也就不會真正的從該函數中跳出了,它的作用在這種情況下就變成了將控制權(語句流程)轉到finally塊中;這種情況下一定要注意返回值的處理。

例如,在try或者catch中return false了,而在finally中又return true,那麼這種情況下不要期待你的try或者catch中的return false的返回值false被上級調用函數獲取到,上級調用函數能夠獲取到的只是finally中的返回值,因為try或者catch中的return語句只是轉移控制權的作用。

3.5 如何拋出異常
如果你知道你寫的某個函數有可能拋出異常,而你又不想在這個函數中對異常進行處理,只是想把它拋出去讓調用這個函數的上級調用函數進行處理,那麼有兩種方式可供選擇:

第一種方式:直接在函數頭中throws SomeException,函數體中不需要try/catch。比如將最開始的例子中的testEx2改為下面的方式,那麼testEx1就能捕捉到testEx2拋出的異常了。

boolean testEx2() throws Exception{

boolean ret = true;

int b=12;

int c;

for (int i=2;i>=-2;i--){

c=b/i;

System.out.println("i="+i);

}

return true;

}

第二種方式:使用try/catch,在catch中進行一定的處理之後(如果有必要的話)拋出某種異常。例如上面的testEx2改為下面的方式,testEx1也能捕獲到它拋出的異常:

boolean testEx2() throws Exception{

boolean ret = true;

try{

int b=12;

int c;

for (int i=2;i>=-2;i--){

c=b/i;

System.out.println("i="+i);

}

return true;

}catch (Exception e){

System.out.println("testEx2, catch exception");

Throw e;

}

}

第三種方法:使用try/catch/finally,在catch中進行一定的處理之後(如果有必要的話)拋出某種異常。例如上面的testEx2改為下面的方式,testEx1也能捕獲到它拋出的異常:

boolean testEx2() throws Exception{

boolean ret = true;

try{

int b=12;

int c;

for (int i=2;i>=-2;i--){

c=b/i;

System.out.println("i="+i);

throw new Exception("aaa");

}

return true;

}catch (java.lang.ArithmeticException e){

System.out.println("testEx2, catch exception");

ret = false;

throw new Exception("aaa");

}finally{

System.out.println("testEx2, finally; return value="+ret);

}

}

4 關於abrupt completion
前面提到了complete abruptly(暫且理解為「突然中止」或者「異常結束」吧),它主要包含了兩種大的情形:abrupt completion of expressions and statements,下面就分兩種情況進行解釋。

4.1 Normal and Abrupt Completion of Evaluation
每一個表達式(expression)都有一種使得其包含的計算得以一步步進行的正常模式,如果每一步計算都被執行且沒有異常拋出,那麼就稱這個表達式「正常結束(complete normally)」;如果這個表達式的計算拋出了異常,就稱為「異常結束(complete abruptly)」。異常結束通常有一個相關聯的原因(associated reason),通常也就是拋出一個異常V。

與表達式、操作符相關的運行期異常有:

² A class instance creation expression, array creation expression , or string concatenation operatior expression throws an OutOfMemoryError if there is insufficient memory available.

² An array creation expression throws a NegativeArraySizeException if the value of any dimension expression is less than zero.

² A field access throws a NullPointerException if the value of the object reference expression is null.

² A method invocation expression that invokes an instance method throws a NullPointerException if the target reference is null.

² An array access throws a NullPointerException if the value of the array reference expression is null.

² An array access throws an if the value of the array index expression is negative or greater than or equal to the length of the array.

² A cast throws a ClassCastException if a cast is found to be impermissible at run time.

² An integer division or integer remainder operator throws an ArithmeticException if the value of the right-hand operand expression is zero.

² An assignment to an array component of reference type throws an ArrayStoreException when the value to be assigned is not compatible with the component type of the array.

4.2 Normal and Abrupt Completion of Statements
正常情況我們就不多說了,在這里主要是列出了abrupt completion的幾種情況:

² break, continue, and return 語句將導致控制權的轉換,從而使得statements不能正常地、完整地執行。

² 某些表達式的計算也可能從java虛擬機拋出異常,這些表達式在上一小節中已經總結過了;一個顯式的的throw語句也將導致異常的拋出。拋出異常也是導致控制權的轉換的原因(或者說是阻止statement正常結束的原因)。

如果上述事件發生了,那麼這些statement就有可能使得其正常情況下應該都執行的語句不能完全被執行到,那麼這些statement也就是被稱為是complete abruptly.

導致abrupt completion的幾種原因:

² A break with no label

² A break with a given label

² A continue with no label

² A continue with a given label

² A return with no value

² A return with a given value A

² throw with a given value, including exceptions thrown by the Java virtual machine

5 關於我們的編程的一點建議
弄清楚try-catch-finally的執行情況後我們才能正確使用它。

如果我們使用的是try-catch-finally語句塊,而我們又需要保證有異常時能夠拋出異常,那麼在finally語句中就不要使用return語句了(finally語句塊的最重要的作用應該是釋放申請的資源),因為finally中的return語句會導致我們的throw e被拋棄,在這個try-catch-finally的外面將只能看到finally中的返回值(除非在finally中拋出異常)。(我們需要記住:不僅throw語句是abrupt completion 的原因,return、break、continue等這些看起來很正常的語句也是導致abrupt completion的原因。)

❹ 教您在Java開發過程中如何應對異常處理

早期的編程語言(比如C語言)沒有異常處理,通常是遇到錯誤返回一個特殊的值或設定一個標志,並以此判斷是不是有錯誤產生。隨著系統規模的不斷擴大,這種錯誤處理已經成為創建大型可維護程序的障礙了。
於是在一些語言中出現了異常處理機制,比如在Basic中的異常處理語句「on error goto」,而Java則在C++基礎上建立了新的異常處理機制。
Java通過面向對象的方法進行異常處理,把各種不同的異常進行分類,並提供了良好的介面。這種機制為復雜程序提供了強有力的控制方式。同時這些異常代碼與「常規」代碼分離,增強了程序的可讀性,編寫程序時也顯得更靈活。
Java中的異常類
在Java中,每個異常都是一個對象,它是Throwable類或其它子類的實例。當一個方法出現異常後便拋出一個異常對象,該對象中包含有異常信息,調用這個對象的方法可以捕獲到這個異常並進行處理。
Throwable類有兩個標准子類:java.lang.Error和java.lang.Exception,即錯誤和異常。錯誤:Error類,一般是指虛擬機相關的問題,如系統崩潰、虛擬機出錯誤、動態鏈接失敗等,這一類錯誤無法恢復或不可能捕獲,將導致應用程序中斷。
異常:Exception類,則是指一些可以被捕獲且可能恢復的異常情況,如數組下標越界Array,Index,OutOf,Bounds,Excepton。數字被零除產生異常:ArithmeticException 、輸入/輸出異常:IOException等。
提示:Java編譯器要求Java程序必須捕獲或聲明所有非運行時的異常,如:FileNotFoundException、IOException等。因為,對於這類異常來說,如果程序不進行處理,可能會帶來意想不到的結果。但運行時出現異常可以不做處理,因為這類異常很普遍,全部處理可能對程序的可讀性和運行效率產生影響。
Java異常處理形式,Java的異常處理是通過5個關鍵詞來實現的:try、catch、throw、throws和finally。一般情況下是用try來執行一段程序,如果出現異常,系統會拋出(throws)一個異常,這時候你可以通過它的類型來捕捉(catch)它,或最後(finally)由預設處理器來處理。
下面是Java異常處理程序的基本形式: try //執行時程序塊 catch ExceptionType1e //對ExceptionType1的處理 catch ExceptionType2e //對ExceptionType2的處理 throw e //再拋出這個「異常」 finally try程序塊和catch語句:遇到一個try語句,「異常」的框架就放到堆棧上面,直到所有的try塊內的語句都完成。如果下一級的try語句沒有對某種「異常」進行處理,堆棧就會展開,直到遇到有處理這種「異常」的try語句。 在try程序後面,應包含一個catch子句來指定你想要捕捉的「異常」的類型。提示:捕獲異常的第一步就是用try … 選定你要捕獲異常的范圍,在執行時,括弧內的代碼會產生異常對象並被拋出。然後你就可以用catch塊來處理異常了。 throw語句和throws語句:throw語句用來明確地拋出一個「異常」。首先,你必須得到一個Throwable類或其它子類產生的實例句柄,通過參數傳到catch子句,或者用new語句來創建一個實例。 下面是throw語句的通常形式: throw ThrowableInstance,提示:執行throw語句後,運行流程將立即停止,throw的下一條語句也將暫停執行。這里new運算符用於創建一個Throwable類的實例,在後文的面向對象編程一文中將詳細講解。 throws語句用來標明一個成員函數可能拋出的各種「異常」。對大多數Exception子類來說,Java編譯器會強迫你聲明在一個成員函數中拋出的「異常」的類型。如果「異常」的類型是Error或RuntimeException,或它們的子類,這個規則不起作用。如果你想明確地拋出一個RuntimeException,你必須用throws語句來聲明它的類型。 提示:當然,你可能對上面的說明不是很明白,不過不要緊,編譯運行下面的Java程序(已經為你做了詳細的注釋)你會理解很多! 現在我們用下面的常式來說明問題: class ThrowsDemo //類名,相應的java源文件應該保存成: ThrowsDemo.javastatic void procere throws IllegalAccessException //throws語句 //拋出IllegalAccessException類型的異常System.out.println ″inside procere″ //輸出文本信息,以說明是在執行procere方法時拋出了異常throw new IllegalAccessException ″demo″ //新生成一個Throwable類實例,然後拋出異常 public static void main String args //main 方法開始,程序從此處執行 try //try語句塊開始procere //調用procere方法,該方法將Throw(拋出)異常信息 catch IllegalAccessException e //處理IllegalAccessException類型的異常, catch語句塊System.out.println ″caught ″ + e 編程並執行程序,其過程如下: E \javacode\exception>java ThrowsDemoinside procerecaught java.lang.IllegalAccessException demo提示:如上面的代碼所示,我們用了一個完整的程序來說明在Java程序中如何使用try…catch…throw等語句。Try … 里產生的異常被捕獲了下來,然後在catch塊里進行處理(這里只是輸出異常信息)。 throws IllegalAccessException標明程序將拋出一個IllegalAccessException類型的異常。IllegalAccessExceptione生成一個異常對象,然後用System.out.println輸出異常信息。 finally語句,有時為了確保一段代碼不管發生什麼異常都要被執行,可以使用關鍵詞finally來標出這樣一段代碼。一個成員函數返回到調用它的成員函數,或者通過一個沒捕捉到的異常,或者通過一個明確的return語句,finally子句總是恰好在成員函數返回前執行。 下面我們以一個比較完整的異常處理程序來說明上面所述的各種異常處理語句的使用問題: class ExceptionDemo //異常使用示例,保存為ExceptionDemo.javastatic void procA try System.out.println ″inside procA″ throw new RuntimeException ″demo″ //拋出異常finally System.out.println ″procA's finally″ //注意:不管發生什麼等會執行!!static void procB try System.out.println ″inside procB″ return //返回,實際上是在finally語句執行完後才返回finally System.out.println ″procB's finally″ public static void main String args try procA catch Exception e System.out.println ″catch ″+e procB提示:在上面的完整程序中,finally後的大括弧內的代碼是任何情況下都會執行的。另外,在procB中,return 語句並沒有立即返回,這一點應該特別注意。你可以親自動手,執行上面的程序試試(編譯和執行類似於上例)。 到目前為止,關於Java的流程式控制制已經完全講完了。要真正理解並掌握它們只有經過大量的練習。而好的方法就是修改上面的每一個程序,讓它們實現你想要的功能,並在此基本上理解Java的流程式控制制。 而要寫好Java程序,熟悉使用Java的流程式控制制和異常處理是非常關鍵的。

php程序編譯中常見錯誤信息及解釋

編寫程序時 無論怎樣小心謹慎 犯錯總是在所難免的 這些錯誤通常會迷惑PHP編譯器 如果開發人員無法了解編譯器報錯信息的含義 那麼這些錯誤信息不僅毫無用處 還會常常讓人感到沮喪 編譯PHP腳本時 PHP編譯器會盡其所能報告它遇到的第一個問題 這樣就產生一個問題 只有當錯誤出現時 PHP才能將它識別出來(本文後面對此問題進行了詳細描述) 正是由於這個緣故 編譯器指出出錯的那行 從表面上看來可能語法正確無誤 或者可能是根本就不存在的一行!更好地理解錯誤信息可以大大節省確定並改正錯誤內容所花費的時間 因此 在本文中 我將努力闡明多種不同類型的PHP報錯信息 以及在開發過程中如何正確理解各種報錯信息的含義 本文中所講述的內容與您所應用的PHP的版本無關 因為本文所描述的各種錯誤並不限定於某一特殊版本的特定錯誤 另外我們假定您是一位初級或者中級程序員 並已經從事編程工作有半年或一年的時間 編譯器的工作方式要搞清楚編譯器為什麼會報告某一行上存在錯誤 首先必須明確編譯器解析PHP代碼的機制 我並不打算在本文中對此進行詳細論述 但是 我們將會討論一些更易於引發錯誤的簡單概念 變數聲明如果在一條語句中聲明一個變數 具體方式如下所示 $variable = value ;編譯器首先求出語句右半部分的值(即等號右邊的所有內容) 在一些編程書籍中 將此表示為語句的 RHS (右半部分) 恰恰正是語句的這一部分常常會引發錯大逗誤 如果使用的語法不正確 就會出現解析錯誤 解析錯誤Parse error:解析錯誤 unexpected T_WHILE in c://program files//apache group//apache//htdocs//script php on line 每次確定了前一錯誤時 解析錯誤一個接一個地不斷出現 因為PHP在第一個解析錯誤之後就停止執行腳本 調試並糾正這一系列的錯誤往往會讓人覺得特別厭煩 而且 解析錯誤具有很少的信息 幾乎不報告錯誤所在的行號 具體原因就是當出現錯誤時 編譯器判定好幾行的語法看起來應該是有效的 直至遇到無效的語法 最可能的情形就是表達式中使用了預定義的字詞 例如;while = ; // Bad ? while 就是一個預定義字詞 不能分配給一個值預定義的字詞包括 while function等 如果PHP使用 uses to evaluate your code 您不能使用這些預定義字詞來命名變數 而且如果您非要這樣做的話 PHP就會報出更多的慎胡錯誤 這是您無法忍受 關於這個問題 下面的示例可能會對您有所幫助 請咨詢閱讀一下下面所示的PHP 代碼 $b = somevalueif($b == somevalue){print Hello world!;}?>錯誤位於$b =一行(在語句的末端缺少分號) 所以錯誤應該是解析錯誤:第 行缺少分號對吧?而不應該依據解析器判定的 Parse error: parse error unexpected T_IF in c://program files//apachegroup//apache//htdocs//ereg php on line 在第 行 if() 語句的語法是正確的 那麼 編譯器是被什麼給搞糊塗了呢?線索就是unexpected T_IF 部分 出現 unexpected T_???錯誤時 它所表示的含義為 編譯器發現在預定義字不應該出現的位置出現 T_IF 代表 if() T_WHILE 代表 while() T_FOR 代表 for()等 值得慶幸的是 一些錯誤的原因也很簡單 語句沒有使用分號(;)結束 比如上面的示例 字元串中缺少引號 其他一些常見的錯誤我見過的最常見的錯誤就是 當沒有使用大括弧( } )結束一個函數或者一個循環時出現的錯誤 這很可能是最常見 最讓人煩的錯誤 具體代碼如下滾孝賣 function UselessFunction() {for($i < ; $i < ; $i++){}將產生下列錯誤 Parse error: parse error unexpected $ in c://program files//apachegroup//apache//htdocs//ereg php on line 由於函數 UselessFunction 沒有使用大括弧( } )來結束 PHP編譯器不斷查找表示結束的大括弧直至到達文件末尾為止 因為編譯器未找到一個匹配的大括弧 就會報告文件末尾處有錯誤 如果正確地反映了代碼的層次結構 錯誤信息就會變得非常明顯 如果沒有標明代碼的層次結構 那麼最後要想查清楚到底忘記了什麼也會變得幾乎是不可能的 所以 請記住 一定要標明代碼的層次結構 Tab鍵可以很容易地實現這一點 對後續的開發人員來說 把握代碼框架並對其進行修改也會更容易一些 MySQL 錯誤另一極其令人討厭的錯誤信息就是最常見的MySQL錯誤 這常常使 PHP新手感到頗為頭疼 Warning: Supplied argument is not a valid MySQL result resource in 上面所報告有錯的一行可能是 while($row = mysql_fetch_array($result)) {參數 $result並不是一個有效的資源 在英語中它表示因為查詢失敗 將無法處理mysql_fetch_array 任一查詢的語法無效(您應該將查詢復制 粘貼到MySQL 控制台參考來進行測試) 或者與資料庫的連接失敗(這種情況下您應該再次檢查用戶名和口令等) 防止錯誤發生第一步 智能代碼器可採取以下幾步來消除下列錯誤出現 · 在每一條語句的末尾處 不必考慮添加分號——這應該成為一種習慣 · 總是要盡可能標明代碼的層次結構 這可以使您能夠查看是否忘記在if 調用或函數末端等位置添加大括弧 · 請使用可突出顯示語法的編輯器(如 HTML Kit) 有了這類編輯器的輔助 您就能確定是否忘記了添加引號 是否缺少分號等 lishixin/Article/program/PHP/201311/21338

❻ JAVA語言中,異常處理有哪幾種方式

有兩中方式:1.捕獲異常,自己處理.
2.throw出去,讓別人處理.
舉個例子:
public class A{
try{
可能放生異常的語句...

}catch(Exception e){
e.getMessage();//自己處理
}

}

public class A throws Exception{

可能放生異常的語句...

}//throw出去,讓別人處理
注意這里用的是throws
如果在方法裡面則用throw
舉例:
public class A{
try{
可能放生異常的語句...

}catch(Exception e){
e.getMessage();//自己處理
throw new Exception ("");
}

}

閱讀全文

與編譯器的錯誤處理機制相關的資料

熱點內容
卡耐基pdf下載 瀏覽:922
現在最流行的單片機 瀏覽:88
機頂盒刷機源碼 瀏覽:985
編碼pdf下載 瀏覽:944
隔壁同學app怎麼 瀏覽:299
c語言宏命令 瀏覽:542
php卡死源碼 瀏覽:574
time庫中的clock函數python 瀏覽:989
cad視覺移動命令怎麼打開 瀏覽:821
安卓java調用python 瀏覽:395
java標准時間 瀏覽:137
華為伺服器湖北渠道商雲主機 瀏覽:30
韓式面部護理解壓視頻 瀏覽:301
pdf換成jpg圖片 瀏覽:897
dh加密演算法 瀏覽:107
安卓手機如何隱藏微信信息提示 瀏覽:632
nodejs解壓縮 瀏覽:262
直流雙轉子壓縮機 瀏覽:952
pythonxmlstring 瀏覽:822
用私鑰加密之後可以用公鑰解密 瀏覽:788