




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第7章 異常、事件和多線程機制 7.1 異常異常 7.2 事件事件 7.3 多線程機制多線程機制 習習 題題 7.1 異異 常常7.1.1 定義定義 異常是指當程序中某些地方出錯時創建的一種特殊的運行時錯誤對象。Java創建異常對象后,就發送給Java程序,即拋出異常(throwing an exception)。程序捕捉到這個異常后,可以編寫相應的異常處理代碼進行處理。使用異常處理可以使得程序更加健壯,有助于調試和后期維護。7.1.2 異常類異常類 由繼承類圖可以看出,Throwable類派生了兩個類:Exception類和Error類,其中Error類系統保留,而Exception類供應用
2、程序使用,它下面又派生出幾個具體的異常類,都對應著一項具體的運行錯誤,如圖7.1所示。圖7.1 異常類圖Throwable類InterruptedException類MalformedURLException類NullPointerException類ClassNotFoundException類Error類Exception類IOException類IllegalAccessException類Exception類中常用的方法為:public String toString() 返回異常的簡短描述。public String getMessage() 返回異常的詳細信息描述。異常類分為系統定
3、義的異常和用戶自定義的異常。 1. 系統定義的異常系統定義的異常 圖7.1中Exception派生的這些子類都是系統事先定義好并包含在Java類庫中的,系統定義的異常對應著一些系統錯誤,如中斷、文件沒找到等錯誤。表7.1列舉了一些常見的系統異常類。表表7.1 常見的系統異常類常見的系統異常類系統定義的運行異常 對應的系統錯誤 ArrayIndexOutofBoundsException 類 數組越界使用 ArithmaticException 類 算術錯誤,除數為 0 ClassNotFoundException 類 未找到欲裝載使用的類 InterruptedException 類 中斷錯誤
4、,線程操作時可能引發 IOException 類 輸入、輸出錯誤 MalformedURLException 類 輸入的 URL 網址格式有錯誤 NullPointerException 類 空的尚未分配內存的對象 SecurityException 類 安全錯誤,如 Applet 欲讀寫客戶端文件時引發 2. 用戶自定義異常用戶自定義異常 用戶自定義異常用來處理用戶應用程序中的特定邏輯的運行錯誤,用戶自定義的異常類通常繼承自Exception類,例如:public class UserDefineException extends Exceptionpublic UserDefineExce
5、ption(String msg)super(msg);7.1.3 異常處理異常處理 Java異常通常在調用某些方法不一定完全成功時拋出,針對拋出的異常程序需要給出相應的處理,這稱為異常處理。異常處理分為三個部分:捕捉異常、程序流程的跳轉和異常處理語句塊。 當一個異常被拋出時,程序中有專門的語句來接收這個被拋出的異常對象,這個過程就是捕捉異常;當一個異常類的對象被捕捉或接收后,用戶程序就會發生流程跳轉,系統中止程序運行,跳轉到異常處理語句的執行,或者直接跳出系統,回到操作系統狀態下。在Java語言中,try語句用來啟動Java的異常處理機制,通常是可能拋出異常的語句的調用;而catch語句進行
6、捕捉和處理異常,有時添加finally語句塊,finally中的語句是正常執行或者處理異常之后必須執行的語句。語句格式如下:try語句塊;catch(異常類 異常類參數名)異常處理語句塊;finally try或者catch語句完畢后必須執行的語句(通常用于關閉文件流對象或者數據庫對象等); 1. 直接拋出異常直接拋出異常例如:public void myMethod()tryurlName = new URL(http:/);getAppletContext().showDocument(urlName,right);catch(MalformedURLException e)System.
7、out.println(e.getMessage(); try部分試圖打開一個網址http:/,如果不成功,比如網址輸入錯誤,那么引發異常程序忽略try中的下一行代碼,直接跳到catch塊中執行語句System.out.println(e.getMessage(),打印出引發的異常的錯誤信息描述。其中MalformedURLException說明引發的異常可能是URL網址輸入錯誤類。 2. 間接拋出異常間接拋出異常 例如:public void myMethod() throws MalformedURLExceptionurlName = new URL(http:/);getAppletC
8、ontext().showDocument(urlName,right);在方法后面直接拋出。3. 綜合方法綜合方法例如:public void myMethod() throws MalformedURLException tryurlName = new URL(http:/);getAppletContext().showDocument(urlName,right);catch(MalformedURLException e)System.out.println(e.getMessage();7.1.4 多異常的處理多異常的處理 多異常的處理使用多個catch來捕捉不同類的異常,Jav
9、a中對catch塊的數量沒有限制。格式如下:Try.catch(異常類1 標識符).catch(異常類2 標識符).finally.【例7.1】 測試多異常處理和自定義異常。源程序代碼如下:/程序文件名UseMultiException.javapublic class UseMultiException extends Exceptionstatic String str1;static String str2;public static void main(String args)int i1 = 0;int i2 = 0;str1 = new String(args0);str2 = n
10、ew String(args1);String strResult = new String();tryread(str1, str2);i1 = Integer.parseInt(str1);i2 = Integer.parseInt(str2);int result = i1/i2;strResult = String.valueOf(result);catch(NumberFormatException e)strResult = 錯誤的數字: + e.getMessage();catch(ArithmeticException e)strResult = 被0除錯誤: + e.getM
11、essage();str1 = s1.trim();str2 = s2.trim();if (str1.equals(0) throw (new UserDefineException(本系統0不能為被除數); ;class UserDefineException extends Exceptionpublic UserDefineException(String msg)super(msg);具體運行測試如下,結果如圖7.2所示。java UseMultiException 2gf 5數字格式出錯。java UseMultiException 2gf 0數字格式出錯,下面的程序代碼不再執行,
12、無法拋出第二個異常。java UseMultiException 2 0被0除出錯。java UseMultiException 0 3引發用戶自定義錯誤。java UseMultiException 9 3 9/3的答案為3。圖7.2 異常測試輸出7.2 事事 件件 事件用于描述程序、系統和程序使用者之間的各種活動。這些事件由系統事先定義好,當用戶在圖形界面上單擊控件或雙擊鼠標時就可能引發某個事件,而用戶程序中需要編制相應的代碼來對這些事件做出處理。 1. 事件源事件源 圖形用戶界面上每個可能產生事件的組件稱為事件源。 2. 事件監聽者事件監聽者 Java系統中注冊的用于接收特殊事件的類。不
13、同的事件對應著不同的監聽者,要想事件被監聽者監聽并處理,則需先將事件源注冊到監聽者。 3. 事件處理流程事件處理流程 事件源觸發事件并將事件作為一個參數傳遞給監聽者,監聽者實現某個接口中的抽象方法,從而實現對事件的處理。 Java的事件處理機制是一個委托事件模型,如圖7.3所示。圖7.3 Java事件處理機制Event事件調用并傳遞參數注冊觸發事件事件源注冊:addListener方法監聽者:Listener實現接口方法 事件源注冊的方法如下: public void addActionListener(ActionListener l) 添加特定的動作,監聽接收來自事件源的動作事件,如果l為
14、空,不會產生任何動作。 監聽者實現的接口為ActionListener接口,接口ActionListener來自包java.awt.event。在此接口中只有一個方法: public void actionPerformed(ActionEvent e) 當事件對象e發生時,調用此方法。監聽者就需要實現這個方法。 Java中常用的事件和相應的事件監聽者如表7.2所示。表表7.2 常用事件及其監聽者常用事件及其監聽者事件描述 事 件 類 監 聽 者 動作事件 ActionEvent ActionListener 文本事件 TextEvent TextListener 選擇事件 ItemEvent
15、 ItemListener 調整事件 AdjustmentEvent AdjustmentListener 鼠標事件 MouseEvent MouseListener 鍵盤事件 KeyEvent KeyListener 7.2.1 動作事件動作事件(ActionEvent) ActionEvent包含一個事件,該事件為執行動作事件ACTION_PERFORMED。觸發這個事件的動作為:(1) 點擊按鈕。(2) 雙擊列表中的選項。(3) 選擇菜單項。(4) 在文本框中輸入回車。 常用方法如下: public String getActionCommand() 返回引發某個事件的命令按鈕的名字,如
16、果名字為空,那么返回標簽值。 public void setActionCommand(String command) 設置引發事件的按鈕的名字,默認設置為按鈕的標簽。【例7.2】測試動作事件。源程序代碼如下:/程序文件名UseButton.javaimport java.awt.*;import java.awt.event.*;import java.applet.*;import java.applet.Applet;public class UseButton extends Applet implements ActionListenerString str1 = new Strin
17、g();Button b1; /聲明按鈕對象;Button b2;Color c;public void init() b1 = new Button(); b2 = new Button(按鈕對象2); /添加事件監聽者 b1.addActionListener(this); b2.addActionListener(this); this.add(b1); this.add(b2);public void start()b1.setLabel(按鈕對象1);str1 = b2.getLabel();repaint();public void paint(Graphics g)g.setCo
18、lor(c);g.drawString(引發事件的對象的標簽: + str1, 40,60);/實現接口中的方法,響應動作事件public void actionPerformed(ActionEvent e)String arg = e.getActionCommand();if(arg = 按鈕對象1)c = Color.red;str1 = 按鈕對象1;else if(arg = 按鈕對象2)c = Color.blue;str1 = 按鈕對象2;repaint(); 單擊“按鈕對象1”,引發對象1的單擊事件,輸出結果如圖7.4所示;單擊“按鈕對象2”,引發對象2的單擊事件,輸出結果如圖
19、7.5所示。圖7.4 單擊“按鈕對象1”的輸出圖7.5 單擊“按鈕對象2”的輸出7.2.2 文本事件文本事件(TextEvent) 文本事件即代表文本區域中文本變化的事件TEXT_VALUE_CHANGED,在文本區域中改變文本內容。 public void addTextListener(TextListener l) 添加特定的文本事件,監聽者接收來自文本對象的文本事件。如果l為空,那么不會拋出任何異常,而且也不會完成任何動作。 public interface TextListener extends EventListener 用于接收文本事件的監聽者接口。當對象的文本發生變化時,調用
20、監聽者對象的方法。接口中的方法為:public void textValueChanged(TextEvent e) 當文本發生改變時調用。public Object getSource()發生事件的對象,從EventObject繼承來的方法。【例7.3】測試文本事件。源程序代碼如下:/程序文件名UseTextEvent.javaimport java.awt.*;import java.awt.event.*;import java.applet.*;import java.applet.Applet; public class UseTextEvent extends Applet imp
21、lements ActionListener, TextListener TextField tOld;TextArea tNew;Panel p;public void init() tOld = new TextField(25); tNew = new TextArea(8,25); /添加事件監聽者 tOld.addActionListener(this); tOld.addTextListener(this); /設置界面 p = new Panel(new BorderLayout(); p.add(tOld,BorderLayout.NORTH); p.add(tNew,Bord
22、erLayout.SOUTH); add(p);/響應文本事件public void textValueChanged(TextEvent e)if(e.getSource() = tOld)tNew.setText(tOld.getText();/響應動作事件public void actionPerformed(ActionEvent e)if(e.getSource() = tOld)tNew.setText(); 在文本框中鍵入“你好,這是文本事件同步”字符串,可以看見文本區域中的字符跟隨變化,如圖7.6所示,這是響應文本事件。鍵入字符串后按回車鍵,則發生響應動作事件,將文本區域清空,
23、如圖7.7所示。 圖7.6 響應文本事件 圖7.7 響應動作事件7.2.3 選擇事件選擇事件(ItemEvent) 選擇事件中包含以事件為代表的選擇項,選中狀態發生變化的事件ITEM_STATE_ CHANGED。引發的動作為:(1) 改變列表類改變列表類List對象選項的選中或不選中狀態。對象選項的選中或不選中狀態。(2) 改變下拉列表類改變下拉列表類Choice對象選項的選中或不選中狀態。對象選項的選中或不選中狀態。(3) 改變復選按鈕類改變復選按鈕類Checkbox對象的選中或不選中狀態。對象的選中或不選中狀態。事件源對象注冊的方法如下:public void addItemListen
24、er(ItemListener l) 添加特定的項監聽者,接收對象的選擇項發生變化的事件。public ItemSelectable getItemSelectable() ItemEvent事件的方法,返回產生事件的事件源對象。public interface ItemListener extends EventListener接收選項事件的監聽者接口。當選項中事件發生時,調用監聽對象的itemStateChanged方法。public void itemStateChanged(ItemEvent e)當用戶選中一項或未選中一項時,調用這個方法。 【例7.4】測試選擇事件。分別對設置顏色的
25、復選框和有三種字號10、12和14的組合框進行選擇時,標簽的顏色和字體發生變化。源程序代碼如下:/程序文件名UseItemEvent.javaimport java.awt.*;import java.awt.event.*;import java.applet.*;import java.applet.Applet;public class UseItemEvent extends Applet implements ItemListenerCheckbox cDisp;Button btnDisp;Choice cFont;public void init() cDisp = new Ch
26、eckbox(紅色); btnDisp = new Button(顏色顯示); cFont = new Choice(); cFont.add(10); cFont.add(12); cFont.add(14); /添加事件 cDisp.addItemListener(this); cFont.addItemListener(this); add(cDisp); add(cFont); add(btnDisp);/接口事件public void itemStateChanged(ItemEvent e)Checkbox temp;Choice temp2;Font oldF;/復選框if(e.
27、getItemSelectable() instanceof Checkbox)temp = (Checkbox)(e.getItemSelectable();/選中為紅色,否則為藍色if(temp.getState()btnDisp.setBackground(Color.red);elsebtnDisp.setBackground(Color.blue);/組合框if(e.getItemSelectable() instanceof Choice)oldF = btnDisp.getFont();temp2 = (Choice)(e.getItemSelectable();String s
28、 = temp2.getSelectedItem();/設置字體btnDisp.setFont(new Font(oldF.getName(),oldF.getStyle(),Integer.parseInt(s); 當選中紅色復選框和組合框中的字號為14時,顯示界面如圖7.8所示;當未選中紅色復選框和選中組合框中的字號為10時,顯示界面如圖7.9所示。圖7.8 選中紅色和字號為14的界面 圖7.9 未選中紅色和字號為10的界面7.2.4 調整事件調整事件(AdjustmentEvent) 調整事件包含一個事件,即ADJUSTMENT_VALUE_CHANGED事件,當操縱滾動條改變其滑塊位置
29、時引發動作。AjustEvent的方法如下: public Adjustable getAdjustable() 返回引發事件的對象。 public int getValue() 返回調整事件中的當前值。public void addAdjustmentListener(AdjustmentListener l) 添加調整監聽者來接收來自對象的AdjustmentEvent實例。public interface AdjustmentListener extends EventListener接收調整事件的監聽接口,有一個方法:public void adjustmentValueChanged
30、(AdjustmentEvent e) 可在調整改變時調用這個值。 【例7.5】測試調整事件。設置一個水平滾動條,取值為136,隨著滑塊的變化,滾動條的值將顯示在文本區域中,并且字體大小也會跟隨變化。源程序代碼如下:/程序文件名UseAdjustmentEvent.javaimport java.awt.*;import java.awt.event.*;import java.applet.*;import java.applet.Applet;public class UseAdjustmentEvent extends Applet implements AdjustmentListen
31、erScrollbar s;TextArea txtValue;Panel p;public void init() s = new Scrollbar(Scrollbar.HORIZONTAL,0,1,10,36); /添加監聽者 s.addAdjustmentListener(this); txtValue = new TextArea(5,25); /界面布局 p = new Panel(new BorderLayout(); p.add(s,BorderLayout.NORTH); p.add(txtValue,BorderLayout.SOUTH); add(p);public vo
32、id start()public void adjustmentValueChanged(AdjustmentEvent e)int value;Font oldF;if(e.getAdjustable() = s) /得到滾動條的值value = e.getValue();/將值寫入文本區域txtValue.setText(new Integer(value).toString();/按照滾動條的值設置字體oldF = txtValue.getFont();txtValue.setFont(new Font(oldF.getName(),oldF.getStyle(),value); 隨著滾
33、動條的變化,可以看見文本區域中的取值以及大小都會跟隨變化,取值為10和取值為35時的效果各不相同,如圖7.10和圖7.11所示。圖7.10 字號為10的界面 圖7.11 字號為35的界面7.2.5 鼠標事件鼠標事件(MouseEvent) 表明畫布或界面組件中發生的鼠標事件,包含按下鼠標、釋放鼠標、單擊鼠標、進入部件的地理位置的鼠標事件和退出部件的地理位置的鼠標事件,以及鼠標移動事件(鼠標移動和鼠標拖動)。 鼠標使用addMouseListener方法注冊,通過MouseListener接收鼠標事件;鼠標還可以使用addMouseMotionListener方法注冊,通過MouseMotion
34、Listener監聽者監聽鼠標移動事件。 監聽者中有具體的方法分別針對上述具體的鼠標事件,系統能夠自動分辨鼠標事件的類型并調用相應的方法,所以只需編碼實現相應的代碼就可以了。public int getButton() 返回哪個按鈕發生變化。public int getClickCount() 返回與這個事件相關的鼠標單擊的次數。public Point getPoint() 返回同源部件相對的事件發生的x、y位置。public int getX() 返回同源部件相對的事件發生的x位置。public int getY()返回同源部件相對的事件發生的y位置。 【例7.6】測試按鈕和畫布的鼠標事件
35、,包括單擊、按下、進入和退出等。鼠標事件的演示如圖7.12和7.13所示。源程序代碼如下:/程序文件名UseMouseEvent.javaimport java.awt.*;import java.awt.event.*;import java.applet.*;import java.applet.Applet;public class UseMouseEvent extends Applet implements MouseListener, MouseMotionListenerButton btn;public void init() btn = new Button(演示鼠標事件);
36、 add(btn); /給按鈕添加鼠標事件和鼠標移動事件 btn.addMouseListener(this); btn.addMouseMotionListener(this); /給畫布添加鼠標事件和鼠標移動事件 this.addMouseListener(this); this.addMouseMotionListener(this);/單擊事件public void mouseClicked(MouseEvent e)Point p = new Point();if(e.getSource() = btn)if(e.getClickCount() = 1)btn.setLabel(單擊
37、鼠標);else if(e.getClickCount() = 2)btn.setLabel(雙擊鼠標);elseif(e.getClickCount() = 1)p = e.getPoint();showStatus(p.x + , + p.y + 單擊鼠標);else if(e.getClickCount() = 2)p = e.getPoint();showStatus(p.x + , + p.y + 雙擊鼠標); /進入事件public void mouseEntered(MouseEvent e)if(e.getSource() = btn)btn.setLabel(進入Button
38、);elseshowStatus(進入Applet);public void mouseExited(MouseEvent e)if(e.getSource() = btn)btn.setLabel(退出Button);elseshowStatus(退出Applet);/按下事件public void mousePressed(MouseEvent e)if(e.getSource() = btn)btn.setLabel(按下鼠標);elseshowStatus(按下鼠標);/釋放事件public void mouseReleased(MouseEvent e)if(e.getSource(
39、) = btn)btn.setLabel(松開鼠標);elseshowStatus(松開鼠標);/移動事件public void mouseMoved(MouseEvent e)if(e.getSource() = btn) btn.setLabel(移動鼠標);else showStatus(移動鼠標,新位置 + e.getX() + , + e.getY();/拖動事件public void mouseDragged(MouseEvent e)if(e.getSource() = btn)btn.setLabel(拖動鼠標);elseshowStatus(拖動鼠標);圖7.12 狀態行提示
40、鼠標移動位置 圖7.13 提示“按下鼠標”7.2.6 鍵盤事件鍵盤事件(KeyEvent) 鍵盤事件有三個:鍵盤按鍵按下,按鍵釋放,按鍵被敲擊。常用方法如下:public char getKeyChar() 返回事件中鍵的字符。public int getKeyCode() 返回整數鍵碼。public static String getKeyText(int keyCode) 返回描述這個鍵碼的字符串,例如“HOME”、“F1”或者“A”等。public interface KeyListener extends EventListener用來接收鍵盤事件。使用方法addKeyListener
41、注冊。針對鍵盤的三個事件接口提供相應的方法進行處理,具體方法如下:public void keyPressed(KeyEvent e) 按鍵時引發事件處理。public void keyReleased(KeyEvent e) 釋放鍵時引發事件處理。public void keyTyped(KeyEvent e) 鍵入鍵時引發事件處理。例如,按鍵處理事件如下:public void keyPressed(KeyEvent e)char ch = e.getKeyChar();if(ch =Y | ch = y)txt.setText (同意);else if ch = N | ch = n (
42、)txt.setText (反對);elsetxt.setText (無效);7.3 多多 線線 程程 機機 制制7.3.1 線程簡介線程簡介 線程(thread)就是進程中的一個執行線索。Java虛擬機允許進程中同時執行多個線程。每個線程都有一個優先級。具有較高優先級的線程先執行。線程是操作系統分配 CPU 時間的基本實體。每一個應用程序至少有一個線程,也可以擁有多個線程。線程是程序中的代碼流。多個線程可以同時運行并能共享資源。 線程與進程不同,每個進程都需要操作系統為其分配獨立的地址空間,而同一進程中的各個線程是在同一塊地址空間中工作。 在 Java 程序中,一些動態效果(如動畫的實現、動
43、態的字幕等)常利用多線程技術來實現。 線程存在一個生命周期,由以下方法體現:(1) start()方法:啟動一個線程。(2) run()方法:定義該線程的動作。(3) sleep()方法:使線程睡眠一段時間,單位為ms。(4) suspend()方法:使線程掛起。(5) resume()方法:恢復掛起的線程。(6) yield()方法:把線程移到隊列的尾部。(7) stop()方法:結束線程生命周期并執行清理工作。(8) destroy()方法:結束線程生命周期但不做清理工作。 其中最常用的是方法start()、run()、sleep()、stop()。7.3.2 線程類和線程類和Runnab
44、le接口接口1. 建立建立Thread類的子類類的子類 class myThread extends Thread .public void start()/啟動線程 .public void run()/運行線程. 【例7.7】多線程實例,主函數給予調用,調用情況如圖7.14所示。源程序代碼如下:public class MThread public static void main(String args) System.out.println(Hello World!);thread2 t1 = new thread2(線程實例1); /創建線程實例t1.start(); /調用thre
45、ad2 t2 = new thread2(線程實例2);t2.start();thread2 t3 = new thread2(線程實例3);t3.start(); /自定義線程類thread2class thread2 extends ThreadThread thread; /定義線程實例String str;/構造函數public thread2(String str)this.str = str;/啟動線程public void start()thread = new Thread(this);thread.start();public void run()int i = 0;while(thread != null)try/計數到5時睡眠10秒if(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T/LTXH 002-2023“天賦河套”區域公用品牌黃柿子汁
- T/TMAC 094-2024公路工程玄武巖纖維復合筋設計與施工規范
- 江蘇省蔬菜買賣合同4篇
- 上海二建試題及答案
- 2025年舞蹈教練聘用合同2篇
- 個體經營短期借款協議書8篇
- 晚會演出合同協議書范本3篇
- 文娛與體育課件
- 2025遼寧師范大學輔導員考試試題及答案
- 2025益陽教育學院輔導員考試試題及答案
- 勞動教育視角下高職院校學生工匠精神培育研究
- 2024年湖南省高中學業水平合格考物理試卷真題(含答案詳解)
- 2024詳解反電信詐騙及預防電信詐騙主題課件
- 2024年(學習強國)思想政治理論知識考試題庫與答案
- 《文物學概論》習題與答案
- 2024年中考地理二輪復習專題-地理實踐與跨學科主題學習(解析版)
- 最簡單封陽臺安全免責協議書
- SH/T 3533-2024 石油化工給水排水管道工程施工及驗收規范(正式版)
- 用友人力資源管理HR解決方案樣本
- 維保服務方案及維保體系
- 肺結核的真菌感染與治療
評論
0/150
提交評論