JavaSE知識-19(異常&IO(File類))


異常的概述和分類

  • A:異常的概述
    • 異常就是Java程序在運行過程中出現的錯誤。
  • B:異常的分類
    • 通過API查看Throwable
    • Error
      • 服務器宕機,數據庫崩潰等
    • Exception
      C:異常的繼承體系
    • Throwable
      • Error
      • Exception
        • RuntimeException
package com.hwh.exception;
public class Demo1_Exception {
	public static void main(String[] args) {
				int[] arr = {11,22,33,44,55};
				//arr = null;					//NullPointerException				空指針異常
				System.out.println(arr[10]);	//ArrayIndexOutOfBoundsException	數組索引越界異常
			}
		}

JVM默認是如何處理異常的

  • main函數收到這個問題時,有兩種處理方式:
  • a:自己將該問題處理,然后繼續運行
  • b:自己沒有針對的處理方式,只有交給調用main的jvm來處理
  • jvm有一個默認的異常處理機制,就將該異常進行處理.
  • 並將該異常的名稱,異常的信息.異常出現的位置打印在了控制台上,同時將程序停止運行
package com.hwh.exception;
public class Demo1_Exception {
	public static void main(String[] args) {
				Demo d = new Demo();
				int x = d.div(10, 0);
				System.out.println(x);
			}
		}

		class Demo {
			/*
			 * 除法運算
			 */
			public int div(int a,int b) {		//a = 10,b = 0
				return a / b;					// 10 / 0  被除數是10,除數是0當除數是0的時候違背了算數運算法則,拋出異常
												//new ArithmeticException("/ by zero");
			}
		} 

try...catch的方式處理異常1

  • A:異常處理的兩種方式
    • a:try…catch…finally
      • try catch
      • try catch finally
      • try finally
    • b:throws
  • B:try...catch處理異常的基本格式
    • try…catch…finally
package com.hwh.exception;
public class Demo2_Exception {
	public static void main(String[] args) {
		/**
				try:用來檢測異常的
				catch:用來捕獲異常的
				finally:釋放資源
				
				世界上最真情的相依就是你在try我在catch,無論你發神馬脾氣,我都靜靜接受,默默處理
				當通過trycatch將問題處理了,程序會繼續執行
			 */
				Demo2 d = new Demo2();
				try{
					int x = d.div(10, 0);
					System.out.println(x);
				}catch(ArithmeticException a) {		//ArithmeticException a = new ArithmeticException();
					System.out.println("出錯了,除數為零了");
				}
				
				System.out.println("1111111111111111");
			}

		}

		class Demo2 {//同一個包下, 不能有兩個相同的源文件, 改為Demo2
			/*
			 * 除法運算
			 */
			public int div(int a,int b) {		//a = 10,b = 0
				return a / b;					// 10 / 0  被除數是10,除數是0當除數是0的時候違背了算數運算法則,拋出異常
												//new ArithmeticException("/ by zero");
			}
		} 

try...catch的方式處理異常2

  • try...catch的方式處理多個異常
  • JDK7以后處理多個異常的方式及注意事項
package com.hwh.exception;
public class Demo3_Exception {
			/**
			 * 安卓,客戶端開發,如何處理異常?try{}catch(Exception e){}
			 * ee,服務端開發,一般都是底層開發,從底層向上拋
			 * 
			 * try后面如果跟多個catch,那么小的異常放前面,大的異常放后面,根據多態的原理,如果大的放前面,就會將所有的子類對象接收
			 * 后面的catch就沒有意義了
			 */
			public static void main(String[] args) {
				demo1();
				int a = 10;
				int b = 0;
				int[] arr = {11,22,33,44,55};
				
				//JDK7如何處理多個異常
				try {
					System.out.println(a / b);
					System.out.println(arr[10]);
				} catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
					System.out.println("出錯了");//出錯了
				} 
			}

			public static void demo1() {
				int a = 10;
				int b = 0;
				int[] arr = {11,22,33,44,55};
				
				try {
					System.out.println(a / b);
					System.out.println(arr[10]);
					arr = null;
					System.out.println(arr[0]);
				} catch (ArithmeticException e) {
					System.out.println("除數不能為零");
				} catch (ArrayIndexOutOfBoundsException e) {
					System.out.println("索引越界了");
				} catch (Exception e) {				//Exception e = new NullPointerException();
					System.out.println("出錯了");
				}
				//除數不能為零
				System.out.println("over");//over
			}
		}

編譯期異常和運行期異常的區別

  • 編譯期異常和運行期異常的區別
    • Java中的異常被分為兩大類:編譯時異常和運行時異常。

    • 所有的RuntimeException類及其子類的實例被稱為運行時異常,其他的異常就是編譯時異常

    • 編譯時異常

      • Java程序必須顯示處理,否則程序就會發生錯誤,無法通過編譯
    • 運行時異常

      • 無需顯示處理,也可以和編譯時異常一樣處理
package com.hwh.exception;
import java.io.FileInputStream;
public class Demo4_Exception {
	public static void main(String[] args) {
			/**
			編譯時異常也可以理解為未雨綢繆異常
				未雨綢繆:在做某些事情的時候要做某些准備
				編譯時異常:在編譯某個程序的時候,有可能會有這樣那樣的事情發生,比如文件找不到,這樣的異常就必須在編譯的時候處理
				如果不處理編譯通不過
				
				運行時異常:就是程序員所犯得錯誤,需要回來修改代碼
			 */
				try {
					FileInputStream fis = new FileInputStream("xxx.txt");//FileNotFoundException
					}catch(Exception e) {
					System.out.println("錯啦");//錯啦
				}
			}
		}

Throwable的幾個常見方法

  • a:getMessage()
    • 獲取異常信息,返回字符串。
  • b:toString()
    • 獲取異常類名和異常信息,返回字符串。
  • c:printStackTrace()
    • 獲取異常類名和異常信息,以及異常出現在程序中的位置。返回值void。
package com.hwh.exception;
public class Demo5_Throwable {
	public static void main(String[] args) {
		try {
			System.out.println(1/0);
		} catch (Exception e) {			//Exception e = new ArithmeticException("/ by zero");
			//System.out.println(e.getMessage());// / by zero		//獲取異常信息
			//System.out.println(e);//java.lang.ArithmeticException: / by zero //調用toString方法,打印異常類名和異常信息
			e.printStackTrace();//java.lang.ArithmeticException: / by zero  at com.hwh.exception.Demo5_Throwable.main(Demo5_Throwable.java:7)		//jvm默認就用這種方式處理異常
		}
	}
}

throws的方式處理異常

  • throws的方式處理異常
    • 定義功能方法時,需要把出現的問題暴露出來讓調用者去處理。
    • 那么就通過throws在方法上標識。
package com.hwh.exception;
public class Demo6_Exception {
			/**
					* 編譯時異常的拋出必須對其進行處理
					* 運行時異常的拋出可以處理也可以不處理
			 * @throws Exception 
			 */
			public static void main(String[] args) throws Exception {
				Person p = new Person();
				p.setAge(-17);
				System.out.println(p.getAge());
			}

		}

		class Person {
			private String name;
			private int age;
			public Person() {
				super();
				
			}
			public Person(String name, int age) {
				super();
				this.name = name;
				this.age = age;
			}
			public String getName() {
				return name;
			}
			public void setName(String name) {
				this.name = name;
			}
			public int getAge() {
				return age;
			}
			public void setAge(int age) throws Exception {//運行時異常, 此處不拋出也可以
				if(age >0 && age <= 150) {
					this.age = age;
				}else {
					//Exception e = new Exception("年齡非法");
					//throw e;
					throw new Exception("年齡非法");
				}
			}	
		}

運行結果為Exception in thread "main" java.lang.Exception: 年齡非法
at com.hwh.exception.Person.setAge(Demo6_Exception.java:43)
at com.hwh.exception.Demo6_Exception.main(Demo6_Exception.java:10)

throw的概述以及和throws的區別

  • throw的概述
    • 在功能方法內部出現某種情況,程序不能繼續運行,需要進行跳轉時,就用throw把異常對象拋出。
  • 案例演示
    • 分別演示編譯時異常對象和運行時異常對象的拋出
  • throws和throw的區別
    • a:throws
      • 用在方法聲明后面,跟的是異常類名
      • 可以跟多個異常類名,用逗號隔開
      • 表示拋出異常,由該方法的調用者來處理
    • b:throw
      • 用在方法體內,跟的是異常對象名
      • 只能拋出一個異常對象名
      • 表示拋出異常,由方法體內的語句處理

finally關鍵字的特點及作用

  • finally的特點
    • 被finally控制的語句體一定會執行
    • 特殊情況:在執行到finally之前jvm退出了(比如System.exit(0))
  • finally的作用
    • 用於釋放資源,在IO流操作和數據庫操作中會見到
package com.hwh.exception;
public class Demo7_Finally {
	public static void main(String[] args) {
		/*return語句相當於是方法的最后一口氣,那么在他將死之前會看一看有沒有finally幫其完成遺願,如果有就將finally執行
		后在徹底返回
	 */
		try {
			System.out.println(10/0);
		} catch (Exception e) {
			System.out.println("除數為零了");
			//System.exit(0);								//退出jvm虛擬機
			return;
		} finally {
			System.out.println("看看我執行了嗎");//exit(0)則本句不執行, return則執行
		}
	}
}

finally關鍵字的面試題

  • A:面試題1
    • final,finally和finalize的區別
  • final可以修飾類,不能被繼承
    • 修飾方法,不能被重寫
    • 修飾變量,只能賦值一次
  • finally是try語句中的一個語句體,不能單獨使用,用來釋放資源
  • finalize是一個方法,當垃圾回收器確定不存在對該對象的更多引用時,由對象的垃圾回收器調用此方法。
  • B:面試題2
    • 如果catch里面有return語句,請問finally的代碼還會執行嗎?如果會,請問是在return前還是return后。
package com.hwh.test;
public class Test1 {
	public static void main(String[] args) {
				Demo d = new Demo();
				System.out.println(d.method());//30
			}
		}

		class Demo {
			public int method() {
				int x = 10;
				try {
					x = 20;
					System.out.println(1/0);
					return x;
				} catch (Exception e) {
					x = 30;
					return x;
				} finally {
					x = 40;
					//return x;					千萬不要在finally里面寫返回語句,因為finally的作用是為了釋放資源,是肯定會執行的
												//如果在這里面寫返回語句,那么try和catch的結果都會被改變,所以這么寫就是犯罪
				}
			}
		}

自定義異常概述和基本使用

  • A:為什么需要自定義異常
    • 舉例:人的年齡
  • B:自定義異常概述
    • 繼承自Exception
    • 繼承自RuntimeException

alt shift s c生成一個空參和一個有String參數的

package com.hwh.exception;
public class Demo8_Exception {
	public static void main(String[] args) {
	}
}
class AgeOutOfBoundsException extends Exception{
	public AgeOutOfBoundsException() {
		super();
	}
	public AgeOutOfBoundsException(String arg0) {
		super(arg0);
	}
}

修改Demo6

異常的注意事項及如何使用異常處理

  • A:異常注意事項
    • a:子類重寫父類方法時,子類的方法必須拋出相同的異常或父類異常的子類。(父親壞了,兒子不能比父親更壞)
    • b:如果父類拋出了多個異常,子類重寫父類時,只能拋出相同的異常或者是他的子集,子類不能拋出父類沒有的異常
    • c:如果被重寫的方法沒有異常拋出,那么子類的方法絕對不可以拋出異常,如果子類方法內有異常發生,那么子類只能try,不能throws
  • B:如何使用異常處理
    • 原則:如果該功能內部可以將問題處理,用try,如果處理不了,交由調用者處理,這是用throws
    • 區別:
      • 后續程序需要繼續運行就try
      • 后續程序不需要繼續運行就throws
    • 如果JDK沒有提供對應的異常,需要自定義異常。

17->Test6.java添加

17->Test7.java添加

練習

  • 鍵盤錄入一個int類型的整數,對其求二進制表現形式
    • 如果錄入的整數過大,給予提示,錄入的整數過大請重新錄入一個整數BigInteger
    • 如果錄入的是小數,給予提示,錄入的是小數,請重新錄入一個整數
    • 如果錄入的是其他字符,給予提示,錄入的是非法字符,請重新錄入一個整數
package com.hwh.test;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;
public class Test2 {
	public static void main(String[] args) {
			/**
			 * 分析:
			 * 1,創建鍵盤錄入對象
			 * 2,將鍵盤錄入的結果存儲在String類型的字符串中,存儲int類型中如果有不符合條件的直接報錯,無法進行后續判斷
			 * 3,鍵盤錄入的結果轉換成int類型的數據,是正確的還是錯誤的
			 * 4,正確的直接轉換
			 * 5,錯誤的要進行對應判斷
			 */
				Scanner sc = new Scanner(System.in);
				System.out.println("請輸入一個整數:");
				
				while(true) {
					String line = sc.nextLine();					//將鍵盤錄入的結果存儲在line中
					try {
						int num = Integer.parseInt(line);				//將字符串轉換為整數
						System.out.println(Integer.toBinaryString(num));//將整數轉換為二進制
						break;											//跳出循環
					}catch(Exception e) {
						try {
							new BigInteger(line);
							System.out.println("錄入錯誤,您錄入的是一個過大整數,請重新輸入一個整數:");
						}catch (Exception e2) {							//alt + shif + z (try catch快捷鍵)
							try {
								new BigDecimal(line);
								System.out.println("錄入錯誤,您錄入的是一個小數,請重新輸入一個整數:");
							} catch (Exception e1) {
								System.out.println("錄入錯誤,您錄入的是非法字符,請重新輸入一個整數:");
							}
						}
					}
				}
			}
		}

運行結果為請輸入一個整數:
aaaaddddd
錄入錯誤,您錄入的是非法字符,請重新輸入一個整數:
111111111111111111111111
錄入錯誤,您錄入的是一個過大整數,請重新輸入一個整數:
11.1
錄入錯誤,您錄入的是一個小數,請重新輸入一個整數:
60
111100

File類的概述和構造方法

  • A:File類的概述
    • File更應該叫做一個路徑
      • 文件路徑或者文件夾路徑
      • 路徑分為絕對路徑和相對路徑
      • 絕對路徑是一個固定的路徑,從盤符開始
      • 相對路徑相對於某個位置,在eclipse下是指當前項目下,在dos下
    • 查看API指的是當前路徑
    • 文件和目錄路徑名的抽象表示形式
  • B:構造方法
    • File(String pathname):根據一個路徑得到File對象
    • File(String parent, String child):根據一個目錄和一個子文件/目錄得到File對象
    • File(File parent, String child):根據一個父File對象和一個子文件/目錄得到File對象

File類的創建功能

  • A:創建功能
    • public boolean createNewFile():創建文件 如果存在這樣的文件,就不創建了
    • public boolean mkdir():創建文件夾 如果存在這樣的文件夾,就不創建了
    • public boolean mkdirs():創建文件夾,如果父文件夾不存在,會幫你創建出來
  • B:案例演示
    • File類的創建功能

    • 注意事項:

      • 如果你創建文件或者文件夾忘了寫盤符路徑,那么,默認在項目路徑下。
package com.hwh.file;
import java.io.File;
import java.io.IOException;
public class Demo2_FileMethod {
	public static void main(String[] args) throws IOException{
				//demo1();
				File dir1 = new File("aaa");
				System.out.println(dir1.mkdir());
				
				File dir2 = new File("bbb.txt");				//這樣寫是可以的,文件夾也是可以有后綴的
				System.out.println(dir2.mkdir());
				
				File dir3 = new File("ccc\\ddd");
				System.out.println(dir3.mkdirs()); 				//創建多級目錄
			}

			public static void demo1() throws IOException {
				File file = new File("yyy.txt");
				System.out.println(file.createNewFile());			//如果沒有就創建,返回true
				
				File file2 = new File("zzz");
				System.out.println(file2.createNewFile());
			}
		}

File類的重命名和刪除功能

  • A:重命名和刪除功能
    • public boolean renameTo(File dest):把文件重命名為指定的文件路徑
    • public boolean delete():刪除文件或者文件夾
  • B:重命名注意事項
    • 如果路徑名相同,就是改名。
    • 如果路徑名不同,就是改名並剪切。
  • C:刪除注意事項:
    • Java中的刪除不走回收站。
    • 要刪除一個文件夾,請注意該文件夾內不能包含文件或者文件夾
package com.hwh.file;
import java.io.File;
public class Demo3_FileMethod {
			public static void main(String[] args) {
				//demo1();
				File file1 = new File("yyy.txt");
				System.out.println(file1.delete());
				
				File file2 = new File("aaa");
				System.out.println(file2.delete());
				
				File file3 = new File("ccc");					//如果刪除一個文件夾,那么文件夾必須是空的
				System.out.println(file3.delete());
			}

			public static void demo1() {
				File file1 = new File("xxx.txt");
				File file2 = new File("D:\\ooo.txt");
				System.out.println(file1.renameTo(file2));//當前目錄下xxx被剪切, D盤下有ooo
			}
		}

File類的判斷功能

  • A:判斷功能
    • public boolean isDirectory():判斷是否是目錄
    • public boolean isFile():判斷是否是文件
    • public boolean exists():判斷是否存在
    • public boolean canRead():判斷是否可讀
    • public boolean canWrite():判斷是否可寫
    • public boolean isHidden():判斷是否隱藏

package com.hwh.file;
import java.io.File;
public class Demo4_FileMethod {
	public static void main(String[] args) {
				//demo1();
				File file = new File("zzz");
				file.setReadable(false);
				System.out.println(file.canRead()); //永遠true			//windows系統認為所有的文件都是可讀的
				file.setWritable(false);
				System.out.println(file.canWrite()); 			//windows系統可以設置為不可寫
				
				File file2 = new File("aaa.txt");
				System.out.println(file2.isHidden());//true			//判斷是否是隱藏文件
			}

			public static void demo1() {
				File dir1 = new File("ccc");
				System.out.println(dir1.isDirectory());			//判斷是否是文件夾
				
				File dir2 = new File("zzz");
				System.out.println(dir2.isDirectory());
				
				System.out.println(dir1.isFile());				//判斷是否是文件
				System.out.println(dir2.isFile());
			}
		}

File類的獲取功能

  • A:獲取功能
    • public String getAbsolutePath():獲取絕對路徑
    • public String getPath():獲取路徑
    • public String getName():獲取名稱
    • public long length():獲取長度。字節數
    • public long lastModified():獲取最后一次的修改時間,毫秒值
    • public String[] list():獲取指定目錄下的所有文件或者文件夾的名稱數組
    • public File[] listFiles():獲取指定目錄下的所有文件或者文件夾的File數組

package com.hwh.file;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo5_FileMethod {
	public static void main(String[] args) {
				//demo1();
				File dir = new File("E:\\eclipse-java-2019-12-R-win32-x86_64\\eclipse\\eclipse-workspace");
				String[] arr = dir.list();						//僅為了獲取文件名
				
				for (String string : arr) {
					System.out.println(string);//.metadata	Animal	day19.......hello java
				}
				
				File[] subFiles = dir.listFiles();
				
				for (File file : subFiles) {					//獲取文件對象
					System.out.println(file);//E:\eclipse-java-2019-12-R-win32-x86_64\eclipse\eclipse-workspace\.metadata	.......
				}
		 	}

			public static void demo1() {
				File file1 = new File("ccc.txt");
				File file2 = new File("E:\\eclipse-java-2019-12-R-win32-x86_64\\eclipse\\eclipse-workspace\\day19\\ccc.txt");
				//System.out.println(file1.getAbsolutePath());			//獲取絕對路徑E:\eclipse-java-2019-12-R-win32-x86_64\eclipse\eclipse-workspace\day19\ccc.txt
				//System.out.println(file2.getAbsolutePath());//E:\eclipse-java-2019-12-R-win32-x86_64\eclipse\eclipse-workspace\day19\ccc.txt
				
				//System.out.println(file1.getPath());	//ccc.txt				//獲取構造方法中傳入路徑
				//System.out.println(file2.getPath());	//E:\eclipse-java-2019-12-R-win32-x86_64\eclipse\eclipse-workspace\day19\ccc.txt
				
				//System.out.println(file1.getName());		//ccc.txt			//獲取文件或者文件的名字
				//System.out.println(file2.getName());		//ccc.txt
				
				//System.out.println(file1.length());//6
				System.out.println(file1.lastModified());//1581738731346
				Date d = new Date(file1.lastModified());				//文件的最后修改時間
				SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
				System.out.println(sdf.format(d));//2020年02月15日 11:52:11
			}
		}

輸出指定目錄下指定后綴的文件名

  • A:案例演示
    • 需求:判斷E盤目錄下是否有后綴名為.jpg的文件,如果有,就輸出該文件名稱
package com.hwh.test;
public class Test3 {
	public static void main(String[] args) {
				File dir = new File("E:\\");
//				String[] arr = dir.list();					//獲取e盤下所有的文件或文件夾
//				for (String string : arr) {
//					if(string.endsWith(".jpg")) {
//						System.out.println(string);
//					}
//				}
				
				File[] subFiles = dir.listFiles();			//獲取e盤下所有的文件或文件夾對象[推薦]
				
				for (File subFile : subFiles) {
					if(subFile.isFile() && subFile.getName().endsWith(".jpg")) {
						System.out.println(subFile);
					}
				}
			}
		}

文件名稱過濾器的概述及使用

  • A:文件名稱過濾器的概述
    • public String[] list(FilenameFilter filter)
    • public File[] listFiles(FileFilter filter)
  • B:文件名稱過濾器的使用
    • 需求:判斷E盤目錄下是否有后綴名為.jpg的文件,如果有,就輸出該文件名稱
package com.hwh.test;
import java.io.File;
import java.io.FilenameFilter;
public class Test3 {
	public static void main(String[] args) {
		File dir = new File("E:\\");
		String[] arr = dir.list(new FilenameFilter() {
			
			@Override
			public boolean accept(File dir, String name) {
				//System.out.println(dir);
				//System.out.println(name);
				File file = new File(dir, name);
				return file.isFile() && file.getName().endsWith(".jpg");
			}
		});
		
		for (String string : arr) {
			System.out.println(string);
		}
	}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM