java面向對象:異常處理 —(18)

1. 異常的體系結構

  • java.lang.Throwable
  •  |-----java.lang.Error:一般不編寫針對性的代碼進行處理。
    
  •  |-----java.lang.Exception:可以進行異常的處理
    
  •  	|------編譯時異常(checked)
    
  •  			|-----IOException
    
  •  				|-----FileNotFoundException
    
  •  			|-----ClassNotFoundException
    
  •  	|------運行時異常(unchecked,RuntimeException)
    
  •  			|-----NullPointerException
    
  •  			|-----ArrayIndexOutOfBoundsException
    
  •  			|-----ClassCastException
    
  •  			|-----NumberFormatException
    
  •  			|-----InputMismatchException
    
  •  			|-----ArithmeticException
    

在這里插入圖片描述

2.從程序執行過程,看編譯時異常和運行時異常

在這里插入圖片描述

編譯時異常:執行javac.exe命名時,可能出現的異常
運行時異常:執行java.exe命名時,出現的異常

3.常見的異常類型,請舉例說明:


//******************以下是運行時異常***************************//ArithmeticException@Testpublic void test6(){int a = 10;int b = 0;System.out.println(a / b);}//InputMismatchException@Testpublic void test5(){Scanner scanner = new Scanner(System.in);int score = scanner.nextInt();System.out.println(score);scanner.close();}//NumberFormatException@Testpublic void test4(){String str = "123";str = "abc";int num = Integer.parseInt(str);}//ClassCastException@Testpublic void test3(){Object obj = new Date();String str = (String)obj;}//IndexOutOfBoundsException@Testpublic void test2(){//ArrayIndexOutOfBoundsException
//		int[] arr = new int[10];
//		System.out.println(arr[10]);//StringIndexOutOfBoundsExceptionString str = "abc";System.out.println(str.charAt(3));}//NullPointerException@Testpublic void test1(){//		int[] arr = null;
//		System.out.println(arr[3]);String str = "abc";str = null;System.out.println(str.charAt(0));}//******************以下是編譯時異常***************************@Testpublic void test7(){
//		File file = new File("hello.txt");
//		FileInputStream fis = new FileInputStream(file);
//		
//		int data = fis.read();
//		while(data != -1){
//			System.out.print((char)data);
//			data = fis.read();
//		}
//		
//		fis.close();}

異常的處理

1.java異常處理的抓拋模型

過程一:“拋”:程序在正常執行的過程中,一旦出現異常,就會在異常代碼處生成一個對應異常類的對象。

  •       并將此對象拋出。
    
  •       一旦拋出對象以后,其后的代碼就不再執行。
    
  •  關于異常對象的產生:① 系統自動生成的異常對象
    
  •  			     ② 手動的生成一個異常對象,并拋出(throw)
    

過程二:“抓”:可以理解為異常的處理方式:① try-catch-finally ② throws

2.異常處理方式一:try-catch-finally

2.1 使用說明:
try{

  •  //可能出現異常的代碼
    
  • }catch(異常類型1 變量名1){
  •  //處理異常的方式1
    
  • }catch(異常類型2 變量名2){
  •  //處理異常的方式2
    
  • }catch(異常類型3 變量名3){
  •  //處理異常的方式3
    
  • }
  • finally{
  •  //一定會執行的代碼
    
  • }
  • 說明:
    1. finally是可的。
    1. 使用try將可能出現異常代碼包裝起來,在執行過程中,一旦出現異常,就會生成一個對應異常類的對象,根據此對象的類型,去catch中進行匹配
    1. 一旦try中的異常對象匹配到某一個catch時,就進入catch中進行異常的處理。一旦處理完成,就跳出當前的try-catch結構(在沒寫finally的情況。繼續執行其后的代碼
    1. catch中的異常類型如果沒子父類關系,則誰聲明在上,誰聲明在下無所謂。
  • catch中的異常類型如果滿足子父類關系,則要求子類一定聲明在父類的上面。否則,報錯
    1. 常用的異常對象處理的方式: ① String getMessage() ② printStackTrace()
    1. 在try結構中聲明的變量,再出了try結構以后,就不能再被調用
    1. try-catch-finally結構可以嵌套

總結:如何看待代碼中的編譯時異常和運行時異常?

  • 體會1:使用try-catch-finally處理編譯時異常,是得程序在編譯時就不再報錯,但是運行時仍可能報錯。相當于我們使用try-catch-finally將一個編譯時可能出現的異常,延遲到運行時出現。
  • 體會2:開發中,由于運行時異常比較常見,所以我們通常就不針對運行時異常編寫try-catch-finally了。針對于編譯時異常,我們說一定要考慮異常的處理。
    2.2:finally的再說明:
  • 1.finally是可的
  • 2.finally中聲明的是一定會被執行的代碼。即使catch中又出現異常了,try中return語句,catch中return語句等情況。
  • 3.像數據庫連接、輸入輸出流、網絡編程Socket等資源,JVM是不能自動的回收的,我們需要自己手動的進行資源的釋放。此時的資源釋放,就需要聲明在finally中。

2.3:[面試題]

final、finally、finalize三者的區別?

類似:
throw 和 throws
Collection 和 Collections
String 、StringBuffer、StringBuilder
ArrayList 、 LinkedList
HashMap 、LinkedHashMap
重寫、重載

結構不相似的:
抽象類、接口
== 、 equals()
sleep()、wait()

3.異常處理方式二:

"throws + 異常類型"寫在方法的聲明處。指明此方法執行時,可能會拋出的異常類型。
一旦當方法體執行時,出現異常,仍會在異常代碼處生成一個異常類的對象,此對象滿足throws后異常類型時,就會被拋出。異常代碼后續的代碼,就不再執行!

  1. 對比兩種處理方式
    try-catch-finally:真正的將異常給處理掉了。
    throws的方式只是將異常拋給了方法的調用者。并沒真正將異常處理掉。

  2. 體會開發中應該如何選擇兩種處理方式?

  • 5.1 如果父類中被重寫的方法沒throws方式處理異常,則子類重寫的方法也不能使用throws,意味著如果子類重寫的方法中異常,必須使用try-catch-finally方式處理。
  • 5.2 執行的方法a中,先后又調用了另外的幾個方法,這幾個方法是遞進關系執行的。我們建議這幾個方法使用throws的方式進行處理。而執行的方法a可以考慮使用try-catch-finally方式進行處理。

補充:
方法重寫的規則之一:
子類重寫的方法拋出的異常類型不大于父類被重寫的方法拋出的異常類型

手動拋出異常對象

1.使用說明

在程序執行中,除了自動拋出異常對象的情況之外,我們還可以手動的throw一個異常類的對象。

2.[面試題]

throw 和 throws區別:
throw 表示拋出一個異常類的對象,生成異常對象的過程。聲明在方法體內。
throws 屬于異常處理的一種方式,聲明在方法的聲明處。

3.典型例題

class Student{private int id;public void regist(int id) throws Exception {if(id > 0){this.id = id;}else{//手動拋出異常對象
//			throw new RuntimeException("您輸入的數據非法!");
//			throw new Exception("您輸入的數據非法!");throw new MyException("不能輸入負數");}}@Overridepublic String toString() {return "Student [id=" + id + "]";}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247697.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247697.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247697.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue請求簡單配置

簡單記錄一下vue的http請求配置相關 測試環境請求接口設置:   1. config/dev.env.js添加:     module.exports merge(prodEnv, {       NODE_ENV: "development",       API_ROOT: "http://", //配置http請求頭     })…

【vue報錯】——listen EADDRINUSE :::8080 解決方案

問題原因: 此項錯誤表示 8080 端口被占用 解決方案一: 打開cmd 輸入:netstat -ano 查看所有端口信息,如圖,找到端口 8081,以及對應的 PID 輸入:tskill PID 即可殺死進程 解決方案二&#xff1a…

記錄_20190626

java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result異常的解決方法 原來JAVA中如果用BigDecimal做除法的時候一定要在divide方法中傳遞第二個參數,定義精確到小數點后幾位,否則在不整除的情況下…

String與Array

public class Api {Testpublic void StringApi(){// equals() 判斷內容是否相同區分大小寫// equalsIgnoreCase() 判斷內容是否相同不區分大小寫// length() 獲取長度// charAt(int index) 獲取某個索引位置的字…

HTML與CSS布局技巧總結

很多人對CSS的布局有困惑,實際的應用場景中由于布局種類多難以選擇。今天我花些時間總結下自己對CSS布局的理解,分析下了解各種布局的優劣,同時希望能分享給初入前端的朋友們一些在布局上的經驗,如果有那些地方總結的不好&#xf…

當談論迭代器時,我談些什么?

花下貓語:之前說過,我對于編程語言跟其它學科的融合非常感興趣,但我還說漏了一點,就是我對于 Python 跟其它編程語言的對比學習,也很感興趣。所以,我一直希望能聚集一些有其它語言基礎的同學,一…

在Vue-cli項目中使用echarts

該示例使用 vue-cli 腳手架搭建 安裝echarts依賴 npm install echarts -S11 或者使用國內的淘寶鏡像: 安裝 npm install -g cnpm --registryhttps://registry.npm.taobao.org11 使用 cnpm install echarts -S11 創建圖表 全局引入 main.js // 引入echarts im…

Java的模板文件配置

Java的Mappers文件配置 <?xml version"1.0" encoding"UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace"com.qfedu.…

Python爬蟲學習二

1、selenium自動測試工具 2、主要使用selenium的目的是跳過登錄驗證3、下載驅動器下載請求庫from selenium import webdriver import time#1、 直接在script文件夾中找驅動 driverwebdriver.Chrome() time.sleep(5) driver.close()#2、找到驅動路徑 #webdriver.Chrome(rD:\Pyth…

通過GitHub Pages創建個人主頁

登陸github,創建新倉庫&#xff0c;寫入名字, 這里要以github.io做后綴, 不然創建出來的不是GitHub Pages 打開終端, cd到自己想要的文件夾后clone到本地 git clone https://github.com/username/username.github.io 進入這個項目文件夾 cd username.github.io 把寫好HTML項目拷…

Spring IOC 配置文件模板

基于XML的普通設置 <?xml version1.0 encodingUTF-8 ?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:context"http://www.springframework.org/schema/contex…

validate+jquery+ajax表單驗證

1.案例 1.1 Html form表單內容 <form class"cForm" id"cForm" method"post" action""> <p> <label for"user">用戶名</label> <input id"user" name"user" required minlen…

Html5做webapp中界面適配的問題總結

做一款軟件首先是要做出相應的界面&#xff0c;然而對于手機軟件開發者來說&#xff0c;大小各異的手機屏幕卻給我們帶來了不少的麻煩。HTML5技術在大家的心中要比傳統的Android/iOS/wp簡單的多&#xff0c;因為它的適配性和平臺跨越方面比較出色。在外看來卻不是那樣的&#x…

設置Maven下載鏡像源(直接替換其中的 settings.xml 內容即可)

<?xml version"1.0" encoding"UTF-8"?> <settings xmlns"http://maven.apache.org/SETTINGS/1.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/SETTINGS/1.0.…

P1576 最小花費

----------------------------------- 這道題就是圖論最短路&#xff0c;但是我們要改一下一些細節 比如說&#xff0c;因為這是算匯率&#xff0c;我們的初始化就要是0 我們還要改一改松弛操作 ----------------------------------- 還有&#xff0c;題目上給的是匯率&#xf…

css hack技術整理

做前端多年&#xff0c;雖然不是經常需要hack&#xff0c;但是我們經常會遇到各瀏覽器表現不一致的情況。基于此&#xff0c;某些情況我們會極不情愿的使用這個不太友好的方式來達到大家要求的頁面表現。我個人是不太推薦使用hack的&#xff0c;要知道一名好的前端&#xff0c;…

Hanoi雙塔問題

Hanoi雙塔問題 題目描述 給定A,B,C三根足夠長的細柱&#xff0c;在A柱上放有2n個中間有空的圓盤&#xff0c;共有n個不同的尺寸&#xff0c;每個尺寸都有兩個相同的圓盤&#xff0c;注意這兩個圓盤是不加區分的(下圖為n3的情形&#xff09;。現要將 這些國盤移到C柱上&#xff…

vue中config/index.js:配置的詳細理解

當我們需要和后臺分離部署的時候&#xff0c;必須配置config/index.js: 用vue-cli 自動構建的目錄里面 &#xff08;環境變量及其基本變量的配置&#xff09; 123456789101112131415var path require(path)module.exports {build: {index: path.resolve(__dirname, dist/ind…

uni-app吸頂固定樣式

<template><view class"full"><view class"sticky-box"><!-- 搜索 --><uni-search-bar class"unisearchbar" radius"5" placeholder"請輸入搜索關鍵詞" clearButton"auto" bgColor&qu…

Django(模板語言-自定義filter和simple_tag)

filter過濾器的主要形式&#xff1a;變量|函數,意思是將變量交給函數處理&#xff0c;而自定義filter就是自己定義函數&#xff0c;因為用到已有的很少。 1.在當前app中創建templatetags模塊(包&#xff1a;帶__init__.py)&#xff08;必須的&#xff09; 2.在templatetags中創…