国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

[學習筆記]Thinking in Java (the 2nd edition) Study Note (3)

2019-11-18 15:04:07
字體:
來源:轉載
供稿:網友

第9章 違例差錯控制

java的基本原理就是“形式錯誤的代碼不會運行”。<1>在Java中,對那些要調用方法的客戶程序員,我們要通知他們可能從自己的方法里“擲”出違例。這是一種有禮貌的做法,只有它才能使客戶程序員準確地知道要編寫什么代碼來捕捉所有潛在的違例。當然,若你同時提供了源碼,客戶程序員甚至能全盤檢查代碼,找出相應的throw語句。但盡管如此,通常并不隨同源碼提供庫。為解決這個問題,Java提供了一種非凡的語法格式(并強迫我們采用),以便禮貌地告訴客戶程序員該方法會“擲”出什么違例,令對方方便地加以控制。這便是我們在這里要講述的“違例規范”,它屬于方法聲明的一部分,位于自變量(參數)列表的后面。違例規范采用了一個額外的要害字:throws;后面跟隨全部潛在的違例類型。因此,我們的方法定義看起來應象下面這個樣子:void f() throws tooBig, tooSmall, divZero { //...}

<2>捕捉所有違例我們可創建一個控制器,令其捕捉所有類型的違例。具體的做法是捕捉基礎類違例類型Exception(也存在其他類型的基礎違例,但Exception是適用于幾乎所有編程活動的基礎)。如下所示:catch(Exception e) { System.out.PRintln("caught an exception");}這段代碼能捕捉任何違例,所以在實際使用時最好將其置于控制器列表的末尾,防止跟隨在后面的任何非凡違例控制器失效。對于程序員常用的所有違例類來說,由于Exception類是它們的基礎,所以我們不會獲得關于違例太多的信息,但可調用來自它的基礎類Throwable的方法:String getMessage()獲得具體的消息。String toString()返回對Throwable的一段簡要說明,其中包括具體的消息(假如有的話)。

<3>標準Java違例Java包含了一個名為Throwable的類,它對可以作為違例“擲”出的所有東西進行了描述。Throwable對象有兩種常規類型(亦即“從Throwable繼續”)。其中,Error代表編譯期和系統錯誤,我們一般不必特意捕捉它們(除在非凡情況以外)。Exception是可以從任何標準Java庫的類方法中“擲”出的基本類型。此外,它們亦可從我們自己的方法以及運行期偶發事件中“擲”出。

<4>違例準則用違例做下面這些事情 :(1) 解決問題并再次調用造成違例的方法。(2) 平息事態的發展,并在不重新嘗試方法的前提下繼續。(3) 計算另一些結果,而不是希望方法產生的結果。(4) 在當前環境中盡可能解決問題,以及將相同的違例重新“擲”出一個更高級的環境。(5) 在當前環境中盡可能解決問題,以及將不同的違例重新“擲”出一個更高級的環境。(6) 中止程序執行。(7) 簡化編碼。若違例方案使事情變得更加復雜,那就會令人非常煩惱,不如不用。(8) 使自己的庫和程序變得更加安全。這既是一種“短期投資”(便于調試),也是一種“長期投資”(改善應用程序的健壯性)

第10章 Java IO系統

“對語言設計人員來說,創建好的輸入、輸出系統是一項非凡困難的任務。”由于存在大量不同的設計方案,所以該任務的困難性是很輕易證實的。其中最大的挑戰似乎是如何覆蓋所有可能的因素。不僅有三種不同的種類的IO需要考慮(文件、控制臺、網絡連接),而且需要通過大量不同的方式與它們通信(順序、隨機訪問、二進制、字符、按行、按字等等)。

可將Java庫的IO類分割為輸入與輸出兩個部分。通過繼續,從InputStream(輸入流)衍生的所有類都擁有名為read()的基本方法,用于讀取單個字節或者字節數組。類似地,從OutputStream衍生的所有類都擁有基本方法write(),用于寫入單個字節或者字節數組。然而,我們通常不會用到這些方法;它們之所以存在,是因為更復雜的類可以利用它們,以便提供一個更有用的接口。我們之所以感到Java的流庫(Stream Library)異常復雜,正是由于為了創建單獨一個結果流,卻需要創建多個對象的緣故。很有必要按照功能對類進行分類。庫的設計者首先決定與輸入有關的所有類都從InputStream繼續,而與輸出有關的所有類都從OutputStream繼續。

//這里寫一個比較經典的讀寫文件的類,以文件的方式實現一個計數器

import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileReader;import java.io.FileWriter;import java.io.PrintWriter;

/** * @author gms * create 2005-1-18 14:39:24 */

public class FileRw {    private File f = new File("d://counter.txt");    public int getNum(){        int i = -1;        try{            String stri="";            BufferedReader in = new BufferedReader(new FileReader(f));            while((stri=in.readLine())!=null){     //逐行讀取                i = Integer.parseInt(stri.trim());            }            in.close();        }catch(Exception e){            e.printStackTrace();        }        return i;    }    public void setNum(){        int i = getNum();        i++;                try{            PrintWriter out=new PrintWriter(new BufferedWriter(new FileWriter(f,false)));                        out.write(String.valueOf(i));             //可能是編碼的原因,假如直接寫入int的話,將出現java編碼和windows編碼的混亂,因此此處寫入的是String            out.close() ;        }catch(Exception e){            e.printStackTrace();        }    }    public static void main(String[] args) {        FileRw frw = new FileRw();        for(int i =0;i< 9; i++){            frw.setNum();            System.out.println(frw.getNum());        }    }}

第11章 運行期類型鑒定

運行期類型鑒定(RTTI)的概念初看非常簡單——手上只有基礎類型的一個句柄時,利用它判定一個對象的正確類型。然而,對RTTI的需要暴露出了面向對象設計許多有趣(而且經常是令人困惑的)的問題,并把程序的構造問題正式擺上了桌面.本章將討論如何利用Java在運行期間查找對象和類信息。這主要采取兩種形式:一種是“傳統”RTTI,它假定我們已在編譯和運行期擁有所有類型;另一種是Java1.1特有的“反射”機制,利用它可在運行期獨立查找類信息。首先討論“傳統”的RTTI,再討論反射問題。

我們已知的RTTI形式包括:(1) 經典造型,如"(Shape)",它用RTTI確保造型的正確性,并在碰到一個失敗的造型后產生一個ClassCastException違例。(2) 代表對象類型的Class對象。可查詢Class對象,獲取有用的運行期資料。

第12章 傳遞和返回對象

到目前為止,讀者應對對象的“傳遞”有了一個較為深刻的熟悉,記住實際傳遞的只是一個句柄。那么一般都會問到:“Java有指針嗎?”有些人認為指針的操作很困難,而且十分危險,所以一廂情愿地認為它沒有好處。同時由于Java有如此好的口碑,所以應該很輕易地免除自己以前編程中的麻煩,其中不可能夾帶有指針這樣的“危險品”。然而準確地說,Java是有指針的!事實上,Java中每個對象(除基本數據類型以外)的標識符都屬于指針的一種。但它們的使用受到了嚴格的限制和防范,不僅編譯器對它們有“戒心”,運行期系統也不例外。

【稍微總結一下】Java中的所有自變量或參數傳遞都是通過傳遞句柄進行的。也就是說,當我們傳遞“一個對象”時,實際傳遞的只是指向位于方法外部的那個對象的“一個句柄”。所以一旦要對那個句柄進行任何修改,便相當于修改外部對象。此外:■參數傳遞過程中會自動產生別名問題■不存

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 临猗县| 龙州县| 灵川县| 隆林| 池州市| 上思县| 信丰县| 张家港市| 剑川县| 枝江市| 顺义区| 宁河县| 山丹县| 香河县| 伊川县| 宣汉县| 杭锦旗| 黎川县| 河南省| 东宁县| 全椒县| 来宾市| 丹巴县| 宜州市| 获嘉县| 定南县| 陈巴尔虎旗| 正安县| 建阳市| 七台河市| 桃园县| 陆河县| 宁波市| 百色市| 依安县| 汾西县| 永修县| 涡阳县| 福安市| 怀集县| 明光市|