Exception異常類
每一個程序員在編寫程序的時候,總會遇到各種問題,可以是一種錯誤,也可以是一種異常,我們將這些通常叫做Throwable
Throwable類是java語言中所有異常的超類,它分爲error和exception
Error:屬於嚴重錯誤,一般用代碼無法處理,屬於不可抗力因素
Exception:屬於異常問題:可以用代碼去處理,它又分爲運行時期異常和編譯時期異常
處理異常的兩種方式:
方式1:
/**
* @author 傑哥
* 格式:try{
* 可能會出現異常的代碼
* }catch(異常的類型 對象名){
* 異常處理的代碼;
* }
* */
package com.westos.Exception;
public class exceptionDome {
public static void main(String[] args) {
int x=19;
int y=0;
try {
System.out.println(x/y);
}catch(ArithmeticException a) {
System.out.println("您的異常問題是:除數不能爲0");
System.out.println("要記住哦!");
}
}
}
運行結果:
您的異常問題是:除數不能爲0
要記住哦!
注意事項:
1. 如果一個try塊的代碼出現了異常處理後,那麼try-catch外面的代碼就可以被執行了
2. 一個try塊後面可以跟多個catch塊,即一個try塊可以捕獲多個異常,但是會根據try塊中的異常順序在catch中進行輸出
3. 一個try塊後面可以跟多個catch塊,但是異常類的類型必須是從小到大進行,否則後面的代碼無法執行
4. Try裏面的代碼越少越好,try出現的異常剛好就是catch的異常類時i,就會執行catch裏面的代碼去處理異常
例如:
package com.westos.Exception;
public class exceptionDome2 {
public static void main(String[] args) {
method();
}
//訪問一個角標越界異常
public static void method() {
int[] num= {1,2,3};
int a=3;
int b=0;
try {
System.out.println(num[3]);
System.out.println(a/b);
}catch(ArrayIndexOutOfBoundsException e) {
System.out.println("角標越界了...");
System.out.println("訪問了數組中不存在的元素");
}catch(ArithmeticException x) {
System.out.println("除數不能爲0 哦");
}
System.out.println("請及時改正");
}
}
運行結果:
角標越界了...
訪問了數組中不存在的元素
請及時改正
方式2:
拋出異常
例如:
package com.westos.Exception;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class exceptionDome3 {
public static void main(String[] args) throws ParseException {
try {
String str="2018-5-16";
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
//這裏會發生解析異常,得拋出異常
Date date = sdf.parse(str);
System.out.println(date);
} catch (Exception e) {
System.out.println("問題解決了...");
}
}
}
運行結果:
Wed May 16 00:00:00 CST 2018
注意事項:
1. 如果一個方法的的內部出現了編譯異常,那麼就得在方法上聲明拋出這個異常類型
2. 在一種情況下只能拋出一種異常對象
3. 一個方法如果遇到了throw關鍵字,那麼該方法會馬上停止執行
當try裏面的代碼出現的問題與catch塊中的異常類是一致時,就可以去執行throwable中的一些方法:
package com.westos.Exception;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 標準格式 try{ ... }catch(異常類 對象){ // 異常處理 } 執行try裏面的代碼
* ,如果出現了問題,它會通過代碼的問題創建一個異常對象,然後通過異常對象和catch裏面的異常類是否一致
* 如果一致的情況,就會出現catch裏面的代碼,執行Throwable裏面的方法
*
* public String getMessage() :消息字符串
* public String toString(): 異常的簡短描述 ":
* ":由冒號和空格組成
*
* public void printStackTrace():返回值void 直接調用, 包含了消息字符串,還有": "
* 信息描述,具體出現異常的代碼定位以及定位的源碼上
*
*/
public class exceptionDome4 {
public static void main(String[] args) throws ParseException {
try {
String str="2018-5-16";
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
Date date = sdf.parse(str);
System.out.println(date);
} catch (Exception e) {
/*
String st = e.getMessage();//運行結果:Unparseable date: "2018-5-16"
System.out.println(st);
*/
/*
String st2 = e.toString();
System.out.println(st2);//運行結果:java.text.ParseException: Unparseable date: "2018-5-16"
*/
e.printStackTrace();
/*運行結果:java.text.ParseException: Unparseable date: "2018-5-16"
at java.text.DateFormat.parse(Unknown Source)
at com.westos.Exception.exceptionDome4.main(exceptionDome4.java:26)*/
}
}
}
Finally塊:
前提:必須要配合try塊去使用,而且finally塊裏面的代碼在任何情況下都可以執行,只有在jvm退出的情況下,不會被執行
例如:
package com.westos.Exception;
public class FinallyDome {
public static void main(String[] args) {
try {
int x=3;
int y=0;
System.out.println(x/y);
} catch (Exception e) {
System.out.println("錯誤是除數不能爲0");
System.exit(0);//0表示正常退出jvm,非0表示異常退出
}finally {
System.out.println("這裏釋放資源");
}
}
}
運行結果:
錯誤是除數不能爲0
面試題:
throws和throw的區別?
throws:也是表示拋出異常,它後面跟的異常類名,並且可以多個異常類名中間逗號開
舉例:
public void show() throws IoException,ClassNotFoundException{...}
在方法上拋出,由調用者處理
它表示拋出異常的可能性
throw:拋出的一個異常對象
在語句體中拋出的,由語句體進行處理
它表示拋出異常的肯定性
面試題:
如果catch裏面有return 語句,finally中的代碼還會執行,是在return語句之前執行還是return後執行?
finally中代碼是一定會執行的,是在return前
例如:
package com.westos.exception;
public class finallyDome {
public static void main(String[] args) {
System.out.println(getInt());
}
private static int getInt() {
int a ;
try {
a = 10 ;
System.out.println(a/0);
}catch(Exception e) {
a= 30 ;
return a;
/**
* try中的代碼出現問題了,執行catch中的語句,30賦值給a,
* return 30(已經形成了一個迴路徑)finally代碼一定會執行(除非Jvm停止) a = 40 ,在fianlly外面
* 有return a: a記錄迴路徑的那個a,返回30
*/
}finally {
//除非jvm退出了
a = 40 ;
System.out.println("finally:"+a);
}
return a;//30
}
}
運行結果:
finally:40
30
異常中的注意事項:
子類繼承父類的時候的注意事項
1)子類重寫父類的方法的時候,子類的方法的拋出的異常必須要麼是父類的方法異常一樣,要麼是父類方法異常的子類
2)子類重寫父類方法的時候,如果父類中的這個方法沒有拋出異常,那麼子類重寫的這個方法也不能拋出異常,只能try...catch
例如:
package com.westos.exception;
//創建一個父類
class Father{
public void show() throws Exception{
}
public void method() {
}
}
//創建一個子類去繼承父類
class Son extends Father{
//當子類繼承父類的異常方法時,拋出的異常要麼是父類的異常,要麼是父類異常的子類,否則編譯就會報錯
public void show()throws ArithmeticException {
}
//當父類中的方法沒有拋出異常,子類重寫父類中的方法時也不能拋出異常,只能用try-catch方法
public void method() {
try {
int a=3;
int b=0;
System.out.println(a/b);
} catch (Exception e) {
e.printStackTrace();
}
}
}
File類
File類:表示文件或者目錄的路徑的抽象表現形式. IO流就是對文件進行操作的
File類的構造方法:
public File(String pathname):表示pathname的抽象路徑表現的形式 (開發中使用這種方式),指定文件或者文件夾的路徑,創建一個File對象
例如:File f=new File("E:\\:java\\jre");
public File(String parent,String child):表示創建一個父路徑和一個子路徑來實現一個File對象
例如:File f1=new File("E:<a href="file:///" ,\"java\jre\");"="">\\","java\\jre");
public File(File parent, String child):根據一個file對象和一個文件路徑來構造File實例
例如:File f2=new File("E:\\");
File f3=new File(f2,"java\\jre");
File常用方法:
創建功能:
public boolean createNewFile():創建文件,當文件不存在的時候,創建此抽象路徑下的文件
public boolean mkdir():創建一個文件夾,如果文件夾存在,不創建
public boolean mkdirs():創建文件夾,如果父目錄不存在,會創建此目錄
renameTo(File dest):重命名文件或文件夾,也可以操作非空的文件夾
例如:
package com.westos.File;
import java.io.File;
import java.io.IOException;
public class FileDome2 {
public static void main(String[] args) throws IOException {
//創建一個File類對象
File f=new File("f:\\java\\a.txt");
//public boolean createNewFile():在指定位置創建指定文件,此文件不存在則創建並返回true,文件存在則返回false
System.out.println("createNewFile:"+f.createNewFile());
// File f2=new File("f:\\dome\\a.txt");
// 使用此方法創建文件時,上層文件夾(dome)必須存在,否則就會報錯
// System.out.println("createNewFile:"+f2.createNewFile());
//public boolean mkdir():創建一個文件夾,如果文件夾存在,不創建,返回false,否則返回true
File ff=new File("f:\\java\\file");
System.out.println("mkdir:"+ff.mkdir());
//public boolean mkdirs():創建文件夾,如果父目錄不存在,會創建此目錄
File fff=new File("f:\\java\\aa\\bb\\a.txt");
System.out.println("mkdirs:"+fff.mkdirs());
//renameTo(File dest):重命名文件或文件夾,也可以操作非空的文件夾
File f3=new File("f:\\java\\a.txt");
File f4=new File("f:\\java\\b.txt");
//使用該方法的前提是你想要重命名的那個文件或者文件夾必須存在,否則會返回false
System.out.println(f3.renameTo(f4));
}
}
刪除功能:
public boolean delete() :刪除文件或者文件夾(目錄不能是空的) :逐一刪除文件或者目錄的
例如:
package com.westos.File;
import java.io.File;
import java.io.IOException;
public class FileDome3 {
public static void main(String[] args) throws IOException {
//當你在寫文件路徑的時候,沒有加盤名,系統會自動創建到當前目錄下
File f=new File("aa");
System.out.println(f.mkdir());
//刪除會一個一個進行刪除
System.out.println(f.delete());
}
}
絕對路徑:c:\\xxx\\xxx.txt
相對路徑:a.txt
判斷功能:
public boolean isDirectory():判斷是否是文件夾
public boolean isFile() :判斷是否是文件
public boolean canRead(): 是否可讀
public boolean canWriter():是否可寫
public boolean exists() :是否存在
public boolean isHidden():是否是隱藏文件
例如:
package com.westos.File;
import java.io.File;
import java.io.IOException;
/**
*File類的判斷功能
* public boolean isDirectory():判斷是否是文件夾
* public boolean isFile() :判斷是否是文件
* public boolean canRead(): 是否可讀
* public boolean canWriter():是否可寫
* public boolean exists() :是否存在
* public boolean isHidden():是否是隱藏文件
*
*/
public class FileDome4 {
public static void main(String[] args) throws IOException {
//表示一個當前項目下的a.txt
File file = new File("a.txt") ;
System.out.println(file.createNewFile());
System.out.println("isDirectory:"+file.isDirectory());
System.out.println("isFile:"+file.isFile());
System.out.println("canRead:"+file.canRead());
System.out.println("canWriter:"+file.canWrite());
//public boolean exists() :是否存在
System.out.println("exites:"+file.exists());
//public boolean isHidden():是否是隱藏文件
System.out.println("isHidden:"+file.isHidden());
}
}
運行結果:
false
isDirectory:false
isFile:true
canRead:true
canWriter:true
exites:true
isHidden:false
獲取功能:
public String getAbsolutePath():獲取抽象文件的絕對路徑
public String getPath():獲取相對路徑的字符串
public String getName()返回由此抽象路徑名錶示的文件或目錄的名稱
public long length()返回由此抽象路徑名錶示的文件的長度。
public long lastModified():文件最後一次被修改的時間(時間毫秒值)
例如:
package com.westos.File;
import java.io.File;
public class FileDome5 {
public static void main(String[] args) {
File file=new File("a.txt");
// public String getAbsolutePath():獲取抽象文件的絕對路徑
System.out.println(file.getAbsolutePath());
// public String getPath():獲取相對路徑的字符串
System.out.println(file.getPath());
// public String getName()返回由此抽象路徑名錶示的文件或目錄的名稱
System.out.println(file.getName());
// public long length()返回由此抽象路徑名錶示的文件的長度。
System.out.println(file.length());
// public long lastModified():文件最後一次被修改的時間(時間毫秒值)
System.out.println(file.lastModified());
}
}
運行結果:
F:\java\java practice\day16\a.txt
a.txt
a.txt
0
0
File的高級功能:
public String[] list() :獲取當前某個路徑下的所有的文件夾以及文件名稱的字符串數組
public File[] listFiles() :獲取當前某個路徑下所有的文件夾以及文件的File數組
例如:
package com.westos.File;
import java.io.File;
/**
* File的高級功能
* public String[] list() :獲取當前某個路徑下的所有的文件夾以及文件名稱的字符串數組
* public File[] listFiles() :獲取當前某個路徑下所有的文件夾以及文件的File數組
*
* 需求:獲取e盤下所有的文件夾以及文件的名稱
*
*/
public class FileDome6 {
public static void main(String[] args) {
//創建File類對象
File file=new File("f:\\java");
String[] list = file.list();
for(String s:list) {
System.out.println(s);
}
System.out.println("------------------");
File[] listFiles = file.listFiles();
//判斷是否是空指針
if(listFiles!=null) {
for(File f:listFiles) {
System.out.println(f);
}
}
}
}
運行結果:
java practice
jdk-8u162-windows-x64.exe
jdk1.8.0_162
jre
------------------
f:\java\java practice
f:\java\jdk-8u162-windows-x64.exe
f:\java\jdk1.8.0_162
f:\java\jre
練習:
獲取一個路徑下的所以jpg文件:
package com.westos.File;
import java.io.File;
public class FileDome7 {
public static void main(String[] args) {
//封裝e盤目錄
File file=new File("f:\\");
File[] listFiles = file.listFiles();
//進行非空判斷
if(file!=null) {
//遍歷數組
for(File f:listFiles) {
//判斷是否是文件
if(f.isFile()) {
//判斷末尾是否是jpg結尾的
if(f.getName().endsWith(".jpg")) {
System.out.println(f);
}
}
}
}
}
}
除了上述傳統方法:
FilenameFilter:一個接口: 文件名稱過濾器
boolean accept(File dir, String name)測試指定文件是否應該包含在某一文件列表中。
還可以通過文件過濾器的方式去解決
package com.westos.File;
import java.io.File;
import java.io.FilenameFilter;
public class FileDome8 {
public static void main(String[] args) {
//封裝e盤路徑
File file=new File("e:\\");
//獲取該路徑下的文件夾,使用匿名內部類的方式
String[] str = file.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
// File f=new File(dir,name);
/*boolean a = f.isFile();
boolean b = name.endsWith(".jpg");
return a&&b;*/
//鏈接式方式
return new File(dir,name).isFile()&&name.endsWith(".jpg");
}
});
//循環遍歷數組
for(String s:str) {
System.out.println(s);
}
}
}
與第一種相比較,第二種方法顯得更加方便簡單。