問題1、繼承與RuntimeException是因為它是uncheck的錯誤類型,可以減少以後程式的代碼量和使用方便。而Exception是必須check的錯誤類型,程式中一定要加上try,catch處理,比較繁瑣。
關於LOG4J因為每個類中的catalog是不一樣的。而且也不需要區別多使用者的資訊,應該可以滿足現在的要求。
以下另:
通過自訂異常,來解決異常的覆蓋問題。
並且也可以實現異常資訊的自訂
文後說明了JAVA異常處理的幾個注意點
自訂異常類:
通過重載getMessage方法,改寫多個異常情況下異常資訊輸出。並且也可以在該方法中實現異常編碼和異常資訊的綁定:可以通過讀取設定檔或者資料庫,將異常編碼轉換為異常資訊產生輸出
package com.gever.jcw.test;
import java.util.List;
import java.util.ArrayList;
public class MyException extends Exception{
List list;
public MyException(){
super();
list=new ArrayList();
}
public MyException(ExceptionMsg msg){
super();
list=new ArrayList();
list.add(msg);
}
public void addException(ExceptionMsg msg){
list.add(msg);
}
public List getExceptionList(){
return list;
}
public String getMessage(){
StringBuffer sb=new StringBuffer();
if(list==null){
sb.append("nothing Exception!/n");
}else{
if(list.size()>0){
for(int i=0;i ExceptionMsg msg=(ExceptionMsg)list.get(i);
sb.append(msg.getClassname());
sb.append(".");
sb.append(msg.getMethodname());
sb.append(" ");
sb.append(msg.getLinenumber());
sb.append(" Line, ");
sb.append("wrong number ");
sb.append(msg.getErrnumber());
sb.append(":");
switch(msg.getErrnumber()){
case 101:
sb.append("this is 0 wrong");
break;
case 102:
sb.append("this is 1 wrong");
break;
case 103:
sb.append("this is 1 wrong");
break;
default:
sb.append("unknow error");
break;
}
sb.append("/n");
}
}
}
return sb.toString();
}
public void print(){
System.out.println(this.getMessage());
}
}
異常資訊類:
package com.gever.jcw.test;
public class ExceptionMsg {
private int errnumber=0;
private String classname="";
private String methodname="";
private int linenumber=0;
public ExceptionMsg(int errnumber,String classname,String methodname,int linenumber){
this.errnumber=errnumber;
this.classname=classname;
this.methodname=methodname;
this.linenumber=linenumber;
}
public int getErrnumber() {
return errnumber;
}
public void setErrnumber(int errnumber) {
this.errnumber = errnumber;
}
public String getClassname() {
return classname;
}
public void setClassname(String classname) {
this.classname = classname;
}
public String getMethodname() {
return methodname;
}
public void setMethodname(String methodname) {
this.methodname = methodname;
}
public int getLinenumber() {
return linenumber;
}
public void setLinenumber(int linenumber) {
this.linenumber = linenumber;
}
}
測試類別如下:
package com.gever.jcw.test;
public class TestT {
public void test() throws MyException{
MyException myex=new MyException();
try{
file://myex.addException();
throw new MyException(new ExceptionMsg(101,this.getClass().toString(),"test",14));
}catch(Exception e){
myex.addException(new ExceptionMsg(102,this.getClass().toString(),"test",16));
}finally{
myex.addException(new ExceptionMsg(103,this.getClass().toString(),"test",18));
throw myex;
}
}
public static void main(String[] args){
TestT test=new TestT();
try{
test.test();
}catch(MyException e){
e.print();
e.printStackTrace();
}
}
}
又一注意問題:finally會在return之前執行。如果try或者catch語句中,有return,並且有finally,那麼該return語句將不會執行。
JAVA異常處理的幾個注意點:
1)使用finally防止資源流失
2)不用從try區塊中執行return語句。如果該區塊後有finally區塊,則finally區塊將首先執行
3)將try、catch區塊置於迴圈體之外,因為在沒有起用JIT編譯器的情況下,兩者執行效率差異顯著
4)只有在異常情況下才去使用異常。不能夠預計的才能叫異常;否則都應該用判斷語句來進行校正
5)在建構函式中拋出異常。這樣可以避免構造出不正確的對象
6)拋出異常前,如果可能,恢複對象的有效狀態。