知識與技能
大學告訴我們,理論和實踐之間沒有太大的區別。好吧,你肯定明白那是不一樣的。但是您看不到核心區別。然而有一個。 大多數人在“我知道”和“我能”之間劃等號。你? 舉幾個例子怎麼樣?- 我知道抽煙對我不好,但我還是抽煙。
- 我知道快餐對我不好,但我還是吃了。
- 我知道交通規則,但我不會開車。
- 我知道慢跑對我有好處,但我早上不慢跑。
你已經達到了一個新的水平
9級
1 Risha,堆棧跟踪
- 嘿!今天我將告訴你堆棧跟踪是什麼。但首先讓我向您解釋一下堆棧是什麼。- 想像一堆文件 - 某個職員的任務。一個新的賦值可以放到棧頂,他會從一個棧頂取一個賦值。因此,分配將不是先到先得。每次店員接受最後的任務。這樣的集合結構稱為棧。 -在 Java 中,有一個特殊的集合 - Stack。這個集合有方法 «add an element» 和 «take(get/take away) an element»。如您所知,最後添加的元素將首先被採用。 - 哼。我想這並不難。 - 美好的。然後讓我解釋什麼是堆棧跟踪是。- 想像一下,在 Java 中,函數 А調用函數 B,後者調用函數 C,後者又調用函數 D。因此,要退出功能 B,您必須先退出功能 C,然後您必須退出功能 D。這與堆棧非常相似。 - 相似之處是什麼? - 在堆棧中,要完成某個任務,您還必須完成所有放在最上面的任務。 - 好吧,這是一個類比,但我不確定我是否理解正確。 - 看這裡。在 Java 中,堆棧是一組元素。這就像一堆紙。要從頂部開始第三張,你必須拿第二張,但在此之前你必須拿第一張。你總是可以放床單和拿床單,但你只能把床單放在上面,也只能從上面拿。這同樣適用於函數調用。函數 А調用函數 B,後者調用函數 C。要退出А,您必須先退出B,為此您必須退出C。 - 等一下。如果我做對了,整個堆棧會變成“只能取出放在堆棧上的最後一張紙”和“首先,最後調用的函數應該退出”。是這樣嗎? - 是的。因此,函數調用的順序是«函數調用堆棧»,或簡稱為«調用堆棧»。最後調用的函數必須首先終止。讓我們看一下這個例子: - 好的。我想,函數調用一切都很清楚。但是這個StackTraceElement是什麼? - Java 虛擬機記錄所有函數調用。為此,它有一個特殊的集合——堆棧。當一個函數調用另一個函數時,JVM 會將一個新元素StackTraceElement放入此堆棧中。當函數結束時,元素從堆棧中刪除。因此,該堆棧始終存儲有關 «函數調用堆棧» 當前狀態的最新信息。 - 每個StackTraceElement包含有關被調用方法的信息。因此,您可以使用getMethodName獲取此方法的名稱。- 上面的例子說明了這一點:- 獲取«調用堆棧»:
- 使用循環for-each迭代數組。我希望你沒有忘記它。
- 將方法名稱打印到System.out。
2 Diego,堆棧跟踪顯示上的任務
- 嘿,阿米戈!這是一個在屏幕上顯示堆棧跟踪的小任務。任務 | |
---|---|
1個 | 每個方法都應該返回它的 StackTrace 寫五個相互調用的方法。每個方法都應返回其 StackTrace。 |
2個 | StackTrace 再寫五個相互調用的方法。每個方法都應返回其調用方方法的名稱。您可以使用 StackTrace 獲取調用方方法。 |
3個 | 該方法應返回調用此方法的代碼的行號,從 編寫相互調用的五個方法。每個方法都應返回調用此方法的代碼的行號。使用函數element.getLineNumber()。 |
4個 | 10 次調用的堆棧跟踪 編寫代碼以獲得 10 次調用的堆棧跟踪。 |
5個 | 該方法應返回一個結果 - 它的堆棧跟踪深度 編寫一個顯示並返回其堆棧跟踪深度的方法。堆棧跟踪深度是其方法的數量(列表中的元素數量)。 |
3 Elly,錯誤和異常
- 嘿,阿米戈!今天我們上了一堂非常有趣的課。我會告訴你例外情況。異常是程序中控制錯誤的一種特殊機制。以下是程序中可能出現的一些錯誤示例:- 該程序嘗試將文件寫入整個磁盤。
- 該程序嘗試調用存儲空引用的變量的方法。
- 該程序試圖將一個數除以 0。
- 當錯誤發生時,Java 虛擬機創建一個特殊的對象——一個異常——包含關於錯誤的所有信息。對於不同的錯誤有不同的異常。
- 然後這個異常會強製程序立即中斷當前函數,然後中斷下一個函數,直到退出 main 方法。之後程序終止。Java 開發人員將此過程稱為“回滾調用堆棧”。
- 如果try塊內部發生異常,則不再執行該塊中的代碼,而是開始執行塊catch。
- 如果沒有異常發生,try 塊將執行到結束,並且永遠不會執行catch。
4 Elly,RuntimeException,拋出
- 我決定今天提出另一個話題。在 Java 中,所有異常都分為兩種類型——受控/受控和不受控/未受控。必須捕獲已檢查的異常,可以捕獲未檢查的異常,但這不是必需的。 - 是否可以故意在代碼中拋出異常? - 在你的代碼中,你可以自己拋出異常。您甚至可以編寫自己的異常。但我們稍後會深入這個洞。現在讓我們學習如何處理 Java 虛擬機拋出的異常。 - 好的。 - 如果異常ClassNotFoundException和FileNotFoundException被拋出(出現)在一個方法中,程序員必須在方法的簽名(方法頭)中指定它們。檢查此類異常。這就是它通常的樣子: - 所以,我們只寫拋出並列出用逗號分隔的異常。正確的?是這樣嗎? - 是的。但還有一件有趣的事。為了編譯下面的示例,調用method1()的方法必須捕獲這些異常或將它們向前拋出。如果你想向前拋出檢查異常,你需要在方法的頭中指定它。- 再一次,如果在main方法中,您想調用一個在其標題短語中包含throws FileNotFoundException 的方法,...那麼你必須做以下兩件事之一:- 捕獲異常 FileNotFoundException,......
你必須用try-catch塊包裝你調用危險方法的代碼 - 不要捕獲異常 FileNotFoundException,...
5 Risha,滾動調用堆棧,如何在異常中執行
- 我想告訴你更多關於異常如何工作的信息。下面的例子解釋說: - 我不明白。 - 好的。我會解釋發生了什麼。- 在左邊的例子中,我們按鍊式順序調用了幾個方法。在method2()中,我們專門創建並拋出異常(以引發錯誤)。- 右邊的例子顯示了會發生什麼。查看method2()。這就是異常的創建轉換成的:我們創建一個RuntimeException類型的對象,將它存儲在一個特殊的變量異常中,然後立即退出方法 - return。- 在method1中,在調用method2之後進行檢查,是否有例外;如果有異常,則 method1 立即終止。此檢查在調用每個(!)Java 方法後隱式完成。 - 哇! - 確切地。- 在方法main的右側欄中,我寫了當異常被try-catch塊捕獲時會發生什麼。如果沒有異常,代碼將繼續按計劃執行。如果存在catch中指定類型的異常,那麼我們將處理它。 - throw和instanceof是什麼意思? - 看左邊最後一行throw new RuntimeException(s). 通過這種方式,我們創建並拋出異常。這只是一個例子。到目前為止我們不會這樣做。- 在右側塊中使用命令« аinstanceofB »我們檢查對象a是否具有類型B。也就是說,存儲在變量 exception 中的對像是否具有 RuntimeException 類型。這是一個合乎邏輯的表達。 - 好吧,它變得更清楚了。6 Diego,異常捕獲任務
- 看這裡!迭戈叔叔為您帶來了很少的任務。祝你好運。我想你會需要它。呵呵。 - 嘿,阿米戈!這裡有一些有趣的異常捕獲任務。抓任務 | |
---|---|
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,多次捕獲的工作原理
- 現在,一些更有趣的講座。我非常喜歡教學。- 我想告訴你多重捕捉是如何工作的。其實很簡單:當try塊發生異常時,程序執行轉移到第一個catch。-如果塊 catch 的括號中指定的類型與異常對象的類型相同,則代碼執行從 {} 內部開始。否則我們去下一個捕獲。在那裡重複檢查。- 如果沒有更多的catch塊,但異常還沒有被捕獲,則向前拋出,併中斷當前方法。 - 我懂了。該 catch 將被執行,其類型與異常類型匹配。 - 是的,對。實際上,它有點複雜:關鍵是類可以相互繼承。如果類 «Cow» 繼承自類 «Animal»,則類型 «Cow» 的對像不僅可以存儲在類型 «Cow» 的變量中,還可以存儲在類型 «Animal» 的變量中. - 所以呢? - 因為所有的異常都是從類Exception或RuntimeException繼承的(它們也是從Exception繼承的),它們都可以使用命令catch (Exception e)或catch (RuntimeException e)來捕獲。 - 所以呢? - 這意味著,首先,您可以使用命令 catch(Exception e) 捕獲任何異常。其次, catch塊的順序很重要。 示例: -除以 0 導致的 ArithmeticException在第二個 catch 中被捕獲。- 在下面的示例中,ArithmeticException在第一個catch中被捕獲,因為所有異常的類都是從 Exception 繼承的。所以,Exception 捕獲任何異常。 - 在下面的示例中,異常ArithmeticException沒有被捕獲,而是被拋給了調用方法。 - 好吧,現在越來越清楚了。這些異常並不那麼容易。 - 似乎只是如此。事實上,它是 Java 中最簡單的東西之一。 ——不知該高興還是不高興……8 Diego,多個異常捕捉任務
- 嘿,阿米戈!昨天我喝醉了,把你的任務搞得過於復雜了,但我希望你沒有怨恨,你會解決所有的問題嗎?這是為你好 這裡:任務 | |
---|---|
1個 | 1. 異常 有一個方法拋出兩個繼承自Exception的異常,另外兩個繼承自RuntimeException:NullPointerException、ArithmeticException、FileNotFoundException和URISyntaxException。 您需要捕獲NullPointerException和FileNotFoundException,但不需要捕獲ArithmeticException和URISyntaxException。怎麼做? |
2個 | 2、捕獲異常Exception 依次繼承了三個異常:class Exception1 extends Exception class Exception2 extends Exception1 class Exception3 extends Exception2 有一個方法,描述如下:public static void method1() throws Exception1, Exception2, Exception3 寫一個catch阻止捕獲所有三個Exception1,Exception2和Exception3 |
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 Handling10 胡里奧
- 阿米戈,你覺得今天的課怎麼樣?你的正電子腦還沒有鍛煉出來嗎?迭戈的任務足以讓任何人筋疲力盡。讓我們喝杯啤酒,放鬆一下。你還站著嗎?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» 的日期。 使用對象Date和SimpleDateFormat。 |
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 |
GO TO FULL VERSION