




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、俄羅斯方塊java源代碼提供 import java.awt.*; import java.awt.event.*; /俄羅斯方塊類 public class ERS_Block extends Frame public static boolean isPlay=false; public static int level=1,score=0; public static TextField scoreField,levelField; public static MyTimer timer; GameCanvas gameScr; public static void main(Strin
2、g argus) ERS_Block ers = new ERS_Block(俄羅斯方塊游戲 V1.0 Author:Vincent); WindowListener win_listener = new WinListener(); ers.addWindowListener(win_listener); /俄羅斯方塊類的構造方法 ERS_Block(String title) super(title); setSize(600,480); setLayout(new GridLayout(1,2); gameScr = new GameCanvas(); gameScr.addKeyLis
3、tener(gameScr); timer = new MyTimer(gameScr); timer.setDaemon(true); timer.start(); timer.suspend(); add(gameScr); Panel rightScr = new Panel(); rightScr.setLayout(new GridLayout(2,1,0,30); rightScr.setSize(120,500); add(rightScr); /右邊信息窗體的布局 MyPanel infoScr = new MyPanel(); infoScr.setLayout(new Gr
4、idLayout(4,1,0,5); infoScr.setSize(120,300); rightScr.add(infoScr); /定義標簽和初始值 Label scorep = new Label(分數:,Label.LEFT); Label levelp = new Label(級數:,Label.LEFT); scoreField = new TextField(8); levelField = new TextField(8); scoreField.setEditable(false); levelField.setEditable(false); infoScr.add(sc
5、orep); infoScr.add(scoreField); infoScr.add(levelp); infoScr.add(levelField); scorep.setSize(new Dimension(20,60); scoreField.setSize(new Dimension(20,60); levelp.setSize(new Dimension(20,60); levelField.setSize(new Dimension(20,60); scoreField.setText(0); levelField.setText(1); /右邊控制按鈕窗體的布局 MyPanel
6、 controlScr = new MyPanel(); controlScr.setLayout(new GridLayout(5,1,0,5); rightScr.add(controlScr); /定義按鈕play Button play_b = new Button(開始游戲); play_b.setSize(new Dimension(50,200); play_b.addActionListener(new Command(Command.button_play,gameScr); /定義按鈕Level UP Button level_up_b = new Button(提高級數)
7、; level_up_b.setSize(new Dimension(50,200); level_up_b.addActionListener(new Command(Command.button_levelup,gameScr); /定義按鈕Level Down Button level_down_b =new Button(降低級數); level_down_b.setSize(new Dimension(50,200); level_down_b.addActionListener(new Command(Command.button_leveldown,gameScr); /定義按鈕
8、Level Pause Button pause_b =new Button(游戲暫停); pause_b.setSize(new Dimension(50,200); pause_b.addActionListener(new Command(Command.button_pause,gameScr); /定義按鈕Quit Button quit_b = new Button(退出游戲); quit_b.setSize(new Dimension(50,200); quit_b.addActionListener(new Command(Command.button_quit,gameScr
9、); controlScr.add(play_b); controlScr.add(level_up_b); controlScr.add(level_down_b); controlScr.add(pause_b); controlScr.add(quit_b); setVisible(true); gameScr.requestFocus(); /重寫MyPanel類,使Panel的四周留空間 class MyPanel extends Panel public Insets getInsets() return new Insets(30,50,30,50); /游戲畫布類 class
10、GameCanvas extends Canvas implements KeyListener final int unitSize = 30; /小方塊邊長 int rowNum; /正方格的行數 int columnNum; /正方格的列數 int maxAllowRowNum; /允許有多少行未削 int blockInitRow; /新出現塊的起始行坐標 int blockInitCol; /新出現塊的起始列坐標 int scrArr; /屏幕數組 Block b; /對方快的引用 /畫布類的構造方法 GameCanvas() rowNum = 15; columnNum = 10;
11、 maxAllowRowNum = rowNum - 2; b = new Block(this); blockInitRow = rowNum - 1; blockInitCol = columnNum/2 - 2; scrArr = new int 3232; /初始化屏幕,并將屏幕數組清零的方法 void initScr() for(int i=0;irowNum;i+) for (int j=0; jcolumnNum;j+) scrArrj=0; b.reset(); repaint(); /重新刷新畫布方法 public void paint(Graphics g) for(int
12、 i = 0; i rowNum; i+) for(int j = 0; j columnNum; j+) drawUnit(i,j,scrArrj); /畫方塊的方法 public void drawUnit(int row,int col,int type) scrArrrowcol = type; Graphics g = getGraphics(); tch(type) /表示畫方快的方法 case 0: g.setColor(Color.black);break; /以背景為顏色畫 case 1: g.setColor(Color.blue);break; /畫正在下落的方塊 cas
13、e 2: g.setColor(Color.magenta);break; /畫已經落下的方法 g.fill3DRect(col*unitSize,getSize().height-(row+1)*unitSize,unitSize,unitSize,true); g.dispose(); public Block getBlock() return b; /返回block實例的引用 /返回屏幕數組中(row,col)位置的屬性值 public int getScrArrXY(int row,int col) if (row = rowNum | col = columnNum) return
14、(-1); else return(scrArrrowcol); /返回新塊的初始行坐標方法 public int getInitRow() return(blockInitRow); /返回新塊的初始行坐標 /返回新塊的初始列坐標方法 public int getInitCol() return(blockInitCol); /返回新塊的初始列坐標 /滿行刪除方法 void deleteFullLine() int full_line_num = 0; int k = 0; for (int i=0;irowNum;i+) boolean isfull = true; L1:for(int
15、j=0;jcolumnNum;j+) if(scrArrj = 0) k+; isfull = false; break L1; if(isfull) full_line_num+; if(k!=0 & k-1!=i & !isfull) for(int j = 0; j columnNum; j+) if (scrArrj = 0) drawUnit(k-1,j,0); else drawUnit(k-1,j,2); scrArrk-1j = scrArrj; for(int i = k-1 ;i rowNum; i+) for(int j = 0; j columnNum; j+) dra
16、wUnit(i,j,0); scrArrj=0; ERS_Block.score += full_line_num; ERS_Block.scoreField.setText(+ERS_Block.score); /判斷游戲是否結束方法 boolean isGameEnd() for (int col = 0 ; col columnNum; col +) if(scrArrmaxAllowRowNumcol !=0) return true; return false; public void keyTyped(KeyEvent e) public void keyReleased(KeyE
17、vent e) /處理鍵盤輸入的方法 public void keyPressed(KeyEvent e) if(!ERS_Block.isPlay) return; tch(e.getKeyCode() case KeyEvent.VK_DOWN:b.fallDown();break; case KeyEvent.VK_LEFT:b.leftMove();break; case KeyEvent.VK_RIGHT:b.rightMove();break; case KeyEvent.VK_SPACE:b.leftTurn();break; /處理控制類 class Command imple
18、ments ActionListener static final int button_play = 1; /給按鈕分配編號 static final int button_levelup = 2; static final int button_leveldown = 3; static final int button_quit = 4; static final int button_pause = 5; static boolean pause_resume = true; int curButton; /當前按鈕 GameCanvas scr; /控制按鈕類的構造方法 Comman
19、d(int button,GameCanvas scr) curButton = button; this.scr=scr; /按鈕執行方法 public void actionPerformed (ActionEvent e) tch(curButton) case button_play:if(!ERS_Block.isPlay) scr.initScr(); ERS_Block.isPlay = true; ERS_Block.score = 0; ERS_Block.scoreField.setText(0); ERS_Block.timer.resume(); scr.request
20、Focus(); break; case button_levelup:if(ERS_Block.level 1) ERS_Block.level-; ERS_Block.levelField.setText(+ERS_Block.level); ERS_Block.score = 0; ERS_Block.scoreField.setText(+ERS_Block.score); scr.requestFocus(); break; case button_pause:if(pause_resume) ERS_Block.timer.suspend(); pause_resume = fal
21、se; else ERS_Block.timer.resume(); pause_resume = true; scr.requestFocus(); break; case button_quit:System.exit(0); /方塊類 class Block static int pattern = 0 x0f00,0 x4444,0 x0f00,0 x4444,/用十六進至表示,本行表示長條四種狀態 0 x04e0,0 x0464,0 x00e4,0 x04c4, 0 x4620,0 x6c00,0 x4620,0 x6c00, 0 x2640,0 xc600,0 x2640,0 xc
22、600, 0 x6220,0 x1700,0 x2230,0 x0740, 0 x6440,0 x0e20,0 x44c0,0 x8e00, 0 x0660,0 x0660,0 x0660,0 x0660 ; int blockType; /塊的模式號(0-6) int turnState; /塊的翻轉狀態(0-3) int blockState; /快的下落狀態 int row,col; /塊在畫布上的坐標 GameCanvas scr; /塊類的構造方法 Block(GameCanvas scr) this.scr = scr; blockType = (int)(Math.random(
23、) * 1000)%7; turnState = (int)(Math.random() * 1000)%4; blockState = 1; row = scr.getInitRow(); col = scr.getInitCol(); /重新初始化塊,并顯示新塊 public void reset() blockType = (int)(Math.random() * 1000)%7; turnState = (int)(Math.random() * 1000)%4; blockState = 1; row = scr.getInitRow(); col = scr.getInitCol
24、(); dispBlock(1); /實現“塊”翻轉的方法 public void leftTurn() if(assertValid(blockType,(turnState + 1)%4,row,col) dispBlock(0); turnState = (turnState + 1)%4; dispBlock(1); /實現“塊”的左移的方法 public void leftMove() if(assertValid(blockType,turnState,row,col-1) dispBlock(0); col-; dispBlock(1); /實現塊的右移 public void
25、rightMove() if(assertValid(blockType,turnState,row,col+1) dispBlock(0); col+; dispBlock(1); /實現塊落下的操作的方法 public boolean fallDown() if(blockState = 2) return(false); if(assertValid(blockType,turnState,row-1,col) dispBlock(0); row-; dispBlock(1); return(true); else blockState = 2; dispBlock(2); return
26、(false); /判斷是否正確的方法 boolean assertValid(int t,int s,int row,int col) int k = 0 x8000; for(int i = 0; i 4; i+) for(int j = 0; j 4; j+) if(int)(patternts&k) != 0) int temp = scr.getScrArrXY(row-i,col+j); if (temp 1; return true; /同步顯示的方法 public synchronized void dispBlock(int s) int k = 0 x8000; for (
27、int i = 0; i 4; i+) for(int j = 0; j 1; /定時線程 class MyTimer extends Thread GameCanvas scr; public MyTimer(GameCanvas scr) this.scr = scr; public void run() while(true) try sleep(10-ERS_Block.level + 1)*100); catch(InterruptedException e) if(!scr.getBlock().fallDown() scr.deleteFullLine(); if(scr.isG
28、ameEnd() ERS_Block.isPlay = false; suspend(); else scr.getBlock().reset(); class WinListener extends WindowAdapter public void windowClosing (WindowEvent l) System.exit(0); 射擊游戲代碼效果 第一步:把如下代碼加入區域中 / Make array function MakeArray( n) this.length = n; for (var i = 1; i = n; i+) thisi = 0 return this /
29、 poor mans random number var d0 = new Date(); var r0 = d0.getSeconds(); function poor_rand() d1 = new Date(); r0 = (r0 * r0 + r0 + d1.getSeconds() % 3721 ; return r0 % width_n; / Parameters of game var height_n = 8; var width_n =5; / state of game var enemy = new MakeArray( width_n); / enemy positio
30、ns var wtime; / wait time var score; / points var gameover; / in case of gameover set to true / Make the battlefield. document.write( ); document.write( ); document.write( ); document.write( ); for( var i=0; iheight_n; i+) document.write( ); for( var j=0;jwidth_n; j+) document.write( ); document.wri
31、te( ); document.write( ); for( var j=0;jwidth_n; j+) document.write( ); document.write( ); document.write( ); document.write( ); document.write( ); / game main timer event / enemy come one step function come() var n = poor_rand(); document.fm2.elements width_n * enemyn+1 + n.checked = true; enemyn+1
32、+; if( enemyn+1 height_n) setTimeout(come(), wtime); else gameover = true; document.fm1.message.value = GAME OVER: + score ; / Fire the n th beam function fire( n) if( gameover ) return; for( var i=0; i 50) wtime -= 10; / initialize & start game function game_start() for( var n=0; nwidth_n; n+) for(
33、 var i=0; i 第二步:把區域中的內容改為:勁舞團游戲代碼游戲效果: 第一步:把如下代碼加入區域中!- Beginvar agt=navigator.userAgent.toLowerCase();if (agt.indexOf(mac) != -1)var a=r; elsevar a=n;var max=0;function tlist() max=tlist.arguments.length;for (i=0; imax; i+)thisi=tlist.argumentsi;tl = new tlist( o+a+ /|+a+ */ * 跳舞+a, o_+a+ 跳舞+a, _o/
34、*+a+ * |+a+ / 跳舞+a, *o_+a+ / *+a+ 跳舞+a, *+a+ _/c+a+ * 跳舞+a, _/+a+ (o_*+a+ * 跳舞+a, /+a+ |+a+ */o* 跳舞+a, _+a+ (+a+ */o* 跳舞+a, +a+ o|* 跳舞+a, *+a+ o|_/+a+ */ 跳舞+a, *+a+ _o|_+a+ * 跳舞+a, _o/*+a+ * |+a+ / 跳舞+a, *o/*+a+ |+a+ / 跳舞+a, c/*+a+ +a+ */ 跳舞+a, c_+a+ 跳舞+a, c/*+a+ /(_+a+ * / 跳舞+a, _o/*+a+ * (_+a+ 跳舞+
35、a, _o_+a+ * / *+a+ 跳舞+a, *_o_+a+ | *+a+ 跳舞+a, *_c_*+a+ |_+a+ 跳舞+a, *_c_*+a+ _|_+a+ 跳舞+a, +a+ *_c_*+a+ _)_ 跳舞+a, +a+ *c/*+a+ _)_ 跳舞+a);var x=0;function tick() document.animation.cheerleader.value = + a +tlx;x+;if (x != max)setTimeout(tick(), 200);elsex = 0;/ End -textarea name=cheerleader rows=5 cols
36、=20&rt;/textarea&rt;第二步:把區域中的內容改為:鼠標移動代碼!-將以下代碼加入HTML的之間- var nDots = 7;var Xpos = 0;var Ypos = 0;var DELTAT = .01;var SEGLEN = 10;var SPRINGK = 10;var MASS = 1;var XGRAVITY = 0;var YGRAVITY = 50;var RESISTANCE = 10;var STOPVEL = 0.1;var STOPACC = 0.1;var DOTSIZE = 11;var BOUNCE = 0.75;var isNetscap
37、e = navigator.appName=Netscape;var followmouse = true;var dots = new Array();init();function init() var i = 0; for (i = 0; i nDots; i+) dotsi = new dot(i); if (!isNetscape) for (i = 0; i nDots; i+) dotsi.obj.left = dotsi.X; dotsi.obj.top = dotsi.Y; if (isNetscape) startanimate(); else setTimeout(sta
38、rtanimate(), 1000); function dot(i) this.X = Xpos; this.Y = Ypos; this.dx = 0; this.dy = 0; if (isNetscape) this.obj = eval(document.dot + i); else this.obj = eval(dot + i + .style); function startanimate() setInterval(animate(), 20);function setInitPositions(dots) var startloc = document.all.tags(L
39、I); var i = 0; for (i = 0; i startloc.length & i SEGLEN) var springF = SPRINGK * (len - SEGLEN); spring.X += (dx / len) * springF; spring.Y += (dy / len) * springF; function animate() var start = 0; if (followmouse) dots0.X = Xpos; dots0.Y = Ypos; start = 1; for (i = start ; i 0) springForce(i-1, i,
40、 spring); if (i (nDots - 1) springForce(i+1, i, spring); var resist = new vec(-dotsi.dx * RESISTANCE, -dotsi.dy * RESISTANCE); var accel = new vec(spring.X + resist.X)/MASS + XGRAVITY, (spring.Y + resist.Y)/ MASS + YGRAVITY); dotsi.dx += (DELTAT * accel.X); dotsi.dy += (DELTAT * accel.Y); if (Math.a
41、bs(dotsi.dx) STOPVEL & Math.abs(dotsi.dy) STOPVEL & Math.abs(accel.X) STOPACC & Math.abs(accel.Y) = height - DOTSIZE - 1) if (dotsi.dy 0) dotsi.dy = BOUNCE * -dotsi.dy; dotsi.Y = height - DOTSIZE - 1; if (dotsi.X = width - DOTSIZE) if (dotsi.dx 0) dotsi.dx = BOUNCE * -dotsi.dx; dotsi.X = width - DOT
42、SIZE - 1; if (dotsi.X 0) if (dotsi.dx 0) dotsi.dx = BOUNCE * -dotsi.dx; dotsi.X = 0; dotsi.obj.left = dotsi.X; dotsi.obj.top = dotsi.Y; 附錄資料:如何處理Java異常及常見異常六種異常處理的陋習你覺得自己是一個Java專家嗎?是否肯定自己已經全面掌握了Java的異常處理機制?在下面這段代碼中,你能夠迅速找出異常處理的六個問題嗎? 1 OutputStreamWriter out = . 2 java.sql.Connection conn = . 3 try
43、/ 4 Statement stat = conn.createStatement(); 5 ResultSet rs = stat.executeQuery( 6 select uid, name from user); 7 while (rs.next() 8 9 out.println(ID: + rs.getString(uid) / 10 ,姓名: + rs.getString(name); 11 12 conn.close(); / 13 out.close(); 14 15 catch(Exception ex) / 16 17 ex.printStackTrace(); /,
44、18 作為一個Java程序員,你至少應該能夠找出兩個問題。但是,如果你不能找出全部六個問題,請繼續閱讀本文。 本文討論的不是Java異常處理的一般性原則,因為這些原則已經被大多數人熟知。我們要做的是分析各種可稱為“反例”(anti-pattern)的違背優秀編碼規范的常見壞習慣,幫助讀者熟悉這些典型的反面例子,從而能夠在實際工作中敏銳地察覺和避免這些問題。 反例之一:丟棄異常 代碼:15行-18行。 這段代碼捕獲了異常卻不作任何處理,可以算得上Java編程中的殺手。從問題出現的頻繁程度和禍害程度來看,它也許可以和C/C+程序的一個惡名遠播的問題相提并論?不檢查緩沖區是否已滿。如果你看到了這種丟
45、棄(而不是拋出)異常的情況,可以百分之九十九地肯定代碼存在問題(在極少數情況下,這段代碼有存在的理由,但最好加上完整的注釋,以免引起別人誤解)。 這段代碼的錯誤在于,異常(幾乎)總是意味著某些事情不對勁了,或者說至少發生了某些不尋常的事情,我們不應該對程序發出的求救信號保持沉默和無動于衷。調用一下printStackTrace算不上“處理異常”。不錯,調用printStackTrace對調試程序有幫助,但程序調試階段結束之后, printStackTrace就不應再在異常處理模塊中擔負主要責任了。 丟棄異常的情形非常普遍。打開JDK的ThreadDeath類的文檔,可以看到下面這段說明:“特別
46、地,雖然出現ThreadDeath是一種正常的情形,但ThreadDeath類是Error而不是Exception的子類,因為許多應用會捕獲所有的Exception然后丟棄它不再理睬。”這段話的意思是,雖然ThreadDeath代表的是一種普通的問題,但鑒于許多應用會試圖捕獲所有異常然后不予以適當的處理,所以JDK把 ThreadDeath定義成了Error的子類,因為Error類代表的是一般的應用不應該去捕獲的嚴重問題。可見,丟棄異常這一壞習慣是如此常見,它甚至已經影響到了Java本身的設計。 那么,應該怎樣改正呢?主要有四個選擇: 1、處理異常。針對該異常采取一些行動,例如修正問題、提醒某
47、個人或進行其他一些處理,要根據具體的情形確定應該采取的動作。再次說明,調用printStackTrace算不上已經“處理好了異常”。 2、重新拋出異常。處理異常的代碼在分析異常之后,認為自己不能處理它,重新拋出異常也不失為一種選擇。 3、把該異常轉換成另一種異常。大多數情況下,這是指把一個低級的異常轉換成應用級的異常(其含義更容易被用戶了解的異常)。 4、不要捕獲異常。 結論一:既然捕獲了異常,就要對它進行適當的處理。不要捕獲異常之后又把它丟棄,不予理睬。 反例之二:不指定具體的異常 代碼:15行。 許多時候人們會被這樣一種“美妙的”想法吸引:用一個catch語句捕獲所有的異常。最常見的情形就
48、是使用catch(Exception ex)語句。但實際上,在絕大多數情況下,這種做法不值得提倡。為什么呢? 要理解其原因,我們必須回顧一下catch語句的用途。catch語句表示我們預期會出現某種異常,而且希望能夠處理該異常。異常類的作用就是告訴 Java編譯器我們想要處理的是哪一種異常。由于絕大多數異常都直接或間接從java.lang.Exception派生,catch (Exception ex)就相當于說我們想要處理幾乎所有的異常。 再來看看前面的代碼例子。我們真正想要捕獲的異常是什么呢?最明顯的一個是SQLException,這是JDBC操作中常見的異常。另一個可能的異常是IOExc
49、eption,因為它要操作OutputStreamWriter。顯然,在同一個catch塊中處理這兩種截然不同的異常是不合適的。如果用兩個catch塊分別捕獲SQLException和IOException就要好多了。這就是說,catch語句應當盡量指定具體的異常類型,而不應該指定涵蓋范圍太廣的Exception類。 另一方面,除了這兩個特定的異常,還有其他許多異常也可能出現。例如,如果由于某種原因,executeQuery返回了null,該怎么辦?答案是讓它們繼續拋出,即不必捕獲也不必處理。實際上,我們不能也不應該去捕獲可能出現的所有異常,程序的其他地方還有捕獲異常的機會?直至最后由JVM處
50、理。 結論二:在catch語句中盡可能指定具體的異常類型,必要時使用多個catch。不要試圖處理所有可能出現的異常。 反例之三:占用資源不釋放 代碼:3行-14行。 異常改變了程序正常的執行流程。這個道理雖然簡單,卻常常被人們忽視。如果程序用到了文件、Socket、JDBC連接之類的資源,即使遇到了異常,也要正確釋放占用的資源。為此,Java提供了一個簡化這類操作的關鍵詞finally。 finally是樣好東西:不管是否出現了異常,Finally保證在try/catch/finally塊結束之前,執行清理任務的代碼總是有機會執行。遺憾的是有些人卻不習慣使用finally。 當然,編寫fina
51、lly塊應當多加小心,特別是要注意在finally塊之內拋出的異常?這是執行清理任務的最后機會,盡量不要再有難以處理的錯誤。 結論三:保證所有資源都被正確釋放。充分運用finally關鍵詞。反例之四:不說明異常的詳細信息 代碼:3行-18行。 仔細觀察這段代碼:如果循環內部出現了異常,會發生什么事情?我們可以得到足夠的信息判斷循環內部出錯的原因嗎?不能。我們只能知道當前正在處理的類發生了某種錯誤,但卻不能獲得任何信息判斷導致當前錯誤的原因。 printStackTrace的堆棧跟蹤功能顯示出程序運行到當前類的執行流程,但只提供了一些最基本的信息,未能說明實際導致錯誤的原因,同時也不易解讀。 因
52、此,在出現異常時,最好能夠提供一些文字信息,例如當前正在執行的類、方法和其他狀態信息,包括以一種更適合閱讀的方式整理和組織printStackTrace提供的信息。 結論四:在異常處理模塊中提供適量的錯誤原因信息,組織錯誤信息使其易于理解和閱讀。 反例之五:過于龐大的try塊 代碼:3行-14行。 經常可以看到有人把大量的代碼放入單個try塊,實際上這不是好習慣。這種現象之所以常見,原因就在于有些人圖省事,不愿花時間分析一大塊代碼中哪幾行代碼會拋出異常、異常的具體類型是什么。把大量的語句裝入單個巨大的try塊就象是出門旅游時把所有日常用品塞入一個大箱子,雖然東西是帶上了,但要找出來可不容易。
53、一些新手常常把大量的代碼放入單個try塊,然后再在catch語句中聲明Exception,而不是分離各個可能出現異常的段落并分別捕獲其異常。這種做法為分析程序拋出異常的原因帶來了困難,因為一大段代碼中有太多的地方可能拋出Exception。 結論五:盡量減小try塊的體積。 反例之六:輸出數據不完整 代碼:7行-11行。 不完整的數據是Java程序的隱形殺手。仔細觀察這段代碼,考慮一下如果循環的中間拋出了異常,會發生什么事情。循環的執行當然是要被打斷的,其次, catch塊會執行?就這些,再也沒有其他動作了。已經輸出的數據怎么辦?使用這些數據的人或設備將收到一份不完整的(因而也是錯誤的)數據,
54、卻得不到任何有關這份數據是否完整的提示。對于有些系統來說,數據不完整可能比系統停止運行帶來更大的損失。 較為理想的處置辦法是向輸出設備寫一些信息,聲明數據的不完整性;另一種可能有效的辦法是,先緩沖要輸出的數據,準備好全部數據之后再一次性輸出。 結論六:全面考慮可能出現的異常以及這些異常對執行流程的影響。 改寫后的代碼 根據上面的討論,下面給出改寫后的代碼。也許有人會說它稍微有點?嗦,但是它有了比較完備的異常處理機制。 OutputStreamWriter out = . java.sql.Connection conn = . try Statement stat = conn.createS
55、tatement(); ResultSet rs = stat.executeQuery( select uid, name from user); while (rs.next() out.println(ID: + rs.getString(uid) + ,姓名: + rs.getString(name); catch(SQLException sqlex) out.println(警告:數據不完整); throw new ApplicationException(讀取數據時出現SQL錯誤, sqlex); catch(IOException ioex) throw new Applica
56、tionException(寫入數據時出現IO錯誤, ioex); finally if (conn != null) try conn.close(); catch(SQLException sqlex2) System.err(this.getClass().getName() + .mymethod - 不能關閉數據庫連接: + sqlex2.toString(); if (out != null) try out.close(); catch(IOException ioex2) System.err(this.getClass().getName() + .mymethod - 不能
57、關閉輸出文件 + ioex2.toString(); 本文的結論不是放之四海皆準的教條,有時常識和經驗才是最好的老師。如果你對自己的做法沒有百分之百的信心,務必加上詳細、全面的注釋。 另一方面,不要笑話這些錯誤,不妨問問你自己是否真地徹底擺脫了這些壞習慣。即使最有經驗的程序員偶爾也會誤入歧途,原因很簡單,因為它們確確實實帶來了“方便”。所有這些反例都可以看作Java編程世界的惡魔,它們美麗動人,無孔不入,時刻誘惑著你。也許有人會認為這些都屬于雞皮蒜毛的小事,不足掛齒,但請記住:勿以惡小而為之,勿以善小而不為。下面是一些 java異常集 算術異常類:ArithmeticExecption空指針異
58、常類:NullPointerException類型強制轉換異常:ClassCastException數組負下標異常:NegativeArrayException數組下標越界異常:ArrayIndexOutOfBoundsException違背安全原則異常:SecturityException文件已結束異常:EOFException文件未找到異常:FileNotFoundException字符串轉換為數字異常:NumberFormatException操作數據庫異常:SQLException輸入輸出異常:IOException方法未找到異常:NoSuchMethodExceptionjava.l
59、ang.AbstractMethodError抽象方法錯誤。當應用試圖調用抽象方法時拋出。java.lang.AssertionError斷言錯。用來指示一個斷言失敗的情況。java.lang.ClassCircularityError類循環依賴錯誤。在初始化一個類時,若檢測到類之間循環依賴則拋出該異常。java.lang.ClassFormatError類格式錯誤。當Java虛擬機試圖從一個文件中讀取Java類,而檢測到該文件的內容不符合類的有效格式時拋出。java.lang.Error錯誤。是所有錯誤的基類,用于標識嚴重的程序運行問題。這些問題通常描述一些不應被應用程序捕獲的反常情況。ja
60、va.lang.ExceptionInInitializerError初始化程序錯誤。當執行一個類的靜態初始化程序的過程中,發生了異常時拋出。靜態初始化程序是指直接包含于類中的static語句段。java.lang.IllegalAccessError違法訪問錯誤。當一個應用試圖訪問、修改某個類的域(Field)或者調用其方法,但是又違反域或方法的可見性聲明,則拋出該異常。java.lang.IncompatibleClassChangeError不兼容的類變化錯誤。當正在執行的方法所依賴的類定義發生了不兼容的改變時,拋出該異常。一般在修改了應用中的某些類的聲明定義而沒有對整個應用重新編譯而直
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 急危重癥患者評估與護理試題
- 防震減災宣傳-知識競賽
- 二手房交易居間合同示例
- 2025授權物業管理服務合同樣本
- 品牌代理合同
- 電子產品維修服務合同協議書范本
- 2025租房合同協議范本3
- 2025服裝加工定制合同范本
- 2025監理工程師《合同管理》知識點抵押
- 《天澤項目營銷總綱》課件
- 國開(四川)2024年秋《地域文化》形考任務1-2答案終結性考核答案
- 員工食堂節能降耗措施
- 私人放貸合同模板
- 礦采量子技術突破
- 手術室靜脈輸液課件
- 2024年國家低壓電工證理論考試題庫(含答案)
- Se7en《七宗罪(1995)》完整中英文對照劇本
- HG20202-2014 脫脂工程施工及驗收規范
- 公司收款委托書模板
- 宏觀經濟學全套課件(完整)
- 鍺γ射線譜儀校準規范
評論
0/150
提交評論