CodeGym /Java Blog /Toto sisi /舊級別 09
John Squirrels
等級 41
San Francisco

舊級別 09

在 Toto sisi 群組發布

知識與技能

舊級別 09 - 1大學告訴我們,理論和實踐之間沒有太大的區別。好吧,你肯定明白那是不一樣的。但是您看不到核心區別。然而有一個。 大多數人在“我知道”和“我能”之間劃等號。你? 舉幾個例子怎麼樣?
  1. 我知道抽煙對我不好,但我還是抽煙。
  2. 我知道快餐對我不好,但我還是吃了。
  3. 我知道交通規則,但我不會開車。
  4. 我知道慢跑對我有好處,但我早上不慢跑。
人們常常把“我知道”當成“我能”。這是交通規則的一個很好的例子。如果一個人知道規則,知道怎麼開車,是不是就可以開車了?沒有。如果他認為自己會開車怎麼辦?那麼他為什麼需要一位導師——他已經什麼都知道了。 當您確定自己已經了解所有內容時,您可能不會學到任何新東西。如果你確定你知道如何做所有事情,你就不會學習。這樣的想法甚至不會出現在你的腦海中。這意味著您將錯過所有學習某些東西的絕好機會。普通的大學只給你知識;你必須自己獲得技能。但是我聽到了什麼?你在大學裡有過理論以外的實踐嗎?好吧,如果你學的是物理系,製作效率至少為 20% 的蒸汽機工作模型。我打賭你知道怎麼做,但你實際上做不到,對嗎?你是化學家?製作無菸火藥。你知道怎麼做,但你不能,哈? 數學家,你是?計算砲彈的彈道。不要忘記考慮外殼的形狀。數學點在現實生活中不會飛。而且沒有球形馬。 舊級別 09 - 2生物學家?分離青黴素。這種黴菌長在甜瓜上,你知道的。你知道怎麼做——太棒了!你可以做到嗎? 經濟學家?預測石油價格增長。完畢?現在根據您的預測將其變成每年 2,000 美元或 200,000 美元。你玩過外匯嗎?為了真錢?或者你只知道它是什麼? 國際經濟學?燦爛!我在哪裡開設離岸公司?在 Hong-Cong、愛爾蘭或美國。為什麼?即使你知道這一點,這是值得懷疑的,你也很難做到,因為你從未真正做到過。你甚至不知道如何去做。哦,你在大學裡沒學過這個?我有什麼權利給你沒有準備的任務?因為這些是現實生活中的任務。這是練習,你在大學裡學的只是:球形馬,完美競爭——現實生活中都不存在。但為什麼我忘了提營銷專家?花掉我的 500 美元以使盡可能多的人了解我的講座的最佳方式是什麼?上廣告?你知道嗎,不僅經典廣告已經過時,而且 USP(獨特的銷售主張)的概念也已經過時,我相信你在大學裡被教導為幾乎是獨一無二的靈丹妙藥。 忘了你什麼都知道。問問自己——我能做什麼?有用,我的意思是?人們願意花錢買的東西?好錢,我的意思是? 所以小伙伴們,讓我們對CodeGym這麼精彩的課程表示感謝吧。由於它,您不僅會知道如何編程,而且您實際上能夠做到這一點。你也可以在幾年內找到一份工作並賺取豐厚的收入。我希望這筆錢足以讓我過上舒適愜意的生活。我會再說一遍,所以你要記住:你知道什麼並不重要。唯一重要的是你有什麼有用的技能,人們會急於付錢給你。你越早明白這一點越好。

你已經達到了一個新的水平

9級

舊級別 09 - 3

1 Risha,堆棧跟踪

舊級別 09 - 4- 嘿!今天我將告訴你堆棧跟踪是什麼。但首先讓我向您解釋一下堆棧是什麼。- 想像一堆文件 - 某個職員的任務。一個新的賦值可以放到棧頂,他會從一個棧頂取一個賦值。因此,分配將不是先到先得。每次店員接受最後的任務。這樣的集合結構稱為 -在 Java 中,有一個特殊的集合 - Stack。這個集合有方法 «add an element» 和 «take(get/take away) an element»。如您所知,最後添加的元素將首先被採用。 - 哼。我想這並不難。 - 美好的。然後讓我解釋什麼是堆棧跟踪是。- 想像一下,在 Java 中,函數 А調用函數 B,後者調用函數 C,後者又調用函數 D。因此,要退出功能 B,您必須先退出功能 C,然後您必須退出功能 D。這與堆棧非常相似。 - 相似之處是什麼? - 在堆棧中,要完成某個任務,您還必須完成所有放在最上面的任務。 - 好吧,這是一個類比,但我不確定我是否理解正確。 - 看這裡。在 Java 中,堆棧是一組元素。這就像一堆紙。要從頂部開始第三張,你必須拿第二張,但在此之前你必須拿第一張。你總是可以放床單和拿床單,但你只能把床單放在上面,也只能從上面拿。這同樣適用於函數調用。函數 А調用函數 B,後者調用函數 C。要退出А,您必須先退出B,為此您必須退出C- 等一下。如果我做對了,整個堆棧會變成“只能取出放在堆棧上的最後一張紙”和“首先,最後調用的函數應該退出”。是這樣嗎? - 是的。因此,函數調用的順序是«函數調用堆棧»,或簡稱為«調用堆棧»。最後調用的函數必須首先終止。讓我們看一下這個例子: 舊級別 09 - 5- 好的。我想,函數調用一切都很清楚。但是這個StackTraceElement是什麼? - Java 虛擬機記錄所有函數調用。為此,它有一個特殊的集合——堆棧。當一個函數調用另一個函數時,JVM 會將一個新元素StackTraceElement放入此堆棧中。當函數結束時,元素從堆棧中刪除。因此,該堆棧始終存儲有關 «函數調用堆棧» 當前狀態的最新信息。 - 每個StackTraceElement包含有關被調用方法的信息。因此,您可以使用getMethodName獲取此方法的名稱。- 上面的例子說明了這一點:
  1. 獲取«調用堆棧»:
  2. 使用循環for-each迭代數組。我希望你沒有忘記它。
  3. 將方法名稱打印到System.out
- 一件有趣的事情,而且顯然很容易。謝謝你,里沙!

2 Diego,堆棧跟踪顯示上的任務

- 嘿,阿米戈!這是一個在屏幕上顯示堆棧跟踪的小任務。
任務
1個 每個方法都應該返回它的 StackTrace
寫五個相互調用的方法。每個方法都應返回其 StackTrace。
2個 StackTrace
再寫五個相互調用的方法。每個方法都應返回其調用方方法的名稱。您可以使用 StackTrace 獲取調用方方法。
3個 該方法應返回調用此方法的代碼的行號,從
編寫相互調用的五個方法。每個方法都應返回調用此方法的代碼的行號。使用函數element.getLineNumber()
4個 10 次調用的堆棧跟踪
編寫代碼以獲得 10 次調用的堆棧跟踪。
5個 該方法應返回一個結果 - 它的堆棧跟踪深度
編寫一個顯示並返回其堆棧跟踪深度的方法。堆棧跟踪深度是其方法的數量(列表中的元素數量)。

3 Elly,錯誤和異常

- 嘿,阿米戈!今天我們上了一堂非常有趣的課。我會告訴你例外情況。異常是程序中控制錯誤的一種特殊機制。以下是程序中可能出現的一些錯誤示例:
  1. 該程序嘗試將文件寫入整個磁盤。
  2. 該程序嘗試調用存儲空引用的變量的方法。
  3. 該程序試圖將一個數除以 0。
這些操作會導致錯誤。通常,這會導致程序關閉——沒有必要繼續執行代碼。 - 這是為什麼? - 車子掉下懸崖時打方向盤有沒有意義? - 你是說程序應該結束了嗎? - 是的。以前就是這樣。任何錯誤都會導致程序終止。 - 這是一個非常明智的決定。 - 努力工作不是更好嗎? - 是的。您在 MS Word 中鍵入了一個巨大的文本,保存了它,它沒有被保存,但是程序告訴您一切正常。然後你繼續打字。愚蠢,不是嗎? - 是的。 - 然後程序員想出了一個有趣的舉動:每個功能都返回其工作狀態。0 表示該函數按預期工作,任何其他值 - 出現錯誤:此值是錯誤代碼。- 但這種方法有一個缺點。在每次 (!) 函數調用之後,您必須檢查函數返回的代碼(數字)。首先,它很不方便:錯誤處理代碼很少被執行,但你總是不得不編寫它。其次,函數本身經常返回不同的值——如何處理它們? - 是的。這就是我要問的。 - 然後光明的未來出現了 - 出現了異常和錯誤處理。它是這樣工作的:
  1. 當錯誤發生時,Java 虛擬機創建一個特殊的對象——一個異常——包含關於錯誤的所有信息。對於不同的錯誤有不同的異常。
  2. 然後這個異常會強製程序立即中斷當前函數,然後中斷下一個函數,直到退出 main 方法。之後程序終止。Java 開發人員將此過程稱為“回滾調用堆棧”。
- 但是你說過程序肯定不會退出。 - 沒錯,因為有一種方法可以捕獲異常。無論何時何地,只要你需要,你就可以編寫專門的代碼來捕捉這些異常,做一些重要的事情。- 為此,有一個特殊的結構try-catch。看看它是如何工作的: 舊級別 09 - 6- 為什麼«在 method1 調用之後。Never will be showed» 不會顯示在屏幕上? - 很高興你問起這件事。在第 25 行中,除以零。這會導致錯誤——異常。Java 虛擬機創建了包含錯誤信息的ArithmeticException對象。這個對像是一個例外。- 方法method1()內部發生異常。這導致該方法立即終止。如果沒有try-catch塊,它還會導致方法main的終止。- 如果在 try 塊內發生異常,它將在catch塊中捕獲。塊try中的其餘代碼將不會執行,塊catch將立即開始執行。 - 我不太明白。 - 換句話說,這段代碼是這樣工作的:
  1. 如果try塊內部發生異常,則不再執行該塊中的代碼,而是開始執行塊catch
  2. 如果沒有異常發生,try 塊將執行到結束,並且永遠不會執行catch
- 咳咳! - 想像一下,在每次方法調用之後,我們檢查被調用的方法是自行終止還是由於異常而終止。如果出現異常,JVM 開始執行塊捕獲(如果可用),並捕獲異常。如果沒有 catch 塊,JVM 將終止當前方法。然後在調用當前方法的方法中開始相同的檢查。 - 現在我想我明白了。 - 沒關係。 - catch 塊中的異常是什麼? -所有異常都是從類Exception 繼承的類。我們可以通過在catch中指定它的類來捕獲它們中的任何一個通過指定一個公共父類 Exception 來阻止或同時阻止所有這些。然後,從變量 e(此變量存儲異常對象的引用)中,您可以獲得有關錯誤的所有必要信息。 - 偉大的!如果在我的方法中出現不同的異常,我可以用不同的方式處理它們嗎? - 你必須。您可以這樣做: 舊級別 09 - 7- try 塊可以包含多個catch塊,每個 catch 塊都會捕獲其類型的異常。 - 嗯。好吧,我有點明白了。當然,我不會自己寫這樣的東西。不過,遇到這樣的代碼我是不會害怕的。

4 Elly,RuntimeException,拋出

舊級別 09 - 8- 我決定今天提出另一個話題。在 Java 中,所有異常都分為兩種類型——受控/受控不受控/未受控必須捕獲已檢查的異常,可以捕獲未檢查的異常,但這不是必需的- 是否可以故意在代碼中拋出異常? - 在你的代碼中,你可以自己拋出異常。您甚至可以編寫自己的異常。但我們稍後會深入這個洞。現在讓我們學習如何處理 Java 虛擬機拋出的異常。 - 好的。 - 如果異常ClassNotFoundExceptionFileNotFoundException被拋出(出現)在一個方法中,程序員必須在方法的簽名(方法頭)中指定它們。檢查此類異常。這就是它通常的樣子: 舊級別 09 - 9- 所以,我們只寫拋出並列出用逗號分隔的異常。正確的?是這樣嗎? - 是的。但還有一件有趣的事。為了編譯下面的示例,調用method1()的方法必須捕獲這些異常將它們向前拋出。如果你想向前拋出檢查異常,你需要在方法的頭中指定它。- 再一次,如果在main方法中,您想調用一個在其標題短語中包含throws FileNotFoundException 的方法,...那麼你必須做以下兩件事之一:
  1. 捕獲異常 FileNotFoundException,......
    你必須用try-catch塊包裝你調用危險方法的代碼
  2. 不要捕獲異常 FileNotFoundException,...
您必須將這些異常添加到方法main的拋出列表中。 - 你能給我舉個例子嗎? - 看這裡: - 這個例子不會被編譯,因為方法main調用了方法 method1(),它拋出了必須捕獲的異常。- 為了編譯示例,您需要向方法main添加異常處理。您可以通過兩種方式執行此操作: - 在這裡我們使用try-catch捕獲它: - 它越來越清晰,但很少。 - 查看下面的示例: - 仍然存在異常 - RuntimeException和從它繼承的類。舊級別 09 - 10舊級別 09 - 11舊級別 09 - 12舊級別 09 - 13不需要抓住或扔掉它們。這些是未經檢查的異常。這些異常被認為是難以預測的,因此幾乎不可能預測它們的發生。您可以對它們執行相同的操作,但無需在throws中指定它們。

5 Risha,滾動調用堆棧,如何在異常中執行

- 我想告訴你更多關於異常如何工作的信息。下面的例子解釋說: 舊級別 09 - 14- 我不明白。 - 好的。我會解釋發生了什麼。- 在左邊的例子中,我們按鍊式順序調用了幾個方法。在method2()中,我們專門創建並拋出異常(以引發錯誤)。- 右邊的例子顯示了會發生什麼。查看method2()。這就是異常的創建轉換成的:我們創建一個RuntimeException類型的對象,將它存儲在一個特殊的變量異常中,然後立即退出方法 - return。- 在method1中,在調用method2之後進行檢查,是否有例外;如果有異常,則 method1 立即終止。此檢查在調用每個(!)Java 方法後隱式完成。 - 哇! - 確切地。- 在方法main的右側欄中,我寫了當異常被try-catch塊捕獲時會發生什麼。如果沒有異常,代碼將繼續按計劃執行。如果存在catch中指定類型的異常,那麼我們將處理它。 - throwinstanceof是什麼意思? - 看左邊最後一行throw new RuntimeException(s). 通過這種方式,我們創建並拋出異常。這只是一個例子。到目前為止我們不會這樣做。- 在右側塊中使用命令« аinstanceofB »我們檢查對象a是否具有類型B。也就是說,存儲在變量 exception 中的對像是否具有 RuntimeException 類型。這是一個合乎邏輯的表達。 - 好吧,它變得更清楚了。

6 Diego,異常捕獲任務

- 看這裡!迭戈叔叔為您帶來了很少的任務。祝你好運。我想你會需要它。呵呵。 舊級別 09 - 15- 嘿,阿米戈!這裡有一些有趣的異常捕獲任務。
抓任務
1個 1. 數字操作異常
捕獲運行代碼時出現的異常:
int a = 42 / 0;
在屏幕上顯示異常,指定其類型
2個 2. 操作字符串時
異常捕獲運行代碼時出現的異常:
String s = null;
字符串 m = s.toLowerCase();
在屏幕上顯示異常,指定其類型。
3個 3. 數組操作異常
捕獲運行代碼時出現的異常:
int[] m = new int[2];
m[8] = 5;
在屏幕上顯示異常,指定其類型。
4個 4. 操作List集合時
出現異常捕獲運行代碼時出現的異常:
ArrayList<String> list = new ArrayList<String>();
字符串 s = list.get(18);
在屏幕上顯示異常,指定其類型。
5個 5. 操作Map集合時
異常 捕獲運行代碼時出現的異常:
HashMap<String, String> map = new HashMap<String, String>(null);
map.put(null, null);
地圖.刪除(空);
在屏幕上顯示異常,指定其類型。
- 提示:首先編寫一個程序,然後查看發生了什麼異常,然後更改代碼並捕獲該異常。

7 Risha,多次捕獲的工作原理

舊級別 09 - 16- 現在,一些更有趣的講座。我非常喜歡教學。- 我想告訴你多重捕捉是如何工作的。其實很簡單:當try塊發生異常時,程序執行轉移到第一個catch。-如果塊 catch 的括號中指定的類型與異常對象的類型相同,則代碼執行從 {} 內部開始。否則我們去下一個捕獲。在那裡重複檢查。- 如果沒有更多的catch塊,但異常還沒有被捕獲,則向前拋出,併中斷當前方法。 - 我懂了。該 catch 將被執行,其類型與異常類型匹配。 - 是的,對。實際上,它有點複雜:關鍵是類可以相互繼承。如果類 «Cow» 繼承自類 «Animal»,則類型 «Cow» 的對像不僅可以存儲在類型 «Cow» 的變量中,還可以存儲在類型 «Animal» 的變量中. - 所以呢? - 因為所有的異常都是從類ExceptionRuntimeException繼承的(它們也是從Exception繼承的),它們都可以使用命令catch (Exception e)catch (RuntimeException e)來捕獲。 - 所以呢? - 這意味著,首先,您可以使用命令 catch(Exception e) 捕獲任何異常其次, catch塊的順序很重要。 示例: -除以 0 導致的 ArithmeticException在第二個 catch 中被捕獲。舊級別 09 - 17- 在下面的示例中,ArithmeticException在第一個catch中被捕獲,因為所有異常的類都是從 Exception 繼承的。所以,Exception 捕獲任何異常舊級別 09 - 18- 在下面的示例中,異常ArithmeticException沒有被捕獲,而是被拋給了調用方法。 舊級別 09 - 19- 好吧,現在越來越清楚了。這些異常並不那麼容易。 - 似乎只是如此。事實上,它是 Java 中最簡單的東西之一。 ——不知該高興還是不高興……

8 Diego,多個異常捕捉任務

- 嘿,阿米戈!昨天我喝醉了,把你的任務搞得過於復雜了,但我希望你沒有怨恨,你會解決所有的問題嗎?這是為你好 這裡:
任務
1個 1. 異常
有一個方法拋出兩個繼承自Exception的異常,另外兩個繼承自RuntimeExceptionNullPointerExceptionArithmeticExceptionFileNotFoundExceptionURISyntaxException

您需要捕獲NullPointerExceptionFileNotFoundException,但不需要捕獲ArithmeticExceptionURISyntaxException。怎麼做?
2個 2、捕獲異常Exception
依次繼承了三個異常:class Exception1 extends Exception class Exception2 extends Exception1 class Exception3 extends Exception2 有一個方法,描述如下:public static void method1() throws Exception1, Exception2, Exception3 寫一個catch阻止捕獲所有三個Exception1Exception2Exception3






3個 3. 捕獲選擇性異常
1. 找出方法BEAN.methodThrowExceptions拋出的異常是什麼。
2. 方法processExceptions()應該調用方法BEAN.methodThrowExceptions並處理異常:
2.1。如果發生異常FileSystemException,則通過調用方法BEAN.log記錄它並向前拋出
2.2。如果發生異常CharConversionException或任何其他IOException,只需通過調用方法BEAN.log
記錄它 3. 添加您在 2.1 中轉發的異常的類/類型。到processExceptions()方法簽名。
4. 處理方法main() 中剩餘的異常並記錄它。使用try..catch

提示:如果您捕獲了您不想捕獲的
異常MyException ,您可以使用以下代碼將其向前拋出:
catch (MyException e) {
throw e;
}
4個 4. 捕獲已檢查的異常
在方法processExceptions()中處理所有已檢查的異常。
您需要在屏幕上顯示已發生的每個已檢查異常。
您可以只使用一個塊try
5個 5. 捕獲未經檢查的異常
在方法processExceptions()中處理所有未經檢查的異常。您需要使用printStack()
方法在屏幕上顯示每個發生的異常的堆棧跟踪。 您可以只使用一個塊try

9 教授,關於例外的講座

- 今天我們有一個超級有趣的話題——異常。當時,當年輕的科學家和程序員對這個話題深感興奮時…… - 對不起,我必須去實驗室。這裡是講義。我想你會自己想辦法的。此處: Java 異常(Oracle 文檔) Java 中的異常處理(Java T 點) Java - 異常處理(教程點) Basic Java Exception Handling

10 胡里奧

- 阿米戈,你覺得今天的課怎麼樣?你的正電子腦還沒有鍛煉出來嗎?迭戈的任務足以讓任何人筋疲力盡。讓我們喝杯啤酒,放鬆一下。你還站著嗎?

11 松鼠船長

- 你好,士兵! - 早上好先生! - 我有一些好消息要告訴你。這是一個快速檢查以加強您的技能。每天都這樣做,你會很快提高你的技能。任務是專門為在 Intellij IDEA 中執行而設計的。
在 Intellij Idea 中完成的其他任務
1個 1. 除以零
創建一個方法 public static void divisionByZero(),您需要將任何數字除以零,並將除法結果顯示到屏幕上。
divisionByZero()方法調用包裝到try..catch中。使用方法exception.printStackTrace()在屏幕上顯示異常堆棧跟踪。
2個 2.從10到0倒計時
寫一個從10到0倒計時的循環,使用Thread.sleep(100)做一個延時;
sleep調用包裝到try..catch中。
3個 3. 將方法包裝到 try..catch
從鍵盤讀取數字。將用於從鍵盤讀取數字的代碼寫入單獨的方法readData()中。將此方法的整個主體( readData()
方法 中的整個代碼,除了將存儲數字的列表的聲明之外)包裝到 try..catch。 如果用戶輸入一些文本而不是輸入數字,該方法必須捕獲異常並在屏幕上顯示之前輸入的所有數字。 在屏幕上顯示數字。每個數字都應該在一個新行上。數字的順序應該和輸入時一樣。


4個 4. 日期轉換器
從鍵盤讀取格式為 «08/18/2013» 的日期
在屏幕上顯示格式為 «AUG 18, 2013» 的日期。
使用對象DateSimpleDateFormat
5個 5. 元音和輔音
編寫一個從鍵盤讀取一行的程序。
程序應在屏幕上顯示兩個字符串:
1) 第一個字符串應包含元音
2) 第二個字符串應包含輸入文本中的輔音和標點字符。
用空格分隔字符。

示例輸入:
Stop look listen
示例輸出:
oooie
stplklstn
6個 六、小紅帽的故事
1.有五個班級:小紅帽、外婆、帕蒂、樵夫、狼。2、每個類都有兩個ArrayList
類型 的字段:killed和ate。 3. 已經創建了必要的對象(頭巾、祖母……)。 4.建立正確的關係(誰吃了誰殺了誰)得到《小紅帽》的邏輯。

7 7. Move static 修飾
Move static 修飾符使代碼編譯通過。
8個 8. 數字數組列表
創建一個列表,其元素是數字數組。將長度分別為 5、2、4、7、0 的五個對像數組添加到列表中。用任何數據填充數組並將它們顯示在屏幕上。
9 9. 十隻貓
創建一個類 Cat,其字段為String name
創建字典Map<String, Cat>,在模型 «Name» - «Cat» 上添加 10 隻貓。
地圖中獲取一名稱並將該組顯示到屏幕上。
- 這些任務是針對果嶺的。我添加了更複雜的獎勵任務。僅適用於頂級槍支。
獎勵任務
1個 1.程序沒有編譯運行。修理它。
任務:程序應從鍵盤讀取兩個文件名,並將第一個文件複製到第二個文件名指定的位置。
2個 2. 為程序添加新功能。
舊任務:程序應從鍵盤讀取兩個文件名,並將第一個文件複製到第二個文件名指定的位置。
新任務:程序應從鍵盤讀取兩個文件名,並將第一個文件複製到第二個文件名指定的位置。

如果具有指定名稱的文件(將被複製)不存在,程序應該在屏幕上顯示消息 «文件不存在» 並在讀取之前再次嘗試從控制台讀取文件名第二個(目標)文件的名稱。
3個 3.學習和練習算法。
從鍵盤上讀出單詞和數字的列表。在屏幕上按升序顯示單詞,按降序顯示數字。

示例輸入:
Cherry
1
Bean
3
Apple
2
0
Watermelon

示例輸出:
Apple
3
Bean
2
Cherry
1
0
Watermelon
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION