java 异常 日志_java(异常和日志)
java異??催@篇就夠了http://www.cnblogs.com/lulipro/p/7504267.html
1.類路徑
所謂的類路徑就是指程序運行時jvm要加載的類的.class文件所在地方
注意兩種情況:當我們是在一個完整項目下寫代碼的時候,類路徑一般IDE都會幫我們設置好,一般都是在xx/classes或者xx/lib這樣的地方,項目打包的時候,這些會被打包進去。還有一種情況,就是我們可能只是單純的使用簡單的編輯器想驗證一下某個簡單的想法的時候,這時候我們沒有用IDE,簡單的編寫個java文件,然后javac,java命令運行一下就能執行,一般這樣的都是實現簡單的功能,需要用到的類都是java語言本身的類,所以我們在使用import語句導入所需的類的時候,運行的時候,當看到import的語句,就去環境變量classpath指定的路徑下找需要的.class文件,如果沒找到就會報錯
2.JAR(java archive)java歸檔文件
使用了Zip壓縮格式,里面可以放各種資源文件,每個jar文件都有個清單文件(manifest),名字為MAINFEST.MF,用來對jar文件的內容和來源進行說明,放在一個META-INF的目錄里,清單文件每個條目用空行隔開,清單文件必須以換行符結尾
jdk的java內置類的.class文件在一個jre/lib/rt.jar的文件里
3.可運行的jar
在清單文件中指定Main-Class
java.exe用于啟動window console ?控制臺程序
javaw.exe用于啟動 GUI程序
javaws.exe用于web程序。
jvm.dll就是java虛擬機規范在windows平臺上的一種實現
5.資源文件
類加載器可以在類路徑下找到需要加載的.class文件,資源文件怎么辦呢,Class有兩個方法
URL getResource(String name)
InputStream getResourceAsStream(String name),沒找到則返回null,不會拋異常或發生I/O錯誤
資源的路徑默認都是相對于需要加載的類的.class文件所在的目錄
6.密封
想要讓一個包不讓別的類放進來,可以使用密封機制。使用密封機制,需要把這個包打包成jar包,并在jar包的清單文件中加入Sealed:true,可以全局設置,也可以單獨對每個條目
7.屬性映射Properties
Properties類:存儲鍵值對
Properties settings = new Properties()
也可以在構造的時候提供一個二級表存放默認值,如Properties settings = new Properties(default)
settings.put("name","luckee")//添加屬性
settings.put("address","china")//添加屬性
FileOutputStream out = new FileOutputStream("program.properties")
settings.store(out,"this is header")//寫進文件,第二個參數存儲文件的第一行標題
---------------------------------分割線--------------------------------------
FileInputStream in = new FileInputStream("program.properties")
Properties settings = new Properties()
settings.load(in);//讀取文件
String name = settings.getProperty("name")//獲取屬性
也可以指定默認值String name = settings.getProperty("name","jack"),如果沒有name屬性,則取默認值
String address = settings.getProperty("address")
8.java.lang.System
Properties getProperties()//獲取全部系統屬性
String getProperty(String key)//獲取給定鍵名的系統屬性
user.home屬性是系統當前用戶的主目錄
9.首選項Preference
中心知識庫,以樹的形式(類似于包結構),為每個節點維護(屬性,設置等數據),建議跟包結構一致,兩種根節點,系統根節點和當前用戶根節點,下面是Preference的API
Preference userRoot()
Preference systemRoot()
preference node(String path)
Preference userNodeForPackage(Class c1)
Preference systemNodeForPackage(Class c1)
String[] keys()
String get(String key,String default)
int getInt(String key,int default)//其他類型的類似
String put(String key,String value)
int putInt(String key,int value)//其他類型的類似
exportSubtree(OutputStream out)
exportNode(OutputStream out)
importPreferences(InputStream in)
10.Throwable是一個類,不是接口
Throwable派生出Error(系統的內部錯誤和資源耗盡錯誤,不應該拋出)和Exception,Exception派生出RuntimeException(程序本身的錯誤,如錯誤的類型轉換,數組越界,空指針等)和其他的非程序本身的錯誤引起的異常(如IOEXception,如試圖打開一個不存在的文件,根據名稱加載一個不存在的類等),Error和RuntimeException派生出來的稱為未檢查(unchecked)異常,其他的派生出來的稱作已檢查(checked)異常,編譯器將檢查是否為所有的checked異常提供了異常處理器
在處理異常的時候,可以選擇拋出,也可以選擇捕獲。對于知道如何處理的異常就捕獲,不知道如何處理的就向上拋出(給調用者)。對于選擇拋出的,必須在方法聲明的時候用throws進行聲明,聲明多個異常用逗號分隔。調用者在調用這種方法的時候,必須進行處理,或者選擇繼續向上傳遞(拋出)。對于子類覆蓋父類方法的時候,對于已檢查異常,如果父類方法使用了throws,那么子類throws的異常通用性不能大于父類(即可以是同一異常,子類異?;蛘卟粧伋霎惓?
通常我們的思路可以是,在方法定義時聲明可能會拋出異常,方法內并不捕獲異常,而讓方法的調用者自己去處理異常,如果一個方法內拋出了一個異常(new一個然后拋出),那方法就會停止運行,將異常拋給調用者,不用去擔心返回值了。如果是捕獲了一個異常,那就停止執行try代碼塊里面的代碼,轉去執行catch塊和finally塊的代碼,然后接著執行try代碼塊外面的代碼,如果catch里面又拋出了異常,那就直接將異常拋給方法的調用者,try代碼塊外面的代碼也不執行了,方法結束
catch代碼塊中也是可以繼續拋出異常的,通常這樣做可以改變異常的類型,可以將捕獲的異常進行包裝,并將其設置為包裝后的異常的原因,這樣就不會丟失原始異常的信息
當捕獲多個異常的時候,應該將具體的異常放在前面,通用的放在后面(如子類放在前,父類放在后)
如果有異常出現,沒有捕獲,那方法將停止運行
finally塊中的return會覆蓋try塊中的return,如果finally塊中也拋出異常,那么會覆蓋原始的異常,原始的異常會丟失(卷一p484~485)
public static void main(String[] args) {
System.out.println(f());//4
}
public static int f(){
try{return 2;}
finally{return 4;}
}
catch (Exception e)中的e為final,不可以再進行賦值
帶資源的try(try-with-resources)
try(declare resource here……){……},try語句塊結束時,資源會自動關閉(卷一p486~487)
11.堆棧追蹤stackTrace(卷一p487)Thread.dumpStack()(卷一p514)
12.異常機制使用的6個技巧(原則,卷一p490)
不要用異常代替簡單錯誤檢查,捕獲異常所花的時間更多
不要分過細化異常,這樣會使代碼更多。應該在一段代碼后統一使用catch語句
異常要分層次,用最適合的異常類型,不要籠統使用Throwable,Exception,RuntimeException
不要壓制異常
檢錯錯誤時,要更苛刻。比如,對于無效的參數寧可拋出異常,也不要返回一個異常的值
不要羞于傳遞異常。有時候把異常交給調用者去處理
13.斷言機制,關鍵字assert
測試代碼不應該存在于最終的代碼中,斷言機制就是解決這個問題(斷言默認關閉)
不管是測試代碼還是斷言機制,都是在開發和測試階段使用的
14.日志(Logger)
日志分為七個級別,從高到低為以下
SERVER
WARNING
INFO
CONFIG
FINE
FINER
FINEST
默認級別是INFO(即記錄INFO及以上的日志)
全局日志記錄器Logger.global
Logger.getGlobal()//獲取全局記錄器
Logger.getLogger("xxx.xxx.xxx")//根據包名來獲得記錄器,子記錄器會繼承父記錄器的級別
logger.setLevel(Level.CONFIG)//設置記錄器級別為CONFIG,Level.ALL開啟所有級別的記錄,Level.OFF關閉所有級別的記錄
logger.info(message)//以info級別記錄message
logger.warning(message)//以warning級別記錄message
logger.log(Level.info,message)//以info級別記錄message
默認的日志配置文件為jre/lib/logging.properties
關于日志(java.util.logging),有4個器:記錄器,處理器,過濾器,格式化器
日志工具log4j
單元測試Junit
壓力測試Jmeter
jdk自帶性能分析工具jconsole,jmap(將堆中的對象轉存為一個文件),jhat(開啟一個http服務,使得可以通過瀏覽器來進行查看轉存到的堆文件)
要觀察類的加載過程,可以啟動虛擬機的時候加上-verbose選項
javac -Xlint告訴編譯器對一些普片出現的代碼問題進行檢查
如javac -Xlint:fallthrough當switch缺少break語句的時候編譯器會給出報告
java -X
注意-1
運行時異常是RuntimeException類及其子類的異常,是非受檢異常,如NullPointerException、IndexOutOfBoundsException等。由于這類異常要么是系統異常,無法處理,如網絡問題;要么是程序邏輯錯誤,如空指針異常;JVM必須停止運行以改正這種錯誤,所以運行時異??梢圆贿M行處理(當然也可以處理,捕獲或向上拋出),而由JVM自行處理。Java Runtime會自動catch到程序throw的RuntimeException,然后停止線程,打印異常。
非運行時異常是RuntimeException以外的異常,類型上都屬于Exception類及其子類,是受檢異常。非運行時異常必須進行處理(捕獲或向上拋出),如果不處理,程序將出現編譯錯誤。一般情況下,API中寫了throws的Exception都不是RuntimeException
unchecked異常
運行時異常
checked異常
已檢查異常
注意-2
try{
......//1,可能拋出異常的語句
......//2,異常后面的語句
} catch(Exception e) {
......//3,處理異常語句
}
finally{
......//4,finally語句
}
......//5,try塊后的語句
如果沒有異常發生,將執行1,2,4,5
如果異常發生被捕捉了只是單純處理并未往上拋出,執行1,3,4,5
如果異常發生被捕捉了并向上拋出,則執行1,3,4
也就是說發生了異常,捕獲并處理了的話,方法會繼續運行;如果沒有捕獲或者捕獲了但又重新拋出(throw)了異常,方法則會停止運行
如果想要在處理完異常后,接著執行try語句塊中拋出異常位置后面的代碼,可以將try語句放入一個循環中(https://blog.csdn.net/yangyong0717/article/details/78493074)
示例代碼
結果
總結
以上是生活随笔為你收集整理的java 异常 日志_java(异常和日志)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IBM X3100 M4安装cento
- 下一篇: warning LNK4075: 忽略”