明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

給JAVA設(shè)計(jì)開(kāi)發(fā)新手的一些建議與意見(jiàn)(2)

[摘要]【處理好你的異!   -----------------   異常處理是Java編程中非常重要的一個(gè)部分。建議在使用異常之前閱讀或者。      下面從書(shū)中摘出幾條建議:   *絕對(duì)不要忽略異常   *千萬(wàn)不要隱藏異常***   *僅在不正常的情況下使用異常   *對(duì)可恢復(fù)的情況使用可檢查異常,...
 【處理好你的異!
  -----------------

  異常處理是Java編程中非常重要的一個(gè)部分。建議在使用異常之前閱讀或者。
  
  下面從書(shū)中摘出幾條建議:
  *絕對(duì)不要忽略異常
  *千萬(wàn)不要隱藏異常***
  *僅在不正常的情況下使用異常
  *對(duì)可恢復(fù)的情況使用可檢查異常,對(duì)程序錯(cuò)誤使用運(yùn)行時(shí)異常(RunTimeException)
  *給方法引發(fā)的異常做文檔
  *在詳細(xì)信息里面包括失敗捕獲信息
  *使用finally避免資源泄漏
  *。。。。
  
  在這里特別提出的是,在開(kāi)發(fā)中要特別處理NULL的情況,否則經(jīng)常引發(fā)NullPointException異常,在Java里這是一個(gè)最令人頭疼的異常了。
  如果你的程序因?yàn)橐粋(gè)NULL值,而報(bào)了幾十個(gè)NullPointException的話,不但得讓人煩死,而且還非常難以找到錯(cuò)誤所在。所以在Java中一定要注意這個(gè)問(wèn)題。
  如果你的函數(shù)不允許Null值,那么可以截獲它,拋出一個(gè)異常,或者給客戶(hù)更友好的提示,難道不好嗎?
  
  讓我們來(lái)看一個(gè)例子:

  public String getName(User aUser)
  {
  //如果aUser為Null,會(huì)發(fā)生什么情況
  return aUser。getName();
  }
  

  
  很明顯,如果參數(shù)為Null,就會(huì)拋出異常。應(yīng)該改為:
  public String getName(User aUser)
  {
  if(null=aUser)
  {
  return "";
  }
  else
  {
  return aUser。getName();
  }
  }
  
  
  
  或者你要求參數(shù)不能為空,還可以拋出一個(gè)異常,強(qiáng)制使用者不能傳入空值。
  
  
  還有經(jīng)常被忽略的是RunTimeException和普通異常的區(qū)別,在Java中,這是一個(gè)特殊的異常類(lèi),程序中如果遇到這個(gè)異常,用戶(hù)可以不截獲它,而如果是其他的普通異常,就不許要截獲它。我們的代碼經(jīng)常這么寫(xiě):
  try
  {
  //your code here
  }
  catch(Exception e)
  {
  //do warn
  }

  這樣寫(xiě)的話,就截獲了所有異常,當(dāng)然也包括了RunTimeException。 在很多情況下,這是不合適的處理方式,我們只應(yīng)截獲必要的異常,而應(yīng)該忽略RuntimeException。
  
  關(guān)于RunTimeException,在Spring中還有更好的利用方式,建議閱讀Spring框架中在事務(wù)中對(duì)異常的處理代碼,例如對(duì)Jdbc拋出的SqlException的轉(zhuǎn)換。
  
  關(guān)于異常處理,我提出幾點(diǎn)建議:
  *捕獲異常而且再次拋出時(shí)要包含原來(lái)的異常信息
  *不要忘了RunTimeException,除非必要,否則不要用catch(Exception e)的方式捕獲所有異常。
  *不要用異常做流程控制,異常的性能代價(jià)比較高昂。(對(duì)此,可能有人不同意。此處不詳細(xì)討論)
  *不要把異常處理都拋給別人,本函數(shù)有能力處理的就不要拋出。
  
  在此建議讀者詳細(xì)閱讀或者。

  我們可以看到,這個(gè)類(lèi)的主要目的是得到計(jì)算結(jié)果,所以正確的接口應(yīng)該類(lèi)似:
    
  public interface Counter
  {
  int getResult();
  } 

    
  但是很多情況下,經(jīng)常是這樣的接口:
    
  public interface Counter
  {
  int getResult();
  int getN1();
  int getN2();
  void setN1(int n1);
  void setN2(int n2);
  }
    
  
  我們想一想,這樣做有2個(gè)后果:
  1。除了getResult之外,其他的函數(shù)我們根本用不到,所以是多余的。
  2。如果我們要自己實(shí)現(xiàn)一個(gè)Counter,如果接口中僅僅定義了getResult,我們僅僅需要實(shí)現(xiàn)它就可以了。我們自己的類(lèi)可能是多個(gè)數(shù)運(yùn)算,有乘除加減等等各種運(yùn)算,參數(shù)也有可能是一些數(shù)組。但是如果按照第二種方法聲明接口的話,我們就必須實(shí)現(xiàn)后面的四個(gè)方法,如果這樣的話,實(shí)現(xiàn)這樣?xùn)|西不僅沒(méi)用,而且浪費(fèi)時(shí)間。我們恐怕要大聲罵娘了吧。
  
  
  所以,接口有好的作用,但是不要濫用。
  ■ 如果你的接口永遠(yuǎn)只有一個(gè)類(lèi)實(shí)現(xiàn),那么可能就沒(méi)有必要用接口。
  ■ 你的接口只需要聲明別人用到的函數(shù)即可。