??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品国偷自产在线,久久人午夜亚洲精品无码区,亚洲大香人伊一本线http://www.tkk7.com/shangaijun/性格军_命运Q气度媄响格局zh-cnMon, 12 May 2025 01:14:11 GMTMon, 12 May 2025 01:14:11 GMT60Java语言异常处理的陋习展?/title><link>http://www.tkk7.com/shangaijun/archive/2007/11/08/159032.html</link><dc:creator>爱?/dc:creator><author>爱?/author><pubDate>Thu, 08 Nov 2007 02:45:00 GMT</pubDate><guid>http://www.tkk7.com/shangaijun/archive/2007/11/08/159032.html</guid><wfw:comment>http://www.tkk7.com/shangaijun/comments/159032.html</wfw:comment><comments>http://www.tkk7.com/shangaijun/archive/2007/11/08/159032.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/shangaijun/comments/commentRss/159032.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/shangaijun/services/trackbacks/159032.html</trackback:ping><description><![CDATA[<span style="font-family: Georgia;">你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机Ӟ在下面这D代码中Q你能够q速找出异常处理的六个问题吗? <table bgcolor="#cccccc" cellpadding="0" cellspacing="1" width="80%"> <tbody> <tr> <td bgcolor="#f2f2f2"> <pre>1 OutputStreamWriter out = ... <br /> 2 java.sql.Connection conn = ... <br /> 3 try { // ?<br /> 4  Statement stat = conn.createStatement(); <br /> 5  ResultSet rs = stat.executeQuery( <br /> 6   "select uid, name from user"); <br /> 7  while (rs.next()) <br /> 8  { <br /> 9   out.println("IDQ? + rs.getString("uid") // ?<br /> 10    "Q姓名:" + rs.getString("name")); <br /> 11  } <br /> 12  conn.close(); // ?<br /> 13  out.close(); <br /> 14 } <br /> 15 catch(Exception ex) // ?<br /> 16 { <br /> 17  ex.printStackTrace(); //_?<br /> 18 } <br /> </pre> </td> </tr> </tbody> </table> <p>  作ؓ一个JavaE序员,你至应该能够找Z个问题。但是,如果你不能找出全部六个问题,Ll阅L文?/p> <p>  本文讨论的不是Java异常处理的一般性原则,因ؓq些原则已经被大多数人熟知。我们要做的是分析各U可UCؓ“反例”Qanti-patternQ的q背优秀~码规范的常见坏习惯Q帮助读者熟悉这些典型的反面例子Q从而能够在实际工作中敏锐地察觉和避免这些问题?/p> <p>  反例之一Q丢弃异?/p> <p>  代码Q?5?18行?/p> <p>  q段代码捕获了异常却不作M处理Q可以算得上Java~程中的杀手。从问题出现的频J程度和害E度来看Q它也许可以和C/C++E序的一? 恶名q播的问题相提ƈ论?Q不查缓冲区是否已满。如果你看到了这U丢弃(而不是抛出)异常的情况,可以癑ֈ之九十九地肯定代码存在问题(在极数情况 下,q段代码有存在的理由Q但最好加上完整的注释Q以免引起别解)?/p> <p>  q段代码的错误在于,异常Q几乎)L意味着某些事情不对劲了Q或者说臛_发生了某些不d的事情,我们不应该对E序发出的求救信号保持沉默和 无动于衷。调用一下printStackTrace不?#8220;处理异常”。不错,调用printStackTrace对调试程序有帮助Q但E序调试阶段l束 之后QprintStackTrace׃应再在异常处理模块中担负主要责Q了?/p> <p>  丢弃异常的情形非常普遍。打开JDK的ThreadDeathcȝ文档Q可以看C面这D说明:“特别圎ͼ虽然出现ThreadDeath是一 U?#8216;正常的情?#8217;Q但ThreadDeathcLError而不是Exception的子c,因ؓ许多应用会捕h有的Exception然后丢弃它不? 理睬?#8221;q段话的意思是Q虽然ThreadDeath代表的是一U普通的问题Q但鉴于许多应用会试图捕h有异常然后不予以适当的处理,所以JDK? ThreadDeath定义成了Error的子c,因ؓErrorcM表的是一般的应用不应该去捕获的严重问题。可见,丢弃异常q一坏习惯是如此常见Q它 甚至已经影响CJava本n的设计?/p> <p>  那么Q应该怎样Ҏ呢?主要有四个选择Q?/p> <p>  1、处理异常。针对该异常采取一些行动,例如修正问题、提醒某个h或进行其他一些处理,要根据具体的情Ş定应该采取的动作。再ơ说明,调用printStackTrace不上已l?#8220;处理好了异常”?/p> <p>  2、重新抛出异常。处理异常的代码在分析异怹后,认ؓ自己不能处理它,重新抛出异常也不׃ؓ一U选择?/p> <p>  3、把该异常{换成另一U异常。大多数情况下,q是指把一个低U的异常转换成应用的异常(其含义更Ҏ被用户了解的异常Q?/p> <p>  4、不要捕获异常?/p> <p>  l论一Q既然捕获了异常Q就要对它进行适当的处理。不要捕获异怹后又把它丢弃Q不予理睬?/p> <p>  反例之二Q不指定具体的异?/p> <p>  代码Q?5行?/p> <p>  许多时候h们会被这样一U?#8220;妙?#8221;x吸引Q用一个catch语句捕获所有的异常。最常见的情形就是用catchQException exQ语句。但实际上,在绝大多数情况下Q这U做法不值得提倡。ؓ什么呢Q?/p> <p>  要理解其原因Q我们必d一下catch语句的用途。catch语句表示我们预期会出现某U异常,而且希望能够处理该异常。异常类的作用就? 告诉Java~译器我们想要处理的是哪一U异常。由于绝大多数异帔R直接或间接从java.lang.ExceptionzQcatch QException exQ就相当于说我们惌处理几乎所有的异常?/p> <p>  再来看看前面的代码例子。我们真正想要捕L异常是什么呢Q最明显的一个是SQLExceptionQ这是JDBC操作中常见的异常。另一个可 能的异常是IOExceptionQ因为它要操作OutputStreamWriter.昄Q在同一个catch块中处理q两U截然不同的异常是不合? 的。如果用两个catch块分别捕获SQLException和IOExceptionp好多了。这是_catch语句应当量指定具体的异常类 型,而不应该指定늛范围太广的ExceptioncR?/p> <p>  另一斚wQ除了这两个特定的异常,q有其他许多异常也可能出现。例如,如果׃某种原因QexecuteQueryq回了nullQ该怎么办? {案是让它们l箋抛出Q即不必捕获也不必处理。实际上Q我们不能也不应该去捕获可能出现的所有异常,E序的其他地方还有捕获异常的ZQ?直至最后由 JVM处理?/p> <p>  l论二:在catch语句中尽可能指定具体的异常类型,必要时用多个catch.不要试图处理所有可能出现的异常?/p> <p>  反例之三Q占用资源不释放</p> <p>  代码Q??14行?/p> <p>  异常改变了程序正常的执行程。这个道理虽然简单,却常常被Z忽视。如果程序用C文g、Socket、JDBCq接之类的资源,即遇到了异常,也要正确释放占用的资源。ؓ此,Java提供了一个简化这cL作的关键词finally.</p> <p>  finally是样好东西:不管是否出现了异常,Finally保证在try/catch/finally块结束之前,执行清理d的代码L有机会执行。遗憄是有些h却不习惯使用finally.</p> <p>  当然Q编写finally块应当多加小心,特别是要注意在finally块之内抛出的异常Q?q是执行清理d的最后机会,量不要再有难以处理的错误?/p> <p>  l论三:保证所有资源都被正释放。充分运用finally关键词?/p> <p>  反例之四Q不说明异常的详l信?/p> <p>  代码Q??18行?/p> <p>  仔细观察q段代码Q如果@环内部出C异常Q会发生什么事情?我们可以得到_的信息判断@环内部出错的原因吗?不能。我们只能知道当前正在处理的cd生了某种错误Q但却不能获得Q何信息判断导致当前错误的原因?/p> <p>printStackTrace的堆栈跟t功能显C出E序q行到当前类的执行流E,但只提供了一些最基本的信息,未能说明实际D错误的原因,同时也不易解诅R? </p> <p>  因此Q在出现异常Ӟ最好能够提供一些文字信息,例如当前正在执行的类、方法和其他状态信息,包括以一U更适合阅读的方式整理和l织printStackTrace提供的信息?/p> <p>  l论四:在异常处理模块中提供适量的错误原因信息,l织错误信息使其易于理解和阅诅R?/p> <p>  反例之五Q过于庞大的try?/p> <p>  代码Q??14行?/p> <p>  l常可以看到有h把大量的代码攑օ单个try块,实际上这不是好习惯。这U现象之所以常见,原因在于有些h囄事,不愿花时间分析一大块代码 中哪几行代码会抛出异常、异常的具体cd是什么。把大量的语句装入单个巨大的try块就象是出门旅游时把所有日常用品塞入一个大子Q虽然东西是带上了, 但要扑և来可不容易?/p> <p>  一些新手常常把大量的代码放入单个try块,然后再在catch语句中声明ExceptionQ而不是分d个可能出现异常的D落q分别捕获其异常。这U做法ؓ分析E序抛出异常的原因带来了困难Q因Z大段代码中有太多的地方可能抛出Exception.</p> <p>  l论五:量减小try块的体积?/p> <p>  反例之六Q输出数据不完整</p> <p>  代码Q??11行?/p> <p>  不完整的数据是JavaE序的隐形杀手。仔l观察这D代码,考虑一下如果@环的中间抛出了异常,会发生什么事情。@环的执行当然是要被打断的Q? 其次Qcatch块会执行Q?p些,再也没有其他动作了。已l输出的数据怎么办?使用q些数据的h或设备将收到一份不完整的(因而也是错误的Q数据,? 得不CQ何有兌份数据是否完整的提示。对于有些系l来_数据不完整可能比pȝ停止q行带来更大的损失?/p> <p>  较ؓ理想的处|办法是向输备写一些信息,声明数据的不完整性;另一U可能有效的办法是,先缓冲要输出的数据,准备好全部数据之后再一ơ性输出?/p> <p>  l论六:全面考虑可能出现的异总及这些异常对执行程的媄响?/p> <p>  改写后的代码</p> <p>  Ҏ上面的讨论,下面l出改写后的代码。也许有Z说它E微有点Q嗦Q但是它有了比较完备的异常处理机制?/p> <p align="center"> </p> <table bgcolor="#cccccc" cellpadding="0" cellspacing="1" width="80%"> <tbody> <tr> <td bgcolor="#f2f2f2"> <pre>OutputStreamWriter out = ... <br /> java.sql.Connection conn = ... <br /> try { <br /> Statement stat = conn.createStatement(); <br /> ResultSet rs = stat.executeQuery( <br /> "select uid, name from user"); <br /> while (rs.next()) <br /> { <br /> out.println("IDQ? + rs.getString("uid") + "Q姓? " <br /> + rs.getString("name")); <br /> } <br /> } <br /> catch(SQLException sqlex) <br /> { <br /> out.println("警告Q数据不完整"); <br /> throw new ApplicationException("d数据时出现SQL错误", sqlex); <br /> } <br /> catch(IOException ioex) <br /> { <br /> throw new ApplicationException("写入数据时出现IO错误", ioex); <br /> } <br /> finally <br /> { <br /> if (conn != null) { <br /> try { <br /> conn.close(); <br /> } <br /> catch(SQLException sqlex2) <br /> { <br /> System.err(this.getClass().getName() + ".mymethod - 不能关闭数据库连? <br /> " + sqlex2.toString()); <br /> } <br /> } <br /> <br /> if (out != null) { <br /> try { <br /> out.close(); <br /> } <br /> catch(IOException ioex2) <br /> { <br /> System.err(this.getClass().getName() + ".mymethod - 不能关闭输出文g" <br /> + ioex2.toString()); <br /> } <br /> } <br /> }</pre> </td> </tr> </tbody> </table> <p>  本文的结Z是放之四L准的教条Q有时常识和l验才是最好的老师。如果你对自q做法没有癑ֈ之百的信心,务必加上详细、全面的注释?/p> <p>  另一斚wQ不要笑话这些错误,不妨问问你自己是否真地彻底摆׃q些坏习惯。即使最有经验的E序员偶也会误入歧途,原因很简单,因ؓ它们确 实实带来?#8220;方便”。所有这些反例都可以看作Java~程世界的恶,它们丽动hQ无孔不入,时刻诱惑着你。也许有Z认ؓq些都属于鸡皮蒜毛的事Q? 不挂Q但误住:勿以恶小而ؓ之,勿以善小而不为?/p> </span> <img src ="http://www.tkk7.com/shangaijun/aggbug/159032.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/shangaijun/" target="_blank">爱?/a> 2007-11-08 10:45 <a href="http://www.tkk7.com/shangaijun/archive/2007/11/08/159032.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何学习Hibernatehttp://www.tkk7.com/shangaijun/archive/2007/11/01/157512.html爱?/dc:creator>爱?/author>Thu, 01 Nov 2007 07:54:00 GMThttp://www.tkk7.com/shangaijun/archive/2007/11/01/157512.htmlhttp://www.tkk7.com/shangaijun/comments/157512.htmlhttp://www.tkk7.com/shangaijun/archive/2007/11/01/157512.html#Feedback9http://www.tkk7.com/shangaijun/comments/commentRss/157512.htmlhttp://www.tkk7.com/shangaijun/services/trackbacks/157512.html

Hibernate 入门ҎQ掌握精通我也不敢自夸。我W一遍看Hibernate文档的时候也觉得很吃力,但不是因为Hibernate难掌握而感到吃力,是因? Hibernate文档处处都是持久层设计的l验和最佛_cHibernate文档准确的来_l大部分内容都在讲对象的持久层设计,而不是简单的 Hibernate使用Q用问题查Java doc够了。所以学习HibernateQ主要是在学习持久层的设计模式,如果你把Hibernate文档都看完了Q还整天只会提那? Hibernate的配|问题,Hibernate的类调用问题Q我觉得q样的hq没有真正的入门Q算是白学了?/font>

我对Hibernate 的那些配|也不是特别U熟Q每ơ写hbmQ都要对照文档一点点的检查;c调用参C不太记得Q写代码也要Java doc随时备查。但是我在学习Hibernate的时候即集中所有精力来理解Hibernate的运行原理,集中_֊来掌握持久层设计应该把握的原则和技 巧,q些才对我是最重用的东ѝ毫不夸张的_学习完HibernateQ我对JDBC的编E也提高了一大截Q更不要说对于J2EE架构的持久层的框架设 计,基本上是了然于胸了,即ɞ来换了APIQ不用Hibernate的,改用JDOQCastor什么的Q这些经验一L用?/font>

学习Hibernate主要不是在学习Hibernat怎么配置Q用工具怎么生成hbm文gQ如果你? 重点攑֜q里Q基本上{于白学了Hibernate。Hibernate的精华在于无与u比的灵y的对象持久层设计Q这些持久层设计l验不会因ؓ你不? Hibernate而失掉Q我自己学习HibernateQ已l明显感觉到Ҏ久层设计能力已经长了很多l验gQ这些经验甚至不光可以用在Java 上,用在.net上也是一栗所以Hibernate配置的学习,我只是简单看看,用的时候知道到那里Lp了,一堆复杂的生成工具我根本就看都不去 看,q样下来,掌握Hibernate的配|,可以用Hibernate来替代JDBC写程序,不过׃3天时间就_了。我?天时间对你来说不很 奢侈的学习代价吧?/font>

Z么我q么学习Hibernate的对象持久层设计理念呢?那就看你的理x想一辈子做一个程? 员呢Q还是想向更高的方向发展呢?从纯做技术的角度来说Q职业发展的最高点?#8220;pȝ架构?#8221;QBill Gates不是q叫做微软的首席pȝ架构师吗QSystem Architect职位需要的是你的学习和领悟能力Q如果你不能把学习Hibernate得到的设计经验运用到其它地方Q那么你是失败的Q也没有资格? System Architect?/font>

不管JDO也好QHibernate也好QTopLink也好QCocoBase也好Q还? CastorQ还是什么TorqueQOJBQY件的使用和配|方法可以各异,但本质上都是ORMQ都是对JDBC的对象持久层装Q所以万变不d宗, 如果你完整的学习和掌握Hibernate׃1个月的时_那么你再学习OJB的时间不应该过1个星期,因ؓ你已l把对象持久层设计都了然于胸了,? 需要的只是熟悉一下OJB的API和配|Ş了,至于怎么q用OJBq行持久层的开发你早就已经熟悉了?/font>

所以当你掌握了两种以上的ORMQ你应该能够不拘于用的ORM软g的限Ӟ设计出适合于你的项目的? 久层来,q才是System Architect的水准。用金庸说来打个比Ҏ说吧Q张无忌学太极剑Q只记剑意,不记剑招Q这才是真正的高手,而低手就只会d习剑招,而不去领会剑 招背后蕴含的剑意Q所以一辈子都是低手Q永q不能真正学会太极剑。所以周颠看到张三丰W二ơ演C太极剑Q招式完全不同就以ؓ是另一套东西,其实本质上都一 栗学习Hibernate也不要舍本逐末的去学各U五花八门的工具Q重Ҏ握它的对象持久层设计理念?/font>



]]>
Servlet2.3规范 转蝲http://www.tkk7.com/shangaijun/archive/2007/08/18/137865.html爱?/dc:creator>爱?/author>Sat, 18 Aug 2007 14:22:00 GMThttp://www.tkk7.com/shangaijun/archive/2007/08/18/137865.htmlhttp://www.tkk7.com/shangaijun/comments/137865.htmlhttp://www.tkk7.com/shangaijun/archive/2007/08/18/137865.html#Feedback0http://www.tkk7.com/shangaijun/comments/commentRss/137865.htmlhttp://www.tkk7.com/shangaijun/services/trackbacks/137865.html阅读全文

]]>
java入门与提?-- 6.java.util?转蝲http://www.tkk7.com/shangaijun/archive/2007/08/16/137264.html爱?/dc:creator>爱?/author>Thu, 16 Aug 2007 06:49:00 GMThttp://www.tkk7.com/shangaijun/archive/2007/08/16/137264.htmlhttp://www.tkk7.com/shangaijun/comments/137264.htmlhttp://www.tkk7.com/shangaijun/archive/2007/08/16/137264.html#Feedback1http://www.tkk7.com/shangaijun/comments/commentRss/137264.htmlhttp://www.tkk7.com/shangaijun/services/trackbacks/137264.html48 java能动态分配数l吗Q?
  {:可以。例如int n = 3; Language[] myLanguages = new Language[n];

49 我怎么知道数组的长度?
  {:用length属性。如上例中的 myLanguages.length ׃ؓ 3?

50 我还惌数组的长度能自动改变Q能够增?删除元素?
  {:用顺序表--java.util.List接口?
  你可以选择用ArrayList或是LinkedListQ前者是数组实现Q后者是链表实现?
  例如Q?List list = new ArrayList(); 或是 List list = new LinkedList(); ?

51 什么是链表Qؓ什么要有两U实玎ͼ
  {:误习数据结构?

52 我想用队?栈?
  {:用java.util.LinkedList?

53 我希望不要有重复的元素?
  {:用集?-java.util.Set接口。例如:Set set = new HashSet()?

54 我想遍历集合/Map?
  {:用java.util.Iterator。参见API?

55 我还要能够排序?
  {:用java.util.TreeSet。例如:Set set = new TreeSet()。放q去的元素会自动排序?
  你需要ؓ元素实现Comparable接口Q还可能需要提供equals()ҎQcompareTo()ҎQhashCode()Ҏ?

56 但是我想l数l排序?
  {:java.util.Arrayscd含了sort{实用方法?

57 我想按不同方法排序?
  {:为每U方法定义一个实C接口Comparator的类q和Arraysl合q用?

58 Map有什么用Q?
  {:存储key-value的关键字-值对Q你可以通过关键字来快速存取相应的倹{?

59 setҎ没问题,但是getҎq回的是Object?
  {:强制cd转换成你需要的cd。参?5?

60 我要获得一个随机数?
  {:使用java.util.RandomcR?

61 我比较两个StringLfalseQ但是它们明明都?abc" Q?
  {:比较String一定要使用equals或equalsIgnoreCaseҎQ不要?== Q?
  ==比较的是两个引用Q变量)是否指向了同一个对象,而不是比较其内容?br>



]]>
java入门与加?-- 5.面向对象?转蝲http://www.tkk7.com/shangaijun/archive/2007/08/16/137263.html爱?/dc:creator>爱?/author>Thu, 16 Aug 2007 06:48:00 GMThttp://www.tkk7.com/shangaijun/archive/2007/08/16/137263.htmlhttp://www.tkk7.com/shangaijun/comments/137263.htmlhttp://www.tkk7.com/shangaijun/archive/2007/08/16/137263.html#Feedback1http://www.tkk7.com/shangaijun/comments/commentRss/137263.htmlhttp://www.tkk7.com/shangaijun/services/trackbacks/137263.htmljava入门与加?pd 相关文章
(? java入门与加?-- 1.基础?
(? java入门与加?-- 2.命o?nbsp; 
(? java入门与加?-- 3.I/O?nbsp; 
(? java入门与加?-- 4.关键字篇
(? java入门与加?-- 5.面向对象?
(? java入门与加?-- 6.java.util?

34 extends和implements有什么不同?
  {:extends用于Q单Q承一个类QclassQ,而implements用于实现一个接口(interfaceQ?
  interface的引入是Z部分地提供多l承的功能?
  在interface中只需声明Ҏ_而将Ҏ体留l实现的class来做?
  q些实现的class的实例完全可以当作interface的实例来对待?
  有趣的是在interface之间也可以声明ؓextendsQ单l承Q的关系?

35 java怎么实现多承?
  {:java不支持显式的多ѝ?
  因ؓ在显式多l承的语a例如c++中,会出现子c被q声明祖先虚基类构造函数的问题Q?

  而这是违反面向对象的装性原则的?
  java提供了interface和implements关键字来部分地实现多l承。参?4?

36 abstract是什么?
  {:被声明ؓabstract的方法无需l出Ҏ体,留给子类来实现?
  而如果一个类中有abstractҎQ那么这个类也必d明ؓabstract?
  被声明ؓabstract的类无法实例化,管它可以定义构造方法供子类使用?

37 public,protected,private有什么不同?
  {:q些关键字用于声明类和成员的可见性?
  public成员可以被Q何类讉KQ?
  protected成员限于自己和子c访问,
  private成员限于自己讉K?
  Javaq提供了W四U的默认可见性,当没有Q何public,protected,private修饰Ӟ成员是包内可?br>  cd以用public或默认来修饰?

38 Override和Overload有什么不同?
  {:Override是指父类和子cM间方法的l承关系Q这些方法有着相同的名U和参数cd?
  Overload是指同一个类中不同方法(可以在子cM可以在父cM定义Q间的关p,q些Ҏ有着相同的名U和不同的参数类型?

39 我承了一个方法,但现在我惌用在父类中定义的Ҏ?
  {:用super.xxx()可以在子cM调用父类Ҏ?

40 我想在子cȝ构造方法中调用父类的构造方法,该怎么办?
  {:在子cL造方法的W一行调用super(...)卛_?

41 我在同一个类中定义了好几个构造方法ƈ且想在一个构造方法中调用另一个?
  {:在构造方法第一行调用this(...)?

42 我没有定义构造方法会怎么P
  {:自动获得一个无参数的构造方法?

43 我调用无参数的构造方法失败了?
  {:如果你至定义了一个构造方法,׃再有自动提供的无参数的构造方法了?
  你需要显式定义一个无参数的构造方法?

44 我该怎么定义cM于C++中的析构ҎQdestructorQ?
  {:提供一个void finalize()Ҏ。在Garbarge Collector回收该对象时会调用该Ҏ?
  注意实际上你很难判断一个对象会在什么时候被回收。作者从未感到需要提供该Ҏ?

45 我想一个父cd象{换成一个子cd象该怎么做?
  {:强制cd转换。如
  public void meth(A a)
  {
  B b = (B)a;
  }
  如果a实际上ƈ不是B的实例,会抛出ClassCastException。所以请保a实是B的实?
  ?

46 其实我不定a是不是B的实例,能不能分情况处理Q?
  {:可以使用instanceof操作W。例?
  if( a instanceof B )
  {
  B b = (B)a;
  }
  else
  {
  ...


  }

47 我在Ҏ里修改了一个对象的|但是退出方法后我发现这个对象的值没变!
  {:很可能你把传入参数重赋了一个新对象Q例如下列代码就会造成q种错误Q?
  public void fun1(A a) //a是局部参敎ͼ指向了一个外在对象?
  {
  a = new A(); //a指向了一个新对象Q和外在对象脱钩了。如果你要让a作ؓ?
  出变
  量,不要写这一句?
  a.setAttr(attr);//修改了新对象的|外在对象没有被修攏V?
  }
  基本cd也会出现q种情况。例如:
  public void fun2(int a)
  {
  a = 10;//只作用于本方法,外面的变量不会变化?
  }


]]>
java入门与加?-- 4.关键字篇 转蝲http://www.tkk7.com/shangaijun/archive/2007/08/16/137261.html爱?/dc:creator>爱?/author>Thu, 16 Aug 2007 06:47:00 GMThttp://www.tkk7.com/shangaijun/archive/2007/08/16/137261.htmlhttp://www.tkk7.com/shangaijun/comments/137261.htmlhttp://www.tkk7.com/shangaijun/archive/2007/08/16/137261.html#Feedback0http://www.tkk7.com/shangaijun/comments/commentRss/137261.htmlhttp://www.tkk7.com/shangaijun/services/trackbacks/137261.html25 java里面怎么定义宏?
  {:java不支持宏Q因为宏代换不能保证cd安全?
  如果你需要定义常量,可以它定义为某个类的static final成员。参?6?0?

26 java里面没法用const?
  {:你可以用final关键字。例?final int m = 9。被声明为final的变量不能被再次赋?final也可以用于声明方法或c,被声明ؓfinal的方法或cM能被l承 ?
  注意const是java的保留字以备扩充?

27 java里面也不能用goto?
  {:甚至在面向过E的语言中你也可以完全不用goto。请查你的程序流E是否合理?
  如果你需要从多层循环中迅速蟩出,java增强了(和C++相比Qbreak和continue的功能,支持label?

  例如Q?
  outer :
  while( ... )
  {
  inner :
  for( ... )
  {
  ... break inner; ...
  ... continue outer; ...
  }
  }
  和const一Pgoto也是java的保留字以备扩充?

28 java里面能不能重载操作符Q?
  {:不能。String?h唯一一个内|的重蝲操作W。你可以通过定义接口和方法来实现c?
  似功能?

29 我new了一个对象,但是没法delete掉它?
  {:java有自动内存回收机Ӟx谓Garbarge Collector。你再也不用担心指针错误

30 我想知道Z么mainҎ必须被声明ؓpublic staticQ?
  {:声明为public是ؓ了这个方法可以被外部调用Q详情见面向对象?7?
  static是ؓ了将某个成员变量/Ҏ兌到类QclassQ而非实例QinstanceQ?
  你不需要创Z个对象就可以直接使用q个cȝstatic成员Q?
  在AcM调用Bcȝstatic成员可以使用B.staticMember的写法?
  注意一个类的static成员变量是唯一的,被所有该cd象所׃n的?

31 throw和throws有什么不同?
  {:throws用于声明一个方法会抛出哪些异常。而throw是在Ҏ体中实际执行抛出异常
  的动作?
  如果你在Ҏ中throw一个异常,却没有在Ҏ声明中声明之Q编译器会报错?
  注意Error和RuntimeException的子cL例外Q无需特别声明?

32 什么是异常Q?
  {:异常最早在Ada语言中引入,用于在程序中动态处理错误ƈ恢复?
  你可以在Ҏ中拦截底层异常ƈ处理之,也可以抛l更高层的模块去处理?
  你也可以抛出自己的异常指C发生了某些不正常情c常见的拦截处理代码如下Q?
  try
  {
  ...... //以下是可能发生异常的代码
  ...... //异常被抛出,执行程中断q{向拦截代码?
  ......
  }


  catch(Exception1 e) //如果Exception1是Exception2的子cdƈ要做特别处理Q应排在
  前面
  {
  //发生Exception1时被该段拦截
  }
  catch(Exception2 e)
  {
  //发生Exception2时被该段拦截
  }
  finally //q是可选的
  {
  //无论异常是否发生Q均执行此段代码
  }

33 final和finally有什么不同?
  {:final误26。finally用于异常机制Q参?2?



]]>
java入门与加?-- 3.I/O?转蝲http://www.tkk7.com/shangaijun/archive/2007/08/16/137260.html爱?/dc:creator>爱?/author>Thu, 16 Aug 2007 06:46:00 GMThttp://www.tkk7.com/shangaijun/archive/2007/08/16/137260.htmlhttp://www.tkk7.com/shangaijun/comments/137260.htmlhttp://www.tkk7.com/shangaijun/archive/2007/08/16/137260.html#Feedback2http://www.tkk7.com/shangaijun/comments/commentRss/137260.htmlhttp://www.tkk7.com/shangaijun/services/trackbacks/137260.html18 我怎么ljavaE序加启动参敎ͼ像dir /p/w那样Q?
  {:q记得public static void main(String[] args)吗?q里的args是你的启动参数?
  在运行时你输入java package1.class1 -arg1 -arg2Qargs中就会有两个StringQ一个是arg1Q另一个是arg2?

19 我怎么从键盘输入一个int/double/字符Ԍ
  {:java的I/O操作比C++要复杂一炏V如果要从键盘输入,样例代码如下Q?
  BufferedReader cin = new BufferedReader( new InputStreamReader( System.in ) ) ;
  String s = cin.readLine();
  q样你就获得了一个字W串Q如果你需要数字的话再加上Q?
  int n = Integer.parseInt( s ); 或?double d = Double.parseDouble( s );

20 我怎么输出一个int/double/字符Ԍ
  {:在程序开始写Q?
  PrintWriter cout = new PrintWriter( System.out ); 需要时写:cout.print(n); 或?out.println("hello"){等?

21 我发现有些书上直接用System.in和System.out输入输出Q比你要单得多?
  {:java使用unicodeQ是双字节。而System.in和System.out是单字节的stream?
  如果你要输入输出双字节文字比如中文,请用作者的做法?

22 我怎么从文件输入一个int/double/字符Ԍ
  {:cM于从键盘输入Q只不过换成
  BufferedReader fin = new BufferedReader( new FileReader(" myFileName " ) );
  PrintWriter fout = new PrintWriter( new FileWriter(" myFileName " ) );
  另外如果你还没下载APIQ请开始下载ƈ阅读java.io包中的内宏V?

23 我想d文g的指定位|,该怎么办?
  {:你肯定没有认真看API。java.io.RandomAccessFile可以满你的需要?

24 怎么判断要读的文件已l到了尽_
  {:你肯定没有认真看API。在Reaer的readҎ中明说明返?1表示的l尾?



]]>
java入门与加?-- 2.命o?转蝲http://www.tkk7.com/shangaijun/archive/2007/08/16/137257.html爱?/dc:creator>爱?/author>Thu, 16 Aug 2007 06:45:00 GMThttp://www.tkk7.com/shangaijun/archive/2007/08/16/137257.htmlhttp://www.tkk7.com/shangaijun/comments/137257.htmlhttp://www.tkk7.com/shangaijun/archive/2007/08/16/137257.html#Feedback0http://www.tkk7.com/shangaijun/comments/commentRss/137257.htmlhttp://www.tkk7.com/shangaijun/services/trackbacks/137257.html7 我写了第一个JavaE序Q应该如何编?q行Q?
  {:首先请将E序保存为xxx.java文gQ?
  然后在dosH口下用javac xxx.java命oQ你会发现该目录下多了一个xxx.class文gQ再使用java xxx命oQ你的javaE序开始运行了?

8 我照你说的做了,但是出现什?´javac´ 不是内部或外部命令,也不是可q行的程序或批处理文件??
  {:你遇Cpath问题。操作系l在一定的范围(path)内搜索javac.exeQ但是没能找到?
  L辑你的操作系l环境变量,新增一个JAVA_HOME变量Q设ZJDK的安装目录,
  再编辑Path变量Q加上一?%JAVA_HOME%\bin?
  然后xq新开一个dosH口Q你可以用javac和java命o了?

9 环境变量怎么讄Q?
  {:请向w边会设的h咨询?java初学者必?l验ȝ q篇文章中比较详l的讲到 jdk开发中pȝ环境变量讄 以及相关 服务器配|等开发环境配|?/p>

10 javac xxx.java利通过了,但是java xxx的时候显CZ?NoClassDefFoundError"
  {:你遇Cclasspath问题。java命o在一定的范围(classpath)内搜索你要用的class文gQ但是未能找到?
  首先L认你没有错敲成java xxx.classQ?
  其次Q检查你的CLASSPATH环境变量Q如果你讄了该变量又没有包?Q代表当前目录)你就会遇到这个问题。请在你的CLASSPATH环境变量中加入一? 。另
  外参?5?

11 我在java xxx的时候显C?Exception in thread "main" java.lang.NoSuchMethodError: main"?
  {:首先Q在你的E序中每个java文g有且只能有一个publicc,
  q个cȝcd必须和文件名的大写完全一栗?
  其次Q在你要q行的类中有且只能有一个public static void main(String[] args)ҎQ这个方法就是你的主E序?

12 package是什么意思?怎么用?
  {:Z唯一标识每个cdƈ分组Qjava使用了package的概c?
  每个c都有一个全名,例如String的全名是java.lang.StringQ其中java.lang是包名,String是短名?
  q样Q如果你也定义了StringQ你可以把它攑֜mypackage中,
  通过使用全名mypackage.String和java.lang.String来区分这两个cR?
  同时Q将逻辑上相关的cL在同一个包中,可以使程序结构更为清楚?

  你要做的是在java文g开头加一?package mypackage;"?
  注意包没有嵌套或包含关系QA包和A.B包对java命o来说是ƈ列的两个?/p>

13 我没有声明Q何package会怎么P
  {:你的c被认ؓ攑֜默认包中。这时全名和短名是一致的?

14 在一个类中怎么使用其他c?
  {:如果你用java.lang包中的类Q不用做M事?
  如果你用其他包中的c,使用import package1.class1; ?import package2.*;
  q里.*表示引入q个包中的所有类。然后在E序中你可以使用其他cȝ短名?
  如果短名有冲H,使用全名来区分?

15 我用了package的时候显C?NoClassDefFoundError"Q但是我把所有packageL的时候能正常q行?
  {:你的java文g按包名存放?
  比如你的工作目录?workQ你的类是package1.class1Q那么将它存放ؓ/work/package1/class1.java?br>  如果没有声明包,那么直接攑֜/work下?
  ?work下执行javac package1/class1.javaQ再执行java package1.class1Q你会发?
  一切正常?br>  另外Q你可以考虑开始用IDE?

16 我想把java~译成exe文gQ该怎么做?
  {:JDK只能java源文件编译ؓclass文g?
  class文g是一U跨q_的字节码Q必M赖^台相关的JRE来运行。Java以此来实现跨q_Q有些开发工具可以将java文g~译为exe文g。作者反对这U做法,因ؓq样取消了跨^台性?
  如果你确信你的Y件只在Windowsq_上运行,你可以考虑使用C++/C#来编E?

17 我在~译的时候遇C?deprecated API"Q是什么意思?
  {:所谓deprecated是指已经?Ӟ但是Z向前兼容赯仍然保留的方?q些Ҏ可能会在以后取消支持。你应当改用较新的方法?
  一般在API里面会说明你应当用什么方法来代替之?



]]>
Java入门与加?-- 1.基础? 转蝲http://www.tkk7.com/shangaijun/archive/2007/08/16/137256.html爱?/dc:creator>爱?/author>Thu, 16 Aug 2007 06:44:00 GMThttp://www.tkk7.com/shangaijun/archive/2007/08/16/137256.htmlhttp://www.tkk7.com/shangaijun/comments/137256.htmlhttp://www.tkk7.com/shangaijun/archive/2007/08/16/137256.html#Feedback0http://www.tkk7.com/shangaijun/comments/commentRss/137256.htmlhttp://www.tkk7.com/shangaijun/services/trackbacks/137256.html1 什么是Java、Java2、JDKQJDK后面?.3?.4.2版本号又是怎么回事Q?
  {:Java是一U通用的,q发的,强类型的Q面向对象的~程语言Q摘自Java规范W二? JDK是Sun公司分发的免费Java开发工P正式名称为J2SDK(Java2 Softw are Develop Kit)?

2 什么是JRE/J2REQ?
  {:J2RE是Java2 Runtime EnvironmentQ?nbsp;  即Javaq行环境Q有时简UJRE?
如果你只需要运行JavaE序或AppletQ?下蝲q安装它卛_。如果你要自行开发Java软gQ请下蝲JDK。在JDK中附带有J2RE?br>  注意׃Microsoft对Java的支持不完全Q请不要使用IE自带的虚拟机来运行AppletQ务必安装一个J2RE或JDK?

3 学习Java用什么工h较好Q?
 {:作者徏议首先用JDK+文本~辑器,q有助你理解下列几个基础概念QpathQclasspathQpackageq熟悉基本命令:javac和java。ƈ且下载和你的JDK版本一致的API帮助?
  如果你不定cL函数的用法,请先查阅API而不是发贴求助?
  当你熟悉Java之后Q你可以考虑换一个IDE。很多h推荐JcreatorQ实际上Jcreator的功能还 是很q?
  作者推荐eclipseQ下载网址http://www.eclipse.org ;。因eclispe是免费的.

4 学习Java有哪些好的参考书Q?
  {:作者首先推荐Thinking in JavaQ中文名《Java~程思想》,有中文版。该书第一章介l了很多面向对象的编E思想Q作为新手应当认真阅诅R除此以外,O´relly出版C֒Wrox出版C书也不错。作者本Z喜欢大陆作者的书。也怽觉得英文太难Q但是网上大多数资料都是英文的。另外,你需要经常查阅APIQ而那也是英文的?

5 Java和C++哪个更好Q?
  {:q个问题是一个很不恰当的问题。你应该问:Java和C++哪个更适用于我的项目? 如果你不需要跨q_Q不需要分布式Q要E序的运行速度QC++更ؓ适用。反?你应当考虑Java?

6 什么是J2SE/J2EE/J2MEQ?nbsp; 
  {:J2SE是一般的Java?
  J2ME是针对嵌入式讑֤的,比如Java手机Q它有自qSDK。而J2EE使用J2SE的SDK?
  J2EE规范更多的是对J2EE服务器的要求和开发h员的U束。详情见后《J2EE FAQ》?br>



]]>
初学者如何开发出一个高质量的J2EEpȝhttp://www.tkk7.com/shangaijun/archive/2007/08/12/136160.html爱?/dc:creator>爱?/author>Sun, 12 Aug 2007 06:37:00 GMThttp://www.tkk7.com/shangaijun/archive/2007/08/12/136160.htmlhttp://www.tkk7.com/shangaijun/comments/136160.htmlhttp://www.tkk7.com/shangaijun/archive/2007/08/12/136160.html#Feedback1http://www.tkk7.com/shangaijun/comments/commentRss/136160.htmlhttp://www.tkk7.com/shangaijun/services/trackbacks/136160.htmlJ2EE学习者越来越多,J2EE本n技术不断在发展Q涌现出各种概念Q本文章试图从一U容易理解的角度对这些概念向初学者进行解释,以便掌握学习J2EE学习方向?br>
  首先我们需要知道Java和J2EE是两个不同概念,Java不只是指一U语aQ已l代表与微Y不同的另外一个巨大阵营,所以Java有时是指一UY件系l的派Q当然目前主要是.NET和Java两大L体系?br>
  J2EE可以说指Java在数据库信息pȝ上实玎ͼ数据库信息系l从早期的dBase、到Delphi/VB{C/Sl构Q发展到B/SQBrowser览?Server服务器)l构Q而J2EE主要是指B/Sl构的实现?br>
  J2EE又是一U框架和标准Q框架类似API、库的概念,但是要超出它们。如果需要详l了解框Ӟ可先从设计模式开始学习?br>
  J2EE是一个虚的大的概念,J2EE标准主要有三U子技术标准:WEB技术、EJB技术和JMSQ谈到J2EE应该说最l要落实到这三个子概念上?br>
  q三U技术的每个技术在应用旉涉及两个部分Q容器部分和应用部分QWeb容器也是指Jsp/Servlet容器Q你如果要开发一个Web应用Q无论是~译或运行,都必要有Jsp/Servlet库或API支持Q除了JDK/J2SE以外Q?br>
  Web技术中除了Jsp/Servlet技术外Q还需要JavaBeans或Java Class实现一些功能或者包装携带数据,所以Web技术最初裸体简UCؓJsp/Servlet+JavaBeanspȝ?br>
  谈到JavaBeans技术,涉及到lg构g技术(componentQ,q是Java的核心基部分Q很多Y件设计概念(设计模式Q都是通过JavaBeans实现的?br>
  JavaBeans不属于J2EE概念范畴中,如果一个JavaBeans对象被Web技术(也就是Jsp/ServletQ调用,那么JavaBeansp行在J2EE的Web容器中;如果它被EJB调用Q它p行在EJB容器中?br>
  EJBQ企业JavaBeansQ是普通JavaBeans的一U提升和规范Q因Z业信息系l开发中需要一个可伸羃的性能和事务、安全机Ӟq样能保证企业系l^滑发展,而不是发展到一U规模重新更换一套Y件系l?br>
  xQJavaBeanslg发展到EJB后,q不是说以前的那UJavaBeans形式消׃Q这p然Ş成了两种JavaBeans技术:EJB和POJOQPOJO完全不同于EJB概念Q指的是普通JavaBeansQ而且q个JavaBeans不依附某U框Ӟ或者干脆可以说Q这个JavaBeans是你个应用程序单独开发创建的?br>
  J2EE应用pȝ开发工h很多Q如JBuilder、Eclipse{,q些IDE首先是Java开发工P也就是说Q它们首要基本功能是可以开发出JavaBeans或Java classQ但是如果要开发出J2EEpȝQ就要落实到要么是Web技术或EJB技术,那么有可能要一些专门模块功?如eclipse需要lomboz插g)Q最重要的是Q因为J2EEpȝ区分为容器和应用两个部分Q所以,在Q何开发工具中开发J2EE都需要指定J2EE容器?br>
  J2EE容器分ؓWEB容器和EJB容器QTomcat/Resin是Web容器QJBoss是EJB容器+Web容器{,其中Web容器直接使用Tomcat实现的。所以你开发的Web应用E序可以在上面两U容器运行,而你开发的Web+EJB应用则只可以在JBoss服务器上q行Q商业品Websphere/Weblogic{和JBoss属于同一U性质?br>
  J2EE容器也称为J2EE服务器,大部分时它们概念是一致的?br>
  如果你的J2EE应用pȝ的数据库q接是通过JNDI获得Q也是说是从容器中获得Q那么你的J2EE应用pȝ基本与数据库无关Q如果你在你的J2EE应用pȝ耦合了数据库JDBC驱动的配|,那么你的J2EE应用pȝ有数据库概念色彩,作ؓ一个成熟需要推q的J2EE应用pȝQ不推荐和具体数据库耦合Q当然这其中如何保证J2EE应用pȝq行性能又是体现你的设计水^了?br>
  衡量J2EE应用pȝ设计开发水q高低的标准是Q解耦性;你的应用pȝ各个功能是否能够dqQ是否不怺依赖Q也只有q样Q才能体现可l护性、可拓展性的软g设计目标?br>
  Z辑ֈq个目的Q诞生各U框架概念,J2EE框架标准一个系l划分ؓWEB和EJB主要部分Q当然我们有时不是以q个具体技术区分,而是从设计上抽象现层、服务层和持久层Q这三个层次从一个高度将J2EE分离开来,实现解耦目的?br>
  因此Q我们实际编E中Q也要将自己的功能向q三个层ơ上靠,做到大方向清楚,泾渭分明Q但是没有技术上U束限制要做到这Ҏ很不Ҏ的,因此我们q是必须借助J2EE具体技术来实现Q这Ӟ你可以用EJB规范实现服务层和持久层,Web技术实现表现层Q?br>
  EJBZ么能服务层从Jsp/Servlet手中分离出来Q因为它对JavaBeans~码有强制的U束Q现在有一U对JavaBeansq束,使用Ioc模式实现的(当然EJB 3.0也采取这U方式)Q在Ioc模式诞生前,一般都是通过工厂模式来对JavaBeansU束QŞ成一个服务层Q这也是是Jiveq样开源论坛设计原理之一?br>
  由此Q将服务层从表现层中分离出来目前有两U可选架构选择Q管理普通JavaBeansQPOJOQ框?如Spring、JdonFramework)以及理EJB的EJB框架Q因为EJB不只是框Ӟq是标准Q而标准可以扩展发展,所以,q两U区别将来是可能模糊Q被U_同一个标准了。 但是Q个为:标准制定是ؓ某个目的服务的,总要牺牲一些换取另外一些,所以,q两U架构会长时间ƈ存?br>
  q两U架构分歧也曄诞生一个新名词Q完全POJO的系l也UCؓ轻量U系l?lightweight)Q其实这个名词本w就没有一个严格定义,更多是一个吸引h的招牌,轻量是指Ҏ学习Ҏ使用吗?按照q个定义Q其实轻量Spring{系lƈ不容易学习;而且EJB 3.0Q依然叫EJBQ以后的pȝ是否可称量了呢Q?br>
  前面谈了服务层框Ӟ使用服务层框架可以将JavaBeans从Jsp/Servlet中分d来,而用表现层框架则可以将Jsp中剩余的JavaBeans完全分离Q这部分JavaBeans主要负责昄相关Q一般是通过标签库(taglibQ实玎ͼ不同框架有不同自q标签库,Struts是应用比较广泛的一U表现层框架?br>
  q样Q表现层和服务层的分L通过两种框架辑ֈ目的Q剩余的是持久层框架了Q通过持久层的框架数据库存储从服务层中分d来是其目的,持久层框架有两种方向Q直接自q写JDBC{SQL语句Q如iBatisQ;使用O/R Mapping技术实现的Hibernate和JDO技术;当然q有EJB中的实体Bean技术?br>
  持久层框架目前呈现百花齐放,各有优缺点的现状Q所以正如表现层框架一P目前没有一个框架被指定为标准框Ӟ当然Q表现层框架现在又出来了一个JSFQ它代表的页面组件概忉|一个新的发展方向,但是复杂的实现让人有些忘而却步?br>
  在所有这些J2EE技术中Q虽然SUN公司发挥了很大的作用Q不qM来说Q网l上有这样一个评PSUN的理论天下无敌;SUN的品用h撞墙Q对于初学者,特别是那些试N过或已l通过SUN认证的初学者,赶快摆脱SUN的阴影,立即开溜,使用开源领域的产品来实现自q应用pȝ?br>
  最后,你的J2EE应用pȝ如果采取上面提到的表现层、服务层和持久层的框架实玎ͼ基本你也可以在无需深刻掌握设计模式的情况下开发出一个高质量的应用系l了?br>
  q要注意的是: 开发出一个高质量的J2EEpȝq需要正的业务需求理解,那么域徏模提供了一U比较切实可行的正确理解业务需求的ҎQ相兌l知识可从UML角度l合理解?br>
  当然Q如果你惌计自q行业框架Q那么第一步从设计模式开始吧Q因计模式提供你一个实现JavaBeans或类之间解耦参考实现方法,当你学会了系l基本单元JavaBean或类之间解耦时Q那么系l模块之间的解耦你可能掌握,q而你可以实现行业框架的提炼了,q又是另外一个发展方向了?br>
  以上理念可以ȝZ句话Q?br>J2EE开发三件宝: Domain ModelQ域建模Q、patternsQ模式)和frameworkQ框Ӟ?br>
  推荐一套高质量的J2EE开源系l: JPestore
  
  如果初学者没有理解,Ƣ迎l箋讨论Q大胆提Z心中的疑?/span>

]]>
վ֩ģ壺 avƬ߹ۿ| ޾Ʒm߹ۿ| ðѾƷƵ| ޹˾þۺһ77| 123| ƶ߹ۿ| avרԭ| ߹ۿպ| ˹վvƬѹۿ| պƷר| þþžžþƷֱ| ۺϹһ| 99պƷ| ༤ۺ͵| avëƬһ| ŷպĶ| ձһձ| պӰ߹ۿַ | ѾƷԲ| ass**ëpics| ձ| ߹ۿavվ| ޹Ʒþþþþ| 91ɫۺϾþѷ| ձһ߲Ͷ߲Ա| ŮڵƵ | ɫҹƵ| 91޾ƷƵ| ֻѸۿ| պëƬһ| ޿һ24޿| պƷר| ҹƬ߹ۿ| AVպAVһ| ѿ13| ۺϾþþƷ| ޸Ʒһ| ƬAëƬ鴤ɫ| һëƬѹۿ| ޸Ƶ| ޾Ʒ456|