1.異常:程序出現的不正常的情況。分爲編譯時異常和運行時異常。
編譯時異常:開始就必須處理,否則程序就無法運行。
運行時異常:在程序運行時出現的異常,需修改程序解決。
異常演示:除數不能爲0:java.lang.ArithmeticException: / by zero
public class ExceptionDemo6 {
public static void main(String[] args) {
System.out.println(10/0);
}
}
//Exception in thread "main" java.lang.ArithmeticException: / by zero
針對異常,系統默認處理方案爲把問題的類名,錯誤原因,錯誤的位置等信息打印在控制檯,以便我們觀察。
但是系統出問題時,不應該直接停止,而是停止出問題的部分讓其他部分繼續執行。
2.異常處理:A:try...catch...finally
B:throws
3.try...catch...finally:try{
可能出現問題的代碼
}catch (異常類名 變量名){
針對異常的代碼處理
}finally{
釋放資源的地方
}
finally特點:被finally修飾的語句一定會被執行,除了在執行finally之前jvm虛擬機退出。
注:針對多個異常,可以每一個出現問題的地方使用一次try catch語句,也可以採用一個try,多個catch'的情況
遇到try裏面的問題,自動和catch進行匹配,匹配到就執行catch中的內容,在執行後面的代碼。
public class ExceptionDemo6 {
public static void main(String[] args) {
try {
System.out.println(10/0);
int arr[]=new int[3];
System.out.println(arr[3]);
} catch (ArithmeticException e) {
System.out.println("除數不能爲0");
} catch (ArrayIndexOutOfBoundsException e){
System.out.println("數組越界");
}
}
}
//除數不能爲0
由上述代碼可知:try語句中存在的異常可以匹配多個catch時,一旦匹配到第一個catch,就會執行其中的語句並且不
會在匹配其他catch的情況。且如果catch中的異常由子父關係,父類異常必須在最後。
4.throwable中存在printStackTrace():打印異常信息,程序從出問題的地方開始就會打印創建一個該異常對應的對
象,該對象直接調用打印方法
5.throws:用在方法聲明的後面,跟異常類名,可以跟多個異常,用逗號隔開。此方法表示拋出異常,由方法的調用
者來處理該異常,throws表示出現異常的一種可能,並不一定會發生這些異常。
6.A:子類重寫父類方法時,子類方法必須拋出和父類相同的異常 或 父類異常的子類。
B:父類拋出多個異常時,子類只能拋出 父類異常的子類。
C:如果父類方法沒有異常,那麼子類重寫的方法不能拋出異常,遇到異常只能在子類方法中try處理。
7.throw和throws:throws表示出現異常的一種可能性,並不一定會發生這些異常
throw則是拋出了異常,執行throw則一定拋出了某種異常
8.編譯時期異常必須在方法聲明上拋出,運行時期異常可以拋出也可以不拋出。
9.File:文件和目錄的抽象表示形式。
構造方法:File(String pathname):把一個路徑名稱封裝成File對象。
File(String parent, String child):把一個父路徑和一個子路徑封裝成一個File對象。
File(File parent, String child):把一個父路徑File對象和一個子路徑封裝成一個File對象。
成員方法:A:public boolean createNewFile():如果文件不存在,就創建。否則,不創建。
B:public boolean mkdirs():如果目錄不存在,就創建。否則,不創建。
C:public boolean delete():既可以刪除文件,又可以刪除目錄。
判斷功能:public boolean isDirectory():是否是目錄
public boolean isFile():是否是文件
public boolean exists():是否存在
public boolean canRead():是否可讀
public boolean canWrite():是否可寫
public boolean isHidden():是否隱藏
獲取功能:public String getAbsolutePath():獲取絕對路徑
public String getPath():獲取相對路徑
public String getName():獲取名稱
10.I/O流:按流向分爲輸入流和輸出流,按數據類型分爲字節流和字符流
11.I/O字節流:OutputStream,字節輸出流,從虛擬機向外部輸出字節,該類爲抽象類,所以創建對象應該用其子類
FileOutputStream的對象,向文件寫入數據的時候:A:創建字節輸出流對象。B:調用寫數據的方法
C:釋放資源(關流)
exp:向根目錄1.txt中寫入“helloworld”
import java.io.FileOutputStream;
import java.io.IOException;
public class OutStreamDemo {
public static void main(String[] args) throws IOException {
FileOutputStream fos=new FileOutputStream("a.txt");
//創建字節輸出流對象,該路徑爲相對地址,若不存在會自動創建
byte[]b="holloworld".getBytes();//創建字節數組
fos.write(b);//向文件中輸出目標字節
fos.close();//釋放資源
}
}
12.字節輸出流write方法:write(int b) :一次寫一個字節,write(byte[] b, int off, int len) :一次寫一個字節數組的一部 分,後者寫入時效率更高。13.InputStream:字節輸入流,從外部獲取字節數據,該類同樣爲抽象類,所以創建文件是用子類FileInputStream
讀取數據步驟:A:創建字節輸入流對象。B:調用方法讀取數據。C:釋放資源(關流)
exp:讀取並顯示1.txt中的文本。
import java.io.FileInputStream;
import java.io.IOException;
public class InputStreamDemo {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream("a.txt");//創建字節輸入流對象
int b;
while((b=fis.read())!=-1){//讀取時以ASCII碼錶方式識別,若沒有內容爲-1,因此用改循環讀取文本部分
System.out.print((char)b);//將讀取到的字節轉爲字符輸出
}
fis.close();//關流
}
}
14.在讀取的同時進行文件向外輸出,便可完成複製。
exp:把1.txt中的文本內容複製到2.txt中:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyDemo {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream("a.txt");
FileOutputStream fos=new FileOutputStream("b.txt");
byte chs[]=new byte[1024];//定義字節數組,加快文件複製速度
int size;//定義一次複製內容的字節長度
while((size=fis.read(chs))!=-1){
fos.write(chs, 0, size);//一次寫入以讀取到的字節數組
}
fis.close();//關流
fos.close();
}
}