編譯器驗證
㈠ ifort編譯器在linux上安裝認證license輸入路徑時出現問題,怎麼解決
剛剛編譯了一個ifort,也不知道為什麼,intel郵件的附件中沒有.lic文件,沒有辦法,硬著頭皮編譯,結果順利通過,最後也能用ifort了,不知道是否成功。。。
㈡ jvm的在連接階段對java類的驗證和編譯器對源代碼的編譯有什麼區別
代碼編譯順序你記好了
JDK 將源碼(.java)編譯成位元組碼文件(.class)
JVM 將位元組碼文件(.class)根據操作系統的不同編譯成適合不同操作系統的機器碼
㈢ 方法異常要向上拋出,關鍵字 throws 聲明可能產生的異常 有什麼用是給誰看的編譯器還是人
Java 異常的處理
在 Java 應用程序中,對異常的處理有兩種方式:處理異常和聲明異常。
處理異常:try、catch 和 finally
若要捕獲異常,則必須在代碼中添加異常處理器塊。這種 Java 結構可能包含 3 個部分,
都有 Java 關鍵字。下面的例子中使用了 try-catch-finally 代碼結構。
1 import java.io.*;
2 public class EchoInputTryCatchFinally {
3 public static void main(String args[]){
4 System.out.println("Enter text to echo:");
5 InputStreamReader isr = new InputStreamReader(System.in);
6 BufferedReader inputReader = new BufferedReader(isr);
7 try{
8 String inputLine = inputReader.readLine();
9 System.out.println("Read:" + inputLine);
10 }
11 catch(IOException exc){
12 System.out.println("Exception encountered: " + exc);
13 }
14 finally{
15 System.out.println("End. ");
16 }
17 }
18}
其中:
try 塊:將一個或者多個語句放入 try 時,則表示這些語句可能拋出異常。編譯器知道可能要發生異常,於是用一個特殊結構評估塊內所有語句。
catch 塊:當問題出現時,一種選擇是定義代碼塊來處理問題,catch 塊的目的便在於此。catch 塊是 try 塊所產生異常的接收者。基本原理是:一旦生成異常,則 try 塊的執行中止,JVM 將查找相應的 JVM。
finally 塊:還可以定義 finally 塊,無論運行 try 塊代碼的結果如何,該塊裡面的代碼一定運行。在常見的所有環境中,finally 塊都將運行。無論 try 塊是否運行完,無論是否產生異常,也無論是否在 catch 塊中得到處理,finally 塊都將執行。
try-catch-finally 規則:
必須在 try 之後添加 catch 或 finally 塊。try 塊後可同時接 catch 和 finally 塊,但至少有一個塊。
必須遵循塊順序:若代碼同時使用 catch 和 finally 塊,則必須將 catch 塊放在 try 塊之後。
catch 塊與相應的異常類的類型相關。
一個 try 塊可能有多個 catch 塊。若如此,則執行第一個匹配塊。
可嵌套 try-catch-finally 結構。
在 try-catch-finally 結構中,可重新拋出異常。
除了下列情況,總將執行 finally 做為結束:JVM 過早終止(調用 System.exit(int));在 finally 塊中拋出一個未處理的異常;計算機斷電、失火、或遭遇病毒攻擊。
聲明異常
若要聲明異常,則必須將其添加到方法簽名塊的結束位置。下面是一個實例:
public void errorProneMethod(int input) throws java.io.IOException {
//Code for the method,including one or more method
//calls that may proce an IOException
}
這樣,聲明的異常將傳給方法調用者,而且也通知了編譯器:該方法的任何調用者必須遵守處理或聲明規則。聲明異常的規則如下:
必須聲明方法可拋出的任何可檢測異常(checked exception)。
非檢測性異常(unchecked exception)不是必須的,可聲明,也可不聲明。
調用方法必須遵循任何可檢測異常的處理和聲明規則。若覆蓋一個方法,則不能聲明與覆蓋方法不同的異常。聲明的任何異常必須是被覆蓋方法所聲明異常的同類或子類。
回頁首
Java 異常處理的分類
Java 異常可分為可檢測異常,非檢測異常和自定義異常。
可檢測異常
可檢測異常經編譯器驗證,對於聲明拋出異常的任何方法,編譯器將強制執行處理或聲明規則,例如:sqlExecption 這個異常就是一個檢測異常。你連接 JDBC 時,不捕捉這個異常,編譯器就通不過,不允許編譯。
非檢測異常
非檢測異常不遵循處理或聲明規則。在產生此類異常時,不一定非要採取任何適當操作,編譯器不會檢查是否已解決了這樣一個異常。例如:一個數組為 3 個長度,當你使用下標為3時,就會產生數組下標越界異常。這個異常 JVM 不會進行檢測,要靠程序員來判斷。有兩個主要類定義非檢測異常:RuntimeException 和 Error。
Error 子類屬於非檢測異常,因為無法預知它們的產生時間。若 Java 應用程序內存不足,則隨時可能出現 OutOfMemoryError;起因一般不是應用程序的特殊調用,而是 JVM 自身的問題。另外,Error 一般表示應用程序無法解決的嚴重問題。
RuntimeException 類也屬於非檢測異常,因為普通 JVM 操作引發的運行時異常隨時可能發生,此類異常一般是由特定操作引發。但這些操作在 Java 應用程序中會頻繁出現。因此,它們不受編譯器檢查與處理或聲明規則的限制。
自定義異常
自定義異常是為了表示應用程序的一些錯誤類型,為代碼可能發生的一個或多個問題提供新含義。可以顯示代碼多個位置之間的錯誤的相似性,也可以區分代碼運行時可能出現的相似問題的一個或者多個錯誤,或給出應用程序中一組錯誤的特定含義。例如,對隊列進行操作時,有可能出現兩種情況:空隊列時試圖刪除一個元素;滿隊列時試圖添加一個元素。則需要自定義兩個異常來處理這兩種情況。
Java 異常處理的原則和忌諱
Java 異常處理的原則
盡可能的處理異常
要盡可能的處理異常,如果條件確實不允許,無法在自己的代碼中完成處理,就考慮聲明異常。如果人為避免在代碼中處理異常,僅作聲明,則是一種錯誤和依賴的實踐。
具體問題具體解決
異常的部分優點在於能為不同類型的問題提供不同的處理操作。有效異常處理的關鍵是識別特定故障場景,並開發解決此場景的特定相應行為。為了充分利用異常處理能力,需要為特定類型的問題構建特定的處理器塊。
記錄可能影響應用程序運行的異常
至少要採取一些永久的方式,記錄下可能影響應用程序操作的異常。理想情況下,當然是在第一時間解決引發異常的基本問題。不過,無論採用哪種處理操作,一般總應記錄下潛在的關鍵問題。別看這個操作很簡單,但它可以幫助您用很少的時間來跟蹤應用程序中復雜問題的起因。
根據情形將異常轉化為業務上下文
若要通知一個應用程序特有的問題,有必要將應用程序轉換為不同形式。若用業務特定狀態表示異常,則代碼更易維護。從某種意義上講,無論何時將異常傳到不同上下文(即另一技術層),都應將異常轉換為對新上下文有意義的形式。
Java 異常處理的忌諱
一般不要忽略異常
在異常處理塊中,一項最危險的舉動是「不加通告」地處理異常。如下例所示:
1 try{
2 Class.forName("business.domain.Customer");
3 }
4 catch (ClassNotFoundException exc){}
經常能夠在代碼塊中看到類似的代碼塊。有人總喜歡在編寫代碼時簡單快速地編寫空處理器塊,並「自我安慰地」宣稱准備在「後期」添加恢復代碼,但這個「後期」變成了「無期」。
這種做法有什麼壞處?如果異常對應用程序的其他部分確實沒有任何負面影響,這未嘗不可。但事實往往並非如此,異常會擾亂應用程序的狀態。此時,這樣的代碼無異於掩耳盜鈴。
這種做法若影響較輕,則應用程序可能出現怪異行為。例如,應用程序設置的一個值不見了, 或 GUI 失效。若問題嚴重,則應用程序可能會出現重大問題,因為異常未記錄原始故障點,難以處理,如重復的 NullPointerExceptions。
如果採取措施,記錄了捕獲的異常,則不可能遇到這個問題。實際上,除非確認異常對代碼其餘部分絕無影響,至少也要作記錄。進一步講,永遠不要忽略問題;否則,風險很大,在後期會引發難以預料的後果。
不要使用覆蓋式異常處理塊
另一個危險的處理是覆蓋式處理器(blanket handler)。該代碼的基本結構如下:
1 try{
2 // …
3 }
4 catch(Exception e){
5 // …
6 }
使用覆蓋式異常處理塊有兩個前提之一:
1. 代碼中只有一類問題。
這可能正確,但即便如此,也不應使用覆蓋式異常處理,捕獲更具體的異常形式有利物弊。
2. 單個恢復操作始終適用。
這幾乎絕對錯誤。幾乎沒有哪個方法能放之四海而皆準,能應對出現的任何問題。
分析下這樣編寫代碼將發生的情況。只要方法不斷拋出預期的異常集,則一切正常。但是,如果拋出了未預料到的異常,則無法看到要採取的操作。當覆蓋式處理器對新異常類執行千篇一律的任務時,只能間接看到異常的處理結果。如果代碼沒有列印或記錄語句,則根本看不到結果。
更糟糕的是,當代碼發生變化時,覆蓋式處理器將繼續作用於所有新異常類型,並以相同方式處理所有類型。
一般不要把特定的異常轉化為更通用的異常
將特定的異常轉換為更通用異常時一種錯誤做法。一般而言,這將取消異常起初拋出時產生的上下文,在將異常傳到系統的其他位置時,將更難處理。見下例:
1 try{
2 // Error-prone code
3 }
4 catch(IOException e){
5 String msg = "If you didn 』 t have a problem before,you do now!";
6 throw new Exception(msg);
7 }
因為沒有原始異常的信息,所以處理器塊無法確定問題的起因,也不知道如何更正問題。
不要處理能夠避免的異常
對於有些異常類型,實際上根本不必處理。通常運行時異常屬於此類范疇。在處理空指針或者數據索引等問題時,不必求助於異常處理。
Java 異常處理的應用實例
在定義銀行類時,若取錢數大於余額時需要做異常處理。
定義一個異常類 insufficientFundsException。取錢(withdrawal)方法中可能產生異常,條件是余額小於取額。
處理異常在調用 withdrawal 的時候,因此 withdrawal 方法要聲明拋出異常,由上一級方法調用。
異常類:
class Exception{
private Bank excepbank; // 銀行對象
private double excepAmount; // 要取的錢
InsufficientFundsException(Bank ba, double dAmount)
{ excepbank=ba;
excepAmount=dAmount;
}
public String excepMessage(){
String str="The balance is"+excepbank.balance
+ "\n"+"The withdrawal was"+excepAmount;
return str;
}
}// 異常類
銀行類:
class Bank{
double balance;// 存款數
Bank(double balance){this.balance=balance;}
public void deposite(double dAmount){
if(dAmount>0.0) balance+=dAmount;
}
public void withdrawal(double dAmount)
throws InsufficientFundsException{
if (balance<dAmount) throw new
InsufficientFundsException(this, dAmount);
balance=balance-dAmount;
}
public void showBalance(){
System.out.println("The balance is "+(int)balance);
}
}
前端調用:
public class ExceptionDemo{
public static void main(String args[]){
try{
Bank ba=new Bank(50);
ba.withdrawal(100);
System.out.println("Withdrawal successful!");
}catch(InsufficientFundsException e) {
System.out.println(e.toString());
System.out.println(e.excepMessage());
}
}
}
回頁首
總結
Java 異常處理是使用 Java 語言進行軟體開發和測試腳本開發中非常重要的一個方面。對異常處理的重視會是您開發出的代碼更健壯,更穩定。本文系統的闡述了 Java 異常處理的原理和方法。能幫助讀者更加清楚的理解 Java 異常處理機制,在開發代碼時更加靈活的使用它。
㈣ 富文本編輯器有沒有單詞校驗的功能
在使用jquery的驗證框架對kindeditor富文本編輯器進行驗證的過程中,發現提交時,總是需要點擊兩次驗證才能通過,這是由於沒有對kindeditor進行同步,第一次點擊提交相當於同步,第二次點擊才算是jquery能夠取到富文本編輯器的值,通過驗證因此需要調用同步方法先同步,這樣使用jquery validate進行驗證時,一次便能通過驗證:
var editor;
KindEditor.ready(function(K) {
editor = K.create('textarea[name="content"]', {
allowFileManager : true,
afterBlur : function(){
//編輯器失去焦點時直接同步,可以取到值
this.sync();
}
});
});
㈤ 設計一個程序來驗證所用編譯器中float類型和double類型的有效位數
小數點後輸出多少位可以由程序員定義,但float的總有效位是7位左右,double的總有效位是16、17位。所以小數點後位數要求多了沒什麼意義,那是隨機填上的一些數字。
㈥ 如何驗證int型在gcc編譯器中佔有4位元組,程序如何編寫
直接sizeof(int)就行了
㈦ C語言如何學習,編寫的程序如何驗證它的正確性
剛學C語言要抓住幾個重要的知識點,一個是三大結構,二是數組,三是函數,四是指針,然後結構體,最後把學生管理系統寫出來就差不多了,至於編寫程序的正確性,可以通過調試,推薦vc6.0,調試很不錯,可以隨時看某個變數的值是怎樣變化的,進而查出問題的根源,對學習很有幫助。
㈧ 學習數字圖像處理技術 可以用哪些編譯器驗證那些演算法
和編譯器沒有關系. 驗證演算法一般用MATLAB方便吧
㈨ 關於linux gcc編譯器關閉gs驗證機制「 -fno-stack-protector 」
內核和應用程序的編譯是不一樣的,編譯應用的時候會調用一些你的編譯器工具鏈里的libc庫的,但是編譯內核的時候是不能call這些lib的,所以不能按著編譯應用的思想去編譯內核。你這個選項根本對內核無用。