Exception類以及File類(文件名稱過濾器)的理解

Exception異常類

每一個程序員在編寫程序的時候,總會遇到各種問題,可以是一種錯誤,也可以是一種異常,我們將這些通常叫做Throwable

Throwable類是java語言中所有異常的超類,它分爲errorexception

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

面試題:

  throwsthrow的區別?

  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);
}
}
}

與第一種相比較,第二種方法顯得更加方便簡單。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章