




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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-2030年缆索起重机市场市场现状供需分析及投资评估规划分析研究报告
- 市政工程实践经验试题及答案
- 2025-2030年生活用纸产业行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030年环保涂料行业风险投资发展分析及运作模式与投资融资研究报告
- 2025-2030年炊具行业风险投资发展分析及投资融资策略研究报告
- 2025-2030年水质监测行业市场发展现状及竞争格局与投资价值研究报告
- 2025-2030年水处理剂行业市场发展分析及发展趋势与投资研究报告
- 2025-2030年椰子油香精行业市场深度调研及前景趋势与投资研究报告
- 2025-2030年杀菌涂料行业市场发展分析及前景趋势与投资战略研究报告
- 2025-2030年智能炒菜机市场市场现状供需分析及投资评估规划分析研究报告
- PAC(流产后关爱)项目之流产与避孕培训课件
- 肠道疾病的诊疗培训课件
- 新一代国际结算系统需求规格说明书(远期结售汇)V1.0
- 山东省施工现场监理表格目录及格式汇编
- 山西煤炭运销集团三元石窟煤业有限公司矿山矿产资源开发利用、地质环境保护与土地复垦方案
- 团队项目任务完成进度跟进表模板
- 山东省应急管理普法知识竞赛参考题库-中(多选题)
- 消化内科护理试题及答案
- 色彩与服装色彩搭配
- 2023年教师基本功市级考核初中物理试卷
- 医疗废物的分类及处理流程PPT
评论
0/150
提交评论