??xml version="1.0" encoding="utf-8" standalone="yes"?>久久亚洲精品成人,日韩亚洲国产综合高清,亚洲AV日韩AV无码污污网站http://www.tkk7.com/fhtdy2004/category/39225.htmll验薄Q耐心U篏Q记性不好,记诸文字zh-cnSat, 18 Jun 2011 22:12:44 GMTSat, 18 Jun 2011 22:12:44 GMT60t.interrupt(),t.isInterrupted(),Thread.interrupted()http://www.tkk7.com/fhtdy2004/archive/2009/08/22/292181.htmlFrank_FangFrank_FangSat, 22 Aug 2009 03:07:00 GMThttp://www.tkk7.com/fhtdy2004/archive/2009/08/22/292181.htmlhttp://www.tkk7.com/fhtdy2004/comments/292181.htmlhttp://www.tkk7.com/fhtdy2004/archive/2009/08/22/292181.html#Feedback0http://www.tkk7.com/fhtdy2004/comments/commentRss/292181.htmlhttp://www.tkk7.com/fhtdy2004/services/trackbacks/292181.html阅读全文

Frank_Fang 2009-08-22 11:07 发表评论
]]>
【{】线E中的默认异常处?/title><link>http://www.tkk7.com/fhtdy2004/archive/2009/08/07/290215.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Fri, 07 Aug 2009 05:15:00 GMT</pubDate><guid>http://www.tkk7.com/fhtdy2004/archive/2009/08/07/290215.html</guid><wfw:comment>http://www.tkk7.com/fhtdy2004/comments/290215.html</wfw:comment><comments>http://www.tkk7.com/fhtdy2004/archive/2009/08/07/290215.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/fhtdy2004/comments/commentRss/290215.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/fhtdy2004/services/trackbacks/290215.html</trackback:ping><description><![CDATA[<blockquote> <p>http://www.ibm.com/developerworks/cn/java/j-tiger08104/</p> <p>跟踪无法预期的运行时异常可能是一件又慢又费力的事情,只获得默认线E名U和堆栈跟踪通常是不够的。在 <em>驯服 Tiger</em> q一期专栏中QJava 开发h?John Zukowski 向您展示了如何通过替代默认行ؓ来定制输出。他q对比了通过l分 <code>ThreadGroup</code> 定制输出的老方法与通过提供自己?<code>UncaughtExceptionHandler</code> 定制输出的新Ҏ?</p> </blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES--> <p>虽然我们不想创徏在无法预期时抛出q行时异常的E序Q但q种情况q是会发生——尤其是W一ơ运行复杂程序时。通常是用默认行为、打印堆栈溢出和l束U程的生命来处理q些异常?/p> <p>从哪里发现默认行为?每个U程都属于一个由 <code>java.lang.ThreadGroup</code> c表C的U程l。顾名思义Q线E组允许您将U程l合在一赗您可能是ؓ了方便而将U程l合Q例如,一个线E池中的所有线E都属于l?XQ而另一个池的所有线E则属于l?YQ或者是Z讉K控制而将U程q行l合。组 X 中的U程无权讉K或改变组 Y 中的U程Q除非它们都在同一U程l内Q或在一个子l内Q?</p> <p>?Tiger 之前Q?<code>ThreadGroup</code> cL供了一U处理未捕获异常的方法: <code>ThreadGroup</code> ?<code>uncaughtException()</code> Ҏ。如果异怸?<code>ThreadDeath</code> Q则线E的名称和堆栈回溯(stack backtraceQ发送到 <code>System.err</code> 。但?Tiger d了另一U方法: <code>Thread.UncaughtExceptionHandler</code> 接口。细?<code>ThreadGroup</code> 或安装该新接口的实现都允许您更改默认行ؓ。我们将?Tiger 之前和之后提供的Ҏ都进行研I?</p> <p><a name="1.0"><span id="6666161" class="atitle">使用 ThreadGroup 的定制行?/span></a></p> <p>发生未捕L异常Ӟ默认行ؓ是将堆栈溢出打印输出到系l错误( <code>System.err</code> Q中Q如清单 1 中所C。不需要用Q何命令参数来启动E序?</p> <br /> <a name="list1"><strong>清单 1. U程溢出CZ</strong></a><br /> <table cellspacing="0" cellpadding="0" width="500" border="0" sizset="36" sizcache="2"> <tbody sizset="36" sizcache="1"> <tr> <td class="code-outline"> <pre class="displaycode">public class SimpleDump { public static void main(String args[]) { System.out.println(args[0]); } } </pre> </td> </tr> </tbody> </table> <br /> <p>不用Q何参数运行该E序生成清?2 中的输出。尽它不是一个很长的堆栈跟踪Q但它是一个完整的堆栈跟踪?/p> <br /> <a name="list2"><strong>清单 2. 默认U程溢出输出</strong></a><br /> <table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="37" sizcache="2"> <tbody sizset="37" sizcache="1"> <tr> <td class="code-outline"> <pre class="displaycode">Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at SimpleDump.main(SimpleDump.java:3) </pre> </td> </tr> </tbody> </table> <br /> <p>正如 Java q_的许多东西一P如果不喜Ƣ默认行为,您可以对其进行更攏V在 Java q_?Tiger 版以前的版本中,不能替代所有线E的默认行ؓQ但是可以创Z个新?<code>ThreadGroup</code> Qƈ更改在该l内创徏的Q何线E的默认行ؓ。您可以重写 <code>uncaughtException(Thread t, Throwable e)</code> Ҏ来定制该行ؓ。然后,当发生未预料的运行时异常Ӟ该线E组内创建的MU程都将获得新的行ؓ。不q,最好是修复基础问题Q我提供一个简单的CZQ说明更攚w认行为所必需的步骤。清?3 展示了将执行代码攑օ新线E的调整q的试E序Q?</p> <br /> <a name="list3"><strong>清单 3. 调整q的U程溢出CZ</strong></a><br /> <table cellspacing="0" cellpadding="0" width="600" border="0" sizset="38" sizcache="2"> <tbody sizset="38" sizcache="1"> <tr> <td class="code-outline"> <pre class="displaycode">public class WindowDump { public static void main(String args[]) throws Exception { ThreadGroup group = new LoggingThreadGroup("Logger"); new Thread(group, "myThread") { public void run() { System.out.println(1 / 0); } }.start(); } } </pre> </td> </tr> </tbody> </table> <br /> <p><code>LoggingThreadGroup</code> cL一个新的内容,清单 4 中显CZ它的定义。ؓ了进行说明,通过重写 <code>uncaughtException()</code> Ҏ实现的特D行为将在一个弹出窗口中昄该异常,q项操作是在Ҏ <code>Handler</code> 的帮助下使用 Java Logging API 来完成的?</p> <br /> <a name="list4"><strong>清单 4. LoggingThreadGroup 的定?/strong></a><br /> <table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="39" sizcache="2"> <tbody sizset="39" sizcache="1"> <tr> <td class="code-outline"> <pre class="displaycode">import java.util.logging.*; public class LoggingThreadGroup extends ThreadGroup { private static Logger logger; public LoggingThreadGroup(String name) { super(name); } public void uncaughtException(Thread t, Throwable e) { // Initialize logger once if (logger == null) { logger = Logger.getLogger("example"); Handler handler = LoggingWindowHandler.getInstance(); logger.addHandler(handler); } logger.log(Level.WARNING, t.getName(), e); } } </pre> </td> </tr> </tbody> </table> <br /> <p>q里创徏的定?<code>Handler</code> 的类型ؓ <code>LoggingWindowHandler</code> Q该cd的定义在清单 5 中。处理程序用了一个支持类 <code>LoggingWindow</code> Q该cd异常昄在屏q上?<a cmimpressionsent="1">清单 6</a> 中显CZ该类的定义?<code>Handler</code> ?<code>public void publish(LogRecord record)</code> Ҏ实现了一些重要操作。其余操作大部分只与配置有关?</p> <br /> <a name="list5"><strong>清单 5. LoggingWindowHandler 的定?/strong></a><br /> <table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="40" sizcache="2"> <tbody sizset="40" sizcache="1"> <tr> <td class="code-outline"> <pre class="displaycode">import java.util.logging.*; public class LoggingWindowHandler extends Handler { private static LoggingWindow window; private static LoggingWindowHandler handler; private LoggingWindowHandler() { configure(); window = new LoggingWindow("Logging window...", 400, 200); } public static synchronized LoggingWindowHandler getInstance() { if (handler == null) { handler = new LoggingWindowHandler(); } return handler; } /** * Get any configuration properties set */ private void configure() { LogManager manager = LogManager.getLogManager(); String className = getClass().getName(); String level = manager.getProperty(className + ".level"); setLevel((level == null) ? Level.INFO : Level.parse(level)); String filter = manager.getProperty(className + ".filter"); setFilter(makeFilter(filter)); String formatter = manager.getProperty(className + ".formatter"); setFormatter(makeFormatter(formatter)); } private Filter makeFilter(String name) { Filter f = null; try { Class c = Class.forName(name); f = (Filter)c.newInstance(); } catch (Exception e) { if (name != null) { System.err.println("Unable to load filter: " + name); } } return f; } private Formatter makeFormatter(String name) { Formatter f = null; try { Class c = Class.forName(name); f = (Formatter)c.newInstance(); } catch (Exception e) { f = new SimpleFormatter(); } return f; } // Overridden abstract Handler methods public void close() { } public void flush() { } /** * If record is loggable, format it and add it to window */ public void publish(LogRecord record) { String message = null; if (isLoggable(record)) { try { message = getFormatter().format(record); } catch (Exception e) { reportError(null, e, ErrorManager.FORMAT_FAILURE); return; } try { window.addLogInfo(message); } catch (Exception e) { reportError(null, e, ErrorManager.WRITE_FAILURE); } } } } </pre> </td> </tr> </tbody> </table> <br /> <br /> <br /> <br /> <a name="list6"><strong>清单 6. LoggingWindow 的定?/strong></a><br /> <table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="41" sizcache="2"> <tbody sizset="41" sizcache="1"> <tr> <td class="code-outline"> <pre class="displaycode">import java.awt.*; import javax.swing.*; public class LoggingWindow extends JFrame { private JTextArea textArea; public LoggingWindow(String title, final int width, final int height) { super(title); EventQueue.invokeLater(new Runnable() { public void run() { setSize(width, height); textArea = new JTextArea(); JScrollPane pane = new JScrollPane(textArea); textArea.setEditable(false); getContentPane().add(pane); setVisible(true); } }); } public void addLogInfo(final String data) { EventQueue.invokeLater(new Runnable() { public void run() { textArea.append(data); } }); } } </pre> </td> </tr> </tbody> </table> <br /> <p>执行 <a cmimpressionsent="1">清单 3</a> 中的 <code>WindowDump</code> E序出现图 1 中的屏幕。因为没有从 <code>Logger</code> 中删除控制台处理E序Q所以堆栈溢Z出现在控制C?</p> <br /> <a name="N10145"><strong>?1. 记录的堆栈跟t?/strong></a><br /> <img height="200" alt="记录的堆栈跟t? src="http://www.ibm.com/developerworks/cn/java/j-tiger08104/stack.jpg" width="400" /> <br /> <p>发生q行时异常时Q可能要做许多工作来更改发生的问题。该代码的大部分都是 Logging HandlerQ但是,要执行更改,必ȝ?<code>ThreadGroup</code> Q重?<code>uncaughtException()</code> Q然后在该线E组中执行您的线E。不q,让我们通过只安?<code>Thread.UncaughtExceptionHandler</code> Q来看一?Tiger 的处理方式?</p> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="42" sizcache="2"> <tbody sizset="42" sizcache="1"> <tr> <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right" sizset="43" sizcache="2"> <tbody sizset="44" sizcache="2"> <tr align="right" sizset="44" sizcache="2"> <td sizset="44" sizcache="2"><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /> <table cellspacing="0" cellpadding="0" border="0" sizset="44" sizcache="2"> <tbody sizset="44" sizcache="1"> <tr> <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br /> </td> <td valign="top" align="right"><a class="fbox" cmimpressionsent="1"><strong>回页?/strong></a></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p><a name="2.0"><span id="6666666" class="atitle">使用 UncaughtExceptionHandler 的定制行?/span></a></p> <p>对于 TigerQ?<code>Thread</code> cd义中d了一个新的公共内部类 <code>UncaughtExceptionHandler</code> Q更完整的名UCؓ <code>Thread.UncaughtExceptionHandler</code> Q其他类讉K内部cL需要用完整名Uͼ。接口的定义是一个方法,如图 7 中所C: </p> <br /> <a name="list7"><strong>清单 7. UncaughtExceptionHandler 的定?/strong></a><br /> <table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="45" sizcache="2"> <tbody sizset="45" sizcache="1"> <tr> <td class="code-outline"> <pre class="displaycode">public interface Thread.UncaughtExceptionHandler { public void uncaughtException(Thread, Throwable); } </pre> </td> </tr> </tbody> </table> <br /> <p>您可能没有注意到Q清?7 中的Ҏ与我们前面重写的 <code>ThreadGroup</code> 的方法相同。实际上Q现在由 <code>ThreadGroup</code> cd现该接口?</p> <p>新的内部cd以帮助我们了解下列两ҎҎQƈ有助于我们在 <code>Thread</code> 中用它们: </p> <ul> <li><code>getUncaughtExceptionHandler()</code> ?<code>setUncaughtExceptionHandler()</code> ? <li><code>getDefaultUncaughtExceptionHandler()</code> ?<code>setDefaultUncaughtExceptionHandler()</code> ?</li> </ul> <p>W一Ҏ法是 <code>getUncaughtExceptionHandler()</code> ?<code>setUncaughtExceptionHandler()</code> Q它们允许您为当前线E及其后代定制行为,从而允怺十或更多的线E拥有自q定制行ؓ。不q,您更可能使用W二Ҏ?<code>getDefaultUncaughtExceptionHandler()</code> ?<code>setDefaultUncaughtExceptionHandler()</code> 。如果用第二对Ҏ讄默认处理E序Q那么没有自q异常处理E序的所有线E都用默认处理程序?</p> <p>听v来好像很单。ؓ了进行说明,清单 8 转换?<a cmimpressionsent="1">清单 3</a> 中的 <code>ThreadGroup</code> 友好的程序,使用新的 <code>UncaughtExceptionHandler</code> 接口Q?</p> <br /> <a name="list8"><strong>清单 8. UncaughtExceptionHandler CZ</strong></a><br /> <table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="46" sizcache="2"> <tbody sizset="46" sizcache="1"> <tr> <td class="code-outline"> <pre class="displaycode">public class HandlerDump { public static void main(String args[]) throws Exception { Thread.UncaughtExceptionHandler handler = new LoggingThreadGroup("Logger"); Thread.currentThread().setUncaughtExceptionHandler(handler); System.out.println(1 / 0); } } </pre> </td> </tr> </tbody> </table> <br /> <p>该程序只是将 <code>LoggingThreadGroup</code> 重用?<code>UncaughtExceptionHandler</code> Qƈ没有创徏新的处理E序实现。请注意Q与原来的代码相比,C码要z得多?</p> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="47" sizcache="2"> <tbody sizset="47" sizcache="1"> <tr> <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right" sizset="48" sizcache="2"> <tbody sizset="49" sizcache="2"> <tr align="right" sizset="49" sizcache="2"> <td sizset="49" sizcache="2"><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /> <table cellspacing="0" cellpadding="0" border="0" sizset="49" sizcache="2"> <tbody sizset="49" sizcache="1"> <tr> <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br /> </td> <td valign="top" align="right"><a class="fbox" cmimpressionsent="1"><strong>回页?/strong></a></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p><a name="3.0"><span id="6616166" class="atitle">其他U程更改</span></a></p> <p><code>Thread</code> cM仅支持?Tiger d的未捕获异常处理E序Q它q支持?<code>getAllStackTraces()</code> 获得所有有效线E的堆栈跟踪Q或者支持?<code>getStackTrace()</code> 来只获得当前U程的堆栈跟t。这两种堆栈跟踪都返回类型ؓ <code>java.lang.StackTraceElement</code> 的对象, <code>java.lang.StackTraceElement</code> ?Java 1.4 q_中添加的一个类Q它可以让您生成自己的堆栈跟t。同ӞJava 5 q_新添加的功能是一个惟一U程标识W(可以使用 <code>getId()</code> 获得该标识符Q和一个新?<code>Thread.State</code> c,以及与该cȝ关的 <code>getThreadState()</code> Ҏ。最后一个线E更Ҏ一个状态枚举表Q该表是用来监视pȝ状态,而不是用来同步状态的?</p> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="50" sizcache="2"> <tbody sizset="50" sizcache="1"> <tr> <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right" sizset="51" sizcache="2"> <tbody sizset="52" sizcache="2"> <tr align="right" sizset="52" sizcache="2"> <td sizset="52" sizcache="2"><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /> <table cellspacing="0" cellpadding="0" border="0" sizset="52" sizcache="2"> <tbody sizset="52" sizcache="1"> <tr> <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br /> </td> <td valign="top" align="right"><a class="fbox" cmimpressionsent="1"><strong>回页?/strong></a></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p><a name="4.0"><span id="6116616" class="atitle">l束?/span></a></p> <p>像添加未捕获的异常处理程序这L单库更改Q可以极大地增加原代码的可理解性。虽然在U程l别上Q新的库代码的功能与原来库代码的相同Q但新模型中的易用性和灉|性远q超Z代码调整ؓ更新的方式所需的时间。当Ӟ老方法仍然可以用,但最好将代码更新为最新的库功能?/p> <img src ="http://www.tkk7.com/fhtdy2004/aggbug/290215.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-08-07 13:15 <a href="http://www.tkk7.com/fhtdy2004/archive/2009/08/07/290215.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中主U程如何捕获子线E抛出的异常http://www.tkk7.com/fhtdy2004/archive/2009/08/07/290210.htmlFrank_FangFrank_FangFri, 07 Aug 2009 04:38:00 GMThttp://www.tkk7.com/fhtdy2004/archive/2009/08/07/290210.htmlhttp://www.tkk7.com/fhtdy2004/comments/290210.htmlhttp://www.tkk7.com/fhtdy2004/archive/2009/08/07/290210.html#Feedback0http://www.tkk7.com/fhtdy2004/comments/commentRss/290210.htmlhttp://www.tkk7.com/fhtdy2004/services/trackbacks/290210.html   <<  
          public   void   run();  
  >>  
  而所有的具体U程都实现这个方法,所以这里就明确了一点,U程代码不能抛出Mchecked异常。所有的U程中的checked异常都只能被U程本n消化掉?)   q样本n也是W合U程的设计理늚Q线E本w就是被看作独立的执行片断,它应该对自己负责Q所以由它来消化所有的checked异常是很正常的? 
  q样回{了g的第一个问题:checked异常一定要在线E内部消化? 
   
  但是Q线E代码中是可以抛出错?Error)和运行别异?RuntimeException)的。ErrorZ可以忽略Q因为通常Error是应该留lvm的,而RuntimeException是比较正常的,如果在运行过E中满了某U条件导致线E必M断,可以选择使用抛出q行U别异常来处理,如下Q? 
  <<  
          public   void   run()   {  
                if   (...)   throw   new   RuntimeException();  
          }  
  >>  
  当线E代码抛行别异怹后,U程会中断?)q点java中解释得很清楚:  
  <<   @see   Thread  
  All   threads   that   are   not   daemon   threads   have   died,   either   by   returning   from   the   call   to   the   run   method   or   "by   throwing   an   exception   that   propagates   beyond   the   run   method".    
  >>  
  但是对于invoke此线E的ȝE会产生什么媄响呢Q主U程不受q个影响Q不会处理这个RuntimeExceptionQ而且Ҏ不能catch到这个异常。会l箋执行自己的代?  :)  
  所以得到结论:U程Ҏ的异常只能自己来处理? 
   
  关于最后一点,不相信的话大家可以做q么一个试验:  
  <<  
  public   class   TestThreadException   extends   Thread   {  
          public   void   run()   {  
                  throw   new   RuntimeException();  
          }  
   
          public   static   void   main(String[]   args)   throws   InterruptedException   {  
                  try   {  
                          new   TestThreadException().start();  
                  }   catch(RuntimeException   ex)   {  
                          //   看看能不能到达这里?   :)  
                  }  
                   
                  Thread.sleep(1000);  
                  //   看看能不能到达这里?   :)  
          }  
  }  
  >>  


C得在哪里看到的代码,可以处理到线E中抛出的RuntimeExceptionQ? 
   
  public   class   ApplicationLoader   extends   ThreadGroup  
  {  
          private   ApplicationLoader()  
          {  
   
                  super("ApplicationLoader");  
   
          }  
   
          public   static   void   main(String[]   args)  
          {  
   
                  Runnable   appStarter   =   new   Runnable()  
                  {  
   
                          public   void   run()  
                          {  
                                  //invoke   your   application   (i.e.MySystem.main(args)  
   
                                  throw   new   NullPointerException();   //example,   throw   a   runtime   exception  
                          }  
                  };  
   
                  new   Thread(new   ApplicationLoader(),   appStarter).start();  
          }  
   
          //We   overload   this   method   from   our   parent  
          //ThreadGroup   ,   which   will   make   sure   that   it  
          //gets   called   when   it   needs   to   be.     This   is    
          //where   the   magic   occurs.  
          public   void   uncaughtException(Thread   thread,   Throwable   exception)  
          {  
                  //Handle   the   error/exception.  
                  //Typical   operations   might   be   displaying   a  
                  //useful   dialog,   writing   to   an   event   log,   etc.  
   
                  exception.printStackTrace();//example,   print   stack   trace  
          }  
  }  


呵呵QuncaughtException好像是唯一能够处理U程抛出的uncaught异常的入口。看来还是有l心人啊。确实如此,通过ThreadGroup的uncaughtExceptionҎq是有处理的Z。当U程抛出uncaughtException的时候,JVM会调用ThreadGroup的此Ҏ。默认的处理如下Q? 
  <<  
          public   void   uncaughtException(Thread   t,   Throwable   e)   {  
  if   (parent   !=   null)   {  
          parent.uncaughtException(t,   e);  
  }   else   if   (!(e   instanceof   ThreadDeath))   {  
          e.printStackTrace(System.err);  
  }  
          }  
  >>  
  每个Thread都会有一个ThreadGroup对象Q可以通过Thread.getThreadGroup()Ҏ得到Q提供了上述默认的uncaught异常处理Ҏ? 
  上面没有提这点,因ؓ为在正常的情况下Q这个方法的处理情况已l够了。还是那个线E设计的理念Q?#8220;U程的问题应该线E自己本w来解决Q而不要委托到外部?#8221;通常情况下,外部不需要处理线E的异常。当然也有例外?)  

Frank_Fang 2009-08-07 12:38 发表评论
]]>
【{】Java1.5泛型指南中文?Java1.5 Generic Tutorial) http://www.tkk7.com/fhtdy2004/archive/2009/07/27/288633.htmlFrank_FangFrank_FangMon, 27 Jul 2009 12:50:00 GMThttp://www.tkk7.com/fhtdy2004/archive/2009/07/27/288633.htmlhttp://www.tkk7.com/fhtdy2004/comments/288633.htmlhttp://www.tkk7.com/fhtdy2004/archive/2009/07/27/288633.html#Feedback0http://www.tkk7.com/fhtdy2004/comments/commentRss/288633.htmlhttp://www.tkk7.com/fhtdy2004/services/trackbacks/288633.html阅读全文

Frank_Fang 2009-07-27 20:50 发表评论
]]>
Java集合cdl?/title><link>http://www.tkk7.com/fhtdy2004/archive/2009/07/16/286932.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Wed, 15 Jul 2009 16:01:00 GMT</pubDate><guid>http://www.tkk7.com/fhtdy2004/archive/2009/07/16/286932.html</guid><wfw:comment>http://www.tkk7.com/fhtdy2004/comments/286932.html</wfw:comment><comments>http://www.tkk7.com/fhtdy2004/archive/2009/07/16/286932.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/fhtdy2004/comments/commentRss/286932.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/fhtdy2004/services/trackbacks/286932.html</trackback:ping><description><![CDATA[Java集合cdl? <img src ="http://www.tkk7.com/fhtdy2004/aggbug/286932.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-07-16 00:01 <a href="http://www.tkk7.com/fhtdy2004/archive/2009/07/16/286932.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java反射机制学习结http://www.tkk7.com/fhtdy2004/archive/2009/07/09/286024.htmlFrank_FangFrank_FangThu, 09 Jul 2009 02:08:00 GMThttp://www.tkk7.com/fhtdy2004/archive/2009/07/09/286024.htmlhttp://www.tkk7.com/fhtdy2004/comments/286024.htmlhttp://www.tkk7.com/fhtdy2004/archive/2009/07/09/286024.html#Feedback0http://www.tkk7.com/fhtdy2004/comments/commentRss/286024.htmlhttp://www.tkk7.com/fhtdy2004/services/trackbacks/286024.html先留着



Frank_Fang 2009-07-09 10:08 发表评论
]]>
Java Hashtable分析http://www.tkk7.com/fhtdy2004/archive/2009/07/03/285330.htmlFrank_FangFrank_FangFri, 03 Jul 2009 05:24:00 GMThttp://www.tkk7.com/fhtdy2004/archive/2009/07/03/285330.htmlhttp://www.tkk7.com/fhtdy2004/comments/285330.htmlhttp://www.tkk7.com/fhtdy2004/archive/2009/07/03/285330.html#Feedback1http://www.tkk7.com/fhtdy2004/comments/commentRss/285330.htmlhttp://www.tkk7.com/fhtdy2004/services/trackbacks/285330.html阅读全文

Frank_Fang 2009-07-03 13:24 发表评论
]]>
Java 内存模型?volatile关键字语?/title><link>http://www.tkk7.com/fhtdy2004/archive/2009/06/28/284435.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Sat, 27 Jun 2009 16:50:00 GMT</pubDate><guid>http://www.tkk7.com/fhtdy2004/archive/2009/06/28/284435.html</guid><wfw:comment>http://www.tkk7.com/fhtdy2004/comments/284435.html</wfw:comment><comments>http://www.tkk7.com/fhtdy2004/archive/2009/06/28/284435.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.tkk7.com/fhtdy2004/comments/commentRss/284435.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/fhtdy2004/services/trackbacks/284435.html</trackback:ping><description><![CDATA[<p>http://www.javaeye.com/topic/109150<br /> <br /> http://itchaser.javaeye.com/blog/440335<br /> <br /> http://www.javaeye.com/topic/11315<br /> <br /> <br /> q得了解一下Java内存模型。。?br /> <br /> 看了一下Java虚拟范,比较清楚了<br /> <br /> </p> <img src ="http://www.tkk7.com/fhtdy2004/aggbug/284435.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-06-28 00:50 <a href="http://www.tkk7.com/fhtdy2004/archive/2009/06/28/284435.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]J2EE目异常处理http://www.tkk7.com/fhtdy2004/archive/2009/06/24/283881.htmlFrank_FangFrank_FangWed, 24 Jun 2009 02:29:00 GMThttp://www.tkk7.com/fhtdy2004/archive/2009/06/24/283881.htmlhttp://www.tkk7.com/fhtdy2004/comments/283881.htmlhttp://www.tkk7.com/fhtdy2004/archive/2009/06/24/283881.html#Feedback4http://www.tkk7.com/fhtdy2004/comments/commentRss/283881.htmlhttp://www.tkk7.com/fhtdy2004/services/trackbacks/283881.html阅读全文

Frank_Fang 2009-06-24 10:29 发表评论
]]>
Java transient关键?/title><link>http://www.tkk7.com/fhtdy2004/archive/2009/06/20/286112.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Sat, 20 Jun 2009 10:23:00 GMT</pubDate><guid>http://www.tkk7.com/fhtdy2004/archive/2009/06/20/286112.html</guid><wfw:comment>http://www.tkk7.com/fhtdy2004/comments/286112.html</wfw:comment><comments>http://www.tkk7.com/fhtdy2004/archive/2009/06/20/286112.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.tkk7.com/fhtdy2004/comments/commentRss/286112.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/fhtdy2004/services/trackbacks/286112.html</trackback:ping><description><![CDATA[<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">Volatile修饰的成员变量在每次被线E访问时Q都从主内存中重读该成员变量的倹{而且Q当成员变量发生变化ӞU程变化值回写到d存。这样在M时刻Q两个不同的U程L看到某个成员变量的同一个倹{?nbsp;  <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />  <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />Java语言规范中指出:Z获得最佳速度Q允许线E保存共享成员变量的U有拯Q而且只当U程q入或者离开同步代码块时才与׃n成员变量的原始值对比?nbsp;  <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />  <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />q样当多个线E同时与某个对象交互Ӟ必要注意到要让线E及时的得到׃n成员变量的变化?nbsp;  <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />  <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />而volatile关键字就是提CVMQ对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互?nbsp;  <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />  <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />使用Q在两个或者更多的U程讉K的成员变量上使用volatile。当要访问的变量已在synchronized代码块中Q或者ؓ帔RӞ不必使用?nbsp;  <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />  <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />׃使用volatile屏蔽掉了VM中必要的代码优化Q所以在效率上比较低Q因此一定在必要时才使用此关键字?nbsp;  <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />  <br /> <strong><span style="color: red"><strong><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />java关键字Transient</strong>   </span></strong><br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />  <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />转自http:</span><span style="color: #008000">//</span><span style="color: #008000">horst.sun.blog.163.com/blog/static/348849612007614494492/   </span><span style="color: #008000"><br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">  <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />译自http:</span><span style="color: #008000">//</span><span style="color: #008000">www.devx.com/tips/Tip/13726?nbsp;  </span><span style="color: #008000"><br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">  <br /> <span style="color: red"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />Java的serialization提供了一U持久化对象实例的机制。当持久化对象时Q可能有一个特D的对象数据成员Q我们不?nbsp;  <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />用serialization机制来保存它。ؓ了在一个特定对象的一个域上关闭serializationQ可以在q个域前加上关键字transient?nbsp;  <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />transient是Java语言的关键字Q用来表CZ个域不是该对象串行化的一部分。当一个对象被串行化的时候,transient型变量的g包括在串行化的表CZQ然而非transient型的变量是被包括q去的?nbsp; <br /> </span><span style="color: red"><strong style="color: red"><span style="color: #000000"><strong>注意static变量也是可以串行化的 </strong><br /> </span></strong></span><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />  <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />首先Q让我们看一些Java serialization的代码:   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> LoggingInfo </span><span style="color: #0000ff">implements</span><span style="color: #000000"> java.io.Serializable   <br /> <img id="Codehighlighter1_929_1579_Open_Image" onclick="this.style.display='none'; Codehighlighter1_929_1579_Open_Text.style.display='none'; Codehighlighter1_929_1579_Closed_Image.style.display='inline'; Codehighlighter1_929_1579_Closed_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_929_1579_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_929_1579_Closed_Text.style.display='none'; Codehighlighter1_929_1579_Open_Image.style.display='inline'; Codehighlighter1_929_1579_Open_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_929_1579_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.tkk7.com/Images/dot.gif" /></span><span id="Codehighlighter1_929_1579_Open_Text"><span style="color: #000000">{   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="color: #0000ff">private</span><span style="color: #000000"> Date loggingDate </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> Date();   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="color: #0000ff">private</span><span style="color: #000000"> String uid;   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">transient</span><span style="color: #000000"> String pwd;   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />      <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    LoggingInfo(String user, String password)   <br /> <img id="Codehighlighter1_1104_1163_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1104_1163_Open_Text.style.display='none'; Codehighlighter1_1104_1163_Closed_Image.style.display='inline'; Codehighlighter1_1104_1163_Closed_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1104_1163_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1104_1163_Closed_Text.style.display='none'; Codehighlighter1_1104_1163_Open_Image.style.display='inline'; Codehighlighter1_1104_1163_Open_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_1104_1163_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.tkk7.com/Images/dot.gif" /></span><span id="Codehighlighter1_1104_1163_Open_Text"><span style="color: #000000">{   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        uid </span><span style="color: #000000">=</span><span style="color: #000000"> user;   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        pwd </span><span style="color: #000000">=</span><span style="color: #000000"> password;   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="color: #000000">   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="color: #0000ff">public</span><span style="color: #000000"> String toString()   <br /> <img id="Codehighlighter1_1204_1574_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1204_1574_Open_Text.style.display='none'; Codehighlighter1_1204_1574_Closed_Image.style.display='inline'; Codehighlighter1_1204_1574_Closed_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1204_1574_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1204_1574_Closed_Text.style.display='none'; Codehighlighter1_1204_1574_Open_Image.style.display='inline'; Codehighlighter1_1204_1574_Open_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_1204_1574_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.tkk7.com/Images/dot.gif" /></span><span id="Codehighlighter1_1204_1574_Open_Text"><span style="color: #000000">{   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        String password</span><span style="color: #000000">=</span><span style="color: #0000ff">null</span><span style="color: #000000">;   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="color: #0000ff">if</span><span style="color: #000000">(pwd </span><span style="color: #000000">==</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">)   <br /> <img id="Codehighlighter1_1277_1323_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1277_1323_Open_Text.style.display='none'; Codehighlighter1_1277_1323_Closed_Image.style.display='inline'; Codehighlighter1_1277_1323_Closed_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1277_1323_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1277_1323_Closed_Text.style.display='none'; Codehighlighter1_1277_1323_Open_Image.style.display='inline'; Codehighlighter1_1277_1323_Open_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_1277_1323_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.tkk7.com/Images/dot.gif" /></span><span id="Codehighlighter1_1277_1323_Open_Text"><span style="color: #000000">{   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        password </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">NOT SET</span><span style="color: #000000">"</span><span style="color: #000000">;   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="color: #000000">   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="color: #0000ff">else</span><span style="color: #000000">  <br /> <img id="Codehighlighter1_1351_1395_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1351_1395_Open_Text.style.display='none'; Codehighlighter1_1351_1395_Closed_Image.style.display='inline'; Codehighlighter1_1351_1395_Closed_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1351_1395_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1351_1395_Closed_Text.style.display='none'; Codehighlighter1_1351_1395_Open_Image.style.display='inline'; Codehighlighter1_1351_1395_Open_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_1351_1395_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.tkk7.com/Images/dot.gif" /></span><span id="Codehighlighter1_1351_1395_Open_Text"><span style="color: #000000">{   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />            password </span><span style="color: #000000">=</span><span style="color: #000000"> pwd;   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="color: #000000">   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">logon info: \n   </span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">user: </span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> uid </span><span style="color: #000000">+</span><span style="color: #000000">   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="color: #000000">"</span><span style="color: #000000">\n   logging date : </span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> loggingDate.toString() </span><span style="color: #000000">+</span><span style="color: #000000">   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="color: #000000">"</span><span style="color: #000000">\n   password: </span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> password;   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="color: #000000">   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />  <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />现在我们创徏一个这个类的实例,q且串行?serialize)?nbsp;,然后这个串行化对象写如盘?nbsp;  <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />  <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />LoggingInfo logInfo </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> LoggingInfo(</span><span style="color: #000000">"</span><span style="color: #000000">MIKE</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #000000">"</span><span style="color: #000000">MECHANICS</span><span style="color: #000000">"</span><span style="color: #000000">);   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />System.out.println(logInfo.toString());   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">try</span><span style="color: #000000">  <br /> <img id="Codehighlighter1_1755_1917_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1755_1917_Open_Text.style.display='none'; Codehighlighter1_1755_1917_Closed_Image.style.display='inline'; Codehighlighter1_1755_1917_Closed_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_1755_1917_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1755_1917_Closed_Text.style.display='none'; Codehighlighter1_1755_1917_Open_Image.style.display='inline'; Codehighlighter1_1755_1917_Open_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_1755_1917_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.tkk7.com/Images/dot.gif" /></span><span id="Codehighlighter1_1755_1917_Open_Text"><span style="color: #000000">{   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />   ObjectOutputStream o </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> ObjectOutputStream(   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />                </span><span style="color: #0000ff">new</span><span style="color: #000000"> FileOutputStream(</span><span style="color: #000000">"</span><span style="color: #000000">logInfo.out</span><span style="color: #000000">"</span><span style="color: #000000">));   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />   o.writeObject(logInfo);   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />   o.close();   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">   <br /> <img id="Codehighlighter1_1941_3009_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1941_3009_Open_Text.style.display='none'; Codehighlighter1_1941_3009_Closed_Image.style.display='inline'; Codehighlighter1_1941_3009_Closed_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_1941_3009_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1941_3009_Closed_Text.style.display='none'; Codehighlighter1_1941_3009_Open_Image.style.display='inline'; Codehighlighter1_1941_3009_Open_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception e) </span><span id="Codehighlighter1_1941_3009_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.tkk7.com/Images/dot.gif" /></span><span id="Codehighlighter1_1941_3009_Open_Text"><span style="color: #000000">{</span><span style="color: #008000">//</span><span style="color: #008000">deal with exception}   </span><span style="color: #008000"><br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">  <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />To read the object back, we can write   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />  <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">try</span><span style="color: #000000">  <br /> <img id="Codehighlighter1_2021_2237_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2021_2237_Open_Text.style.display='none'; Codehighlighter1_2021_2237_Closed_Image.style.display='inline'; Codehighlighter1_2021_2237_Closed_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_2021_2237_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2021_2237_Closed_Text.style.display='none'; Codehighlighter1_2021_2237_Open_Image.style.display='inline'; Codehighlighter1_2021_2237_Open_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span id="Codehighlighter1_2021_2237_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.tkk7.com/Images/dot.gif" /></span><span id="Codehighlighter1_2021_2237_Open_Text"><span style="color: #000000">{   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />   ObjectInputStream in </span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000"> ObjectInputStream(   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />                </span><span style="color: #0000ff">new</span><span style="color: #000000"> FileInputStream(</span><span style="color: #000000">"</span><span style="color: #000000">logInfo.out</span><span style="color: #000000">"</span><span style="color: #000000">));   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />   LoggingInfo logInfo </span><span style="color: #000000">=</span><span style="color: #000000"> (LoggingInfo)in.readObject();   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />   System.out.println(logInfo.toString());   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">   <br /> <img id="Codehighlighter1_2261_3009_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2261_3009_Open_Text.style.display='none'; Codehighlighter1_2261_3009_Closed_Image.style.display='inline'; Codehighlighter1_2261_3009_Closed_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_2261_3009_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2261_3009_Closed_Text.style.display='none'; Codehighlighter1_2261_3009_Open_Image.style.display='inline'; Codehighlighter1_2261_3009_Open_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception e) </span><span id="Codehighlighter1_2261_3009_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.tkk7.com/Images/dot.gif" /></span><span id="Codehighlighter1_2261_3009_Open_Text"><span style="color: #000000">{</span><span style="color: #008000">//</span><span style="color: #008000">deal with exception}   </span><span style="color: #008000"><br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">  <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />如果我们q行q段代码Q我们会注意C盘中读?read——back (de</span><span style="color: #000000">-</span><span style="color: #000000">serializing))的对象打印password?/span><span style="color: #000000">"</span><span style="color: #000000">NOT SET</span><span style="color: #000000">"</span><span style="color: #000000">。这是当我们定义pwd域ؓtransientӞ所期望的正结果?nbsp;  <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />现在Q让我们来看一下粗心对待transient域可能引L潜在问题。假设我们修改了cd义,提供ltransient域一个默认|   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />代码如下Q?nbsp;  <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />  <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> GuestLoggingInfo </span><span style="color: #0000ff">implements</span><span style="color: #000000"> java.io.Serializable   <br /> <img id="Codehighlighter1_2548_2844_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2548_2844_Open_Text.style.display='none'; Codehighlighter1_2548_2844_Closed_Image.style.display='inline'; Codehighlighter1_2548_2844_Closed_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_2548_2844_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2548_2844_Closed_Text.style.display='none'; Codehighlighter1_2548_2844_Open_Image.style.display='inline'; Codehighlighter1_2548_2844_Open_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span id="Codehighlighter1_2548_2844_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.tkk7.com/Images/dot.gif" /></span><span id="Codehighlighter1_2548_2844_Open_Text"><span style="color: #000000">{   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="color: #0000ff">private</span><span style="color: #000000"> Date loggingDate </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> Date();   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="color: #0000ff">private</span><span style="color: #000000"> String uid;   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">transient</span><span style="color: #000000"> String pwd;   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />      <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    GuestLoggingInfo()   <br /> <img id="Codehighlighter1_2700_2761_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2700_2761_Open_Text.style.display='none'; Codehighlighter1_2700_2761_Closed_Image.style.display='inline'; Codehighlighter1_2700_2761_Closed_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_2700_2761_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2700_2761_Closed_Text.style.display='none'; Codehighlighter1_2700_2761_Open_Image.style.display='inline'; Codehighlighter1_2700_2761_Open_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_2700_2761_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.tkk7.com/Images/dot.gif" /></span><span id="Codehighlighter1_2700_2761_Open_Text"><span style="color: #000000">{   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        uid </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">guest</span><span style="color: #000000">"</span><span style="color: #000000">;   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        pwd </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">guest</span><span style="color: #000000">"</span><span style="color: #000000">;   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="color: #000000">   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="color: #0000ff">public</span><span style="color: #000000"> String toString()   <br /> <img id="Codehighlighter1_2802_2839_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2802_2839_Open_Text.style.display='none'; Codehighlighter1_2802_2839_Closed_Image.style.display='inline'; Codehighlighter1_2802_2839_Closed_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_2802_2839_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2802_2839_Closed_Text.style.display='none'; Codehighlighter1_2802_2839_Open_Image.style.display='inline'; Codehighlighter1_2802_2839_Open_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_2802_2839_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.tkk7.com/Images/dot.gif" /></span><span id="Codehighlighter1_2802_2839_Open_Text"><span style="color: #000000">{   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="color: #008000">//</span><span style="color: #008000">same as above   </span><span style="color: #008000"><br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000">     }</span></span><span style="color: #000000">   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /><strong>现在Q如果我们穿行化GuestLoggingInfo的一个实例,它写入盘Qƈ且再它从磁盘中dQ我们仍然看到读回的对象打印password ?nbsp;</strong></span><strong><span style="color: #000000">"</span><span style="color: #000000">NOT SET</span><span style="color: #000000">"</span></strong><span style="color: #000000"><strong>。当从磁盘中d某个cȝ实例Ӟ实际上ƈ不会执行q个cȝ构造函敎ͼ   <br /> <img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />而是载入了一个该cd象的持久化状态,q将q个状态赋值给该类的另一个对象?nbsp; <br /> </strong><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span></div> </span></span> <img src ="http://www.tkk7.com/fhtdy2004/aggbug/286112.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-06-20 18:23 <a href="http://www.tkk7.com/fhtdy2004/archive/2009/06/20/286112.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Serializable结http://www.tkk7.com/fhtdy2004/archive/2009/06/20/286933.htmlFrank_FangFrank_FangSat, 20 Jun 2009 10:00:00 GMThttp://www.tkk7.com/fhtdy2004/archive/2009/06/20/286933.htmlhttp://www.tkk7.com/fhtdy2004/comments/286933.htmlhttp://www.tkk7.com/fhtdy2004/archive/2009/06/20/286933.html#Feedback0http://www.tkk7.com/fhtdy2004/comments/commentRss/286933.htmlhttp://www.tkk7.com/fhtdy2004/services/trackbacks/286933.html

Frank_Fang 2009-06-20 18:00 发表评论
]]>
java.io.Serializable与java.io.Externalizable的比?/title><link>http://www.tkk7.com/fhtdy2004/archive/2009/06/20/283372.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Sat, 20 Jun 2009 09:43:00 GMT</pubDate><guid>http://www.tkk7.com/fhtdy2004/archive/2009/06/20/283372.html</guid><wfw:comment>http://www.tkk7.com/fhtdy2004/comments/283372.html</wfw:comment><comments>http://www.tkk7.com/fhtdy2004/archive/2009/06/20/283372.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.tkk7.com/fhtdy2004/comments/commentRss/283372.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/fhtdy2004/services/trackbacks/283372.html</trackback:ping><description><![CDATA[     摘要:       当两个进E在q行q程通信Ӟ无论是何U类型的数据Q都会以二进制序列的形式在网l上传送。发送方需要把q个Java对象转换为字节序列,才能在网l上传送,UCؓ对象的序列化Q接收方则需要把字节序列再恢复ؓJava对象Q称为对象的反序列化?只有实现了Serializable和Externalizable接口的类的对象才能被序列化,而Extern...  <a href='http://www.tkk7.com/fhtdy2004/archive/2009/06/20/283372.html'>阅读全文</a><img src ="http://www.tkk7.com/fhtdy2004/aggbug/283372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-06-20 17:43 <a href="http://www.tkk7.com/fhtdy2004/archive/2009/06/20/283372.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【{】避免在Java中用Checked Exceptionhttp://www.tkk7.com/fhtdy2004/archive/2009/06/20/283358.htmlFrank_FangFrank_FangSat, 20 Jun 2009 07:49:00 GMThttp://www.tkk7.com/fhtdy2004/archive/2009/06/20/283358.htmlhttp://www.tkk7.com/fhtdy2004/comments/283358.htmlhttp://www.tkk7.com/fhtdy2004/archive/2009/06/20/283358.html#Feedback0http://www.tkk7.com/fhtdy2004/comments/commentRss/283358.htmlhttp://www.tkk7.com/fhtdy2004/services/trackbacks/283358.html

Java 提供了两UException 的模式,一U是执行的时候所产生的Exception (Runtime Exception)Q另外一U则是受控制的Exception (Checked Exception)?/span>

所有的Checked Exception 均从java.lang.Exception l承而来Q而Runtime Exception 则承java.lang.RuntimeException 或java.lang.Error (实际上java.lang.RuntimeException 的上一层也是java.lang.ExceptionQ这说明作ؓexception两者ƈ没有本质的区别,只是java语言本n从功能考虑有所区分Q这才导致下面提到的不同??/span>

一个函数如果会抛出Checked Exception Q(q里包含两种情况Q一个是函数本n抛出Q另外一U是它调用的函数会抛出Checked Exception 但是它ƈ没有去catchq个exceptionQ,那在声明此函数的时候必L明throws XXXException()。而Runtime Exception不需要如此声明?/span>

逻辑上看QRuntime Exception 与Checked Exception 使用目的不一栗一般而言QChecked Exception 表示q个Exception 必须要被处理Q也是说程序设计者应该已l知道可能会收到某个Exception(因ؓ要try catch? Q所以程序设计者应该能也必(或者标明throws XXXException()l箋抛出去,或者try catch处理Q不然是~译不过的)针对q些不同的Checked Exception 做出不同的处理。而Runtime Exception 通常会暗C着E序上的错误Q这U错误会DE序设计者无法处理,而造成E序无法l箋执行下去Q可以try catch处理而避免程序挂掉,但是q常怼掩盖问题所在)?/span>


checked exception׃必须被处理,会给E序员带来额外的ȝQ试想一个函数aQ它会调用到b1Qb2...Qb9一?个函敎ͼq些函数每个都会抛出checked exceptionQ而a函数里面又没有办法处理这些exceptionQ那在声明a函数的时候就必须q写9个throw xxxExceptionQ够累的Q!然而这仅仅是问题的一个方面,所以下面这文章试图说服我们尽量用runtime exception替代checked exception(前面提到可以try catch处理runtime exceptionQ而避免程序挂掉,q也是这样做的一个前??/span>

q篇文章指出了Java中checked Exception的一些缺点,提出应该在程序设计中避免使用checked Exception,对于需要处理checked Exception的代码,可以使用ExceptionAdapterq个cdchecked Exceptionq行包装。这文章的概念和ExceptionAdapterq个cd源自Bruce Eckel的Does Java need Checked Exception?br />

Java
?font face="Arial">Exception
分ؓ两类Q一cLRuntimeException及其子类Q另外一cd?font face="Arial">checked Exception?font face="Arial">Java要求函数Ҏ有被catch处理掉的checked ExceptionQ需要将其写在函数的声明部分。然而,q一要求常常l程序员带来一些不必要的负担?/font>

Z避免在函数声明中?font face="Arial">throws部分Q在Java目里面常常可以看到以下代码用来‘吞掉’ExceptionQ?br />

 try {
  
// 
 }
 catch (Exception ex) {
           ex.printStackTrace();
  }


q显然不是一个好的处?font face="Arial">Exception办法Q事实上Q?font face="Arial">catchq处理一?font face="Arial">Exception意味着让程序从发生的错?font face="Arial">(Exception)中恢复过来。从q种意义上说Q已上的代码只可能在一些很单的情况下工作而不带来问题?/font>

对于很多ExceptionQ往往没有d理它q让E序从错误中恢复出来的办法,q时唯一能做的事情可能就是在界面上显CZ些提CZ息给用户。这U情况下让程序抛出遇到的Exception是更为合理的做法。然而,q样做会使得一些函数的声明急剧膨胀。一个函数可能需要声明会抛出?font face="Arial">7?font face="Arial">8?font face="Arial">checked ExceptionQ而且每个调用它的函数也需要同L声明?/font>

比这更糟p的是,q有可能破坏c设计的open-close原则。简单来_open-close原则是指当扩展一个模块的时候,可以不媄响其现有?font face="Arial">client?font face="Arial">open-close原则是通过l承来实现的Q当l承一个类的时候,我们既扩展了q个c,也不会媄响原有的clientQ因为对q个cL有改动)?/font>

现在考虑下面q种情况Q有一个父c?font face="Arial">BaseQ?/font>

 

public class Base {
    
public void foo() throws ExceptionA {
       
// 
    }

}

 

 

现在需要?font face="Arial">Baseq个cdƈ重蝲fooq个ҎQ在新的实现中,foo可能抛出ExceptionBQ?br />

public class Extend extends Base {
    
public void foo() throws ExceptionB {
       
// 
    }

}

 


然而,q样写在Java里面是不合法的,Java不会抛出?font face="Arial">Exception看作函数特征的一部分Q但子类声明抛出?font face="Arial">Exception必须是父cȝ子集?br /> 可以?font face="Arial">BasefooҎ中加入抛?font face="Arial">ExceptionB的声明,然而,q样q坏了open-close原则。而且Q有时我们没有办法去修改父类Q比如当重蝲一?font face="Arial">Jdk里的cȝ时候?/font>

另一个可能的做法是在Extend?font face="Arial">fooҎ?font face="Arial">catch?font face="Arial">ExceptionBQ然后构造一?font face="Arial">ExceptionAq抛出。这是个可行的办法但也只是一个权宜之计?/font>

如果使用RuntimeExceptionQ这些问题都不会存在。这说明checked Exceptionq不是一个很实用的概念,也意味着在程序设计的时候,我们应该让自qExceptioncȝ?font face="Arial">RuntimeException而不?font face="Arial">Exception。(q和JDK的徏议正好相反,但实践证明这样做代码的质量更好。)

对于那些需要处?font face="Arial">checked Exception的代码,可以利用一?font face="Arial">ExceptionAdapter的类?font face="Arial">checked Exception包装成一?font face="Arial">RuntimeException抛出?font face="Arial">ExceptionAdapter来自Bruce Eckel?font face="Arial">Does Java need Checked Exceptionq篇文章Q?br />

public class ExceptionAdapter extends RuntimeException {

    
public ExceptionAdapter(Exception ex) {

       
super(ex);

    }


    
public void printStackTrace(java.io.PrintStream s) 

       getCause().printStackTrace(s); 

    }


    
public void printStackTrace(java.io.PrintWriter s) 
       getCause().printStackTrace(s);

    }


    
// rethrow()的作用是把被包装的Exception再次抛出?/span>

    
public void rethrow() 
       
throws Exception
    
{
       
throw (Exception) getCause();
    }

}




Frank_Fang 2009-06-20 15:49 发表评论
]]>
Java Exception结(?http://www.tkk7.com/fhtdy2004/archive/2009/06/18/286768.htmlFrank_FangFrank_FangThu, 18 Jun 2009 15:40:00 GMThttp://www.tkk7.com/fhtdy2004/archive/2009/06/18/286768.htmlhttp://www.tkk7.com/fhtdy2004/comments/286768.htmlhttp://www.tkk7.com/fhtdy2004/archive/2009/06/18/286768.html#Feedback0http://www.tkk7.com/fhtdy2004/comments/commentRss/286768.htmlhttp://www.tkk7.com/fhtdy2004/services/trackbacks/286768.html阅读全文

Frank_Fang 2009-06-18 23:40 发表评论
]]>
Java Exception结http://www.tkk7.com/fhtdy2004/archive/2009/06/18/283133.htmlFrank_FangFrank_FangThu, 18 Jun 2009 15:36:00 GMThttp://www.tkk7.com/fhtdy2004/archive/2009/06/18/283133.htmlhttp://www.tkk7.com/fhtdy2004/comments/283133.htmlhttp://www.tkk7.com/fhtdy2004/archive/2009/06/18/283133.html#Feedback1http://www.tkk7.com/fhtdy2004/comments/commentRss/283133.htmlhttp://www.tkk7.com/fhtdy2004/services/trackbacks/283133.html唉,今天ibm面试看来是被鄙视了,问及异常不知道是要问CheckedException和UncheckedException
thinking in java看的早忘了?br /> 看了好几帖子,q是理解不够深刻
http://www.javaeye.com/topic/2038       主题Qؓ什?Java 中要使用 Checked Exceptions
http://www.javaeye.com/topic/14082     主题Q我对Checked Exceptions的看?(lؓ什么java引入Checked Ex...
http://www.javaeye.com/topic/10482     主题Q我对Checked Exception观点的变?/a>
http://www.javaeye.com/topic/72170     主题QJ2EE目异常处理
http://www.ibm.com/developerworks/cn/java/j-jtp05254/index.html

http://www.onjava.com/pub/a/onjava/2006/01/11/exception-handling-framework-for-j2ee.html?page=6&x-order=date



http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html?page=2

本文是Exception处理的一不错的文章Q从Java Exception的概念介lvQ依ơ讲解了Exception的类型(Checked/UncheckedQ,Exception处理的最佛_玎ͼ
1Q?选择Checkedq是Unchecked的几个经怾?br /> 2Q?Exception的封装问?br /> 3Q?如无必要不要创徏自己的Exception
4Q?不要用Exception来作程控制
5Q?不要L的忽略捕LException
6Q?不要单地捕获层的Exception
原文地址Q?br /> http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html


关于异常处理的一个问题就是要对何ӞwhenQ和如何QhowQ用它们做C然于心。在本文中我介l一些关于异常处理的最佛_践,同时我也会涉及到最q争论十分激烈的checked Exception的用问题?br />
作ؓ开发员Q我们都希望能写决问题ƈ且是高质量的代码。不q的是,一些副作用Qside effectsQ伴随着异常在我们的代码中慢慢滋生。无庸置疑,没有人喜Ƣ副作用Qside effectsQ?所以我们很快就用我们自q方式来避免它Q我曄看到一些聪明的E序员用下面的方式来处理异常Q?br />
public void consumeAndForgetAllExceptions(){
try {
...some code that throws exceptions
} catch (Exception ex){
ex.printStacktrace();
}
}

上边的代码有什么问题么Q?br />
在回{以前让我们x怎样才是正确的?是的Q一旦程序碰到异常,它就该挂L序??点什么。那么上边的代码是这样子的么Q看吧,它隐瞒了什么?它把所有的"苦水"往肚里咽(在控制台打印出异怿息)Q然后一切l,从表面上看就像什么都没有发生q一?.....Q很昄Q上边代码达到的效果q不是我们所期望的?br />
后来又怎样Q?br />
public void someMethod() throws Exception{
}

上边的代码又有什么问题?

很明显,上边的方法体是空的,它不实现M的功能(没有一句代码)Q试问一个空Ҏ体能抛出什么异常?当然Javaq不L你这么干。最q,我也遇到cM的情景,Ҏ声明会抛出异常,但是代码中ƈ没有M"Z"?展示"异常。当我问开发员Z么要q样做的时候,他回{我?我知道,它确实有炚w个,但我以前是q么q的q且它确实能为我工作?

在C++C֌曄׃数年实践来实践如何用异常,关于此类的争论在 javaC֌才刚刚开始。我曄看到许多JavaE序员针对用异常的问题q行争论。如果对于异常处理不当的话,异常可以大大减慢应用E序的执行速度Q因为它消耗内存和CPU来创建、抛出ƈ捕获异常。如果过分的依赖异常处理Q代码对易读和易使用q两斚w产生影响Q以至于会让我们写出上边两处"p糕"代码?br />
异常原理

大体上说Q有三种不同?情景"会导致异常的抛出Q?br />
l ~程错误D异常QException due Programming errorsQ? q种情景下,异常往往处于~程错误Q如QNullPointerException 或?IllegalArgumentExceptionQ?q时异常一旦抛出,客户端将变得无能为力?br />
l 客户端代码错误导致异常(Exception due client code errorsQ? 说白点就是客L试图调用API不允许的操作?br />
l 资源p|D异常QException due to resource failuresQ? 如内存不x|络q接p|D出现异常{。这些异常的出现客户端可以采取相应的措施来恢复应用程序的l箋q行?br />
Java中异常的cd

Java 中定义了两类异常Q?br />
l Checked exception: q类异常都是Exception的子c?br />
l Unchecked exception: q类异常都是RuntimeException的子c,虽然RuntimeException同样也是Exception的子c,但是它们是特D的Q它们不能通过client code来试图解冻I所以称为Unchecked exception

举个例子Q下图ؓNullPointerException的承关p:


图中QNullPointerExceptionl承自RuntimeExceptionQ所以它是Unchecked exception.

以往我都是应用checked exception多于Unchecked exceptionQ最q,在javaC֌Ȁ起了一场关于checked exception和用它们的价值的争论。这Zv源于JAVA是第一个拥有Checked exception的主OO语言q样一个事实,而C++和C#都是Ҏ没有Checked exceptionQ它们所有的异常都是unchecked?/em>

一个checked exception它的客户端可以抛出ƈ捕获它,一旦客L不能有效地处理这些被抛出的异常就会给E序的执行带来不期望的负担?br /> Checked exceptionq可能带来封装泄漏,看下面的代码Q?br />
public List getAllAccounts() throws
FileNotFoundException, SQLException{
...
}

上边的方法抛Z个异常。客L必须昄的对q两U异常进行捕获和处理即是在完全不知道这U异常到底是因ؓ文gq是数据库操作引L情况下。因此,此时的异常处理将D一U方法和调用之间不合适的耦合?br />


接下来我会给出几U设计异常的最佛_?QBest Practises for Designing the APIQ?br />
1Q?当要军_是采用checked exceptionq是Unchecked exception的时候,你要问自׃个问题,"如果q种异常一旦抛出,客户端会做怎样的补救?"
如果客户端可以通过其他的方法恢复异常,那么q种异常是checked exceptionQ如果客L对出现的q种异常无能为力Q那么这U异常就是Unchecked exceptionQ从使用上讲Q当异常出现的时候要做一些试图恢复它的动作而不要仅仅的打印它的信息QL的来_看下表:

Client's reaction when exception happens
Exception type

Client code cannot do anything
Make it an unchecked exception

Client code will take some useful recovery action based on information in exception
Make it a checked exception


此外Q尽量用unchecked exception来处理编E错误:因ؓunchecked exception不用使客L代码昄的处理它们,它们自己会在出现的地ҎL序ƈ打印出异怿息。Java API中提供了丰富的unchecked excetpionQ譬如:NullPointerException , IllegalArgumentException ?IllegalStateException{,因此我一般用这些标准的异常c而不愿亲自创建新的异常类Q这样我的代码易于理解q免的q多的消耗内存?br />
2Q?保护装性(Preserve encapsulationQ?br />
不要让你要抛出的checked exception升到较高的层次。例如,不要让SQLException延C务层。业务层q不需要(不关心?QSQLException。你有两U方法来解决q种问题Q?br />
l 转变SQLException为另外一个checked exceptionQ如果客Lq不需要恢复这U异常的话;

l 转变SQLExceptionZ个unchecked exceptionQ如果客L对这U异常无能ؓ力的话;

多数情况下,客户端代码都是对SQLException无能为力的,因此你要毫不犹U的把它{变ؓ一个unchecked exceptionQ看看下边的代码Q?br /> public void dataAccessCode(){
try{
..some code that throws SQLException
}catch(SQLException ex){
ex.printStacktrace();
}
}


上边的catch块紧紧打印异怿息而没有Q何的直接操作Q这是情有可原的Q因为对于SQLException你还奢望客户端做些什么呢Q(但是昄q种p什么事情都没发生一L做法是不可取的)那么有没有另外一U更加可行的Ҏ呢?

public void dataAccessCode(){
try{
..some code that throws SQLException
}catch(SQLException ex){
throw new RuntimeException(ex);
}
}

上边的做法是把SQLException转换为RuntimeExceptionQ一旦SQLException被抛出,那么E序抛出RuntimeException,此时E序被挂起ƈq回客户端异怿息?br />
如果你有_的信心恢复它当SQLException被抛出的时候,那么你也可以把它转换Z个有意义的checked exception, 但是我发现在大多时候抛出RuntimeException已经_用了?br />
3Q?不要创徏没有意义的异常(Try not to create new custom exceptions if they do not have useful information for client code.Q?br />
看看下面的代码有什么问题?

public class DuplicateUsernameException
extends Exception {}


它除了有一?意义明确"的名字以外没有Q何有用的信息了。不要忘记Exception跟其他的JavacMP客户端可以调用其中的Ҏ来得到更多的信息?br />
我们可以为其d一些必要的ҎQ如下:

public class DuplicateUsernameException
extends Exception {
public DuplicateUsernameException
(String username){....}
public String requestedUsername(){...}
public String[] availableNames(){...}
}



在新的代码中有两个有用的ҎQreqeuestedUsername(),客户但可以通过它得到请求的名称QavailableNames(),客户端可以通过它得Cl有用的usernames。这样客L在得到其q回的信息来明确自己的操作失败的原因。但是如果你不想d更多的信息,那么你可以抛Z个标准的Exception:

throw new Exception("Username already taken");
更甚的情况,如果你认为客Lq不想用q多的操作而仅仅想看到异常信息Q你可以抛出一个unchecked exception:

throw new RuntimeException("Username already taken");

另外Q你可以提供一个方法来验证该username是否被占用?br />
很有必要再重申一下,checked exception应该让客L从中得到丰富的信息。要惌你的代码更加易读Q请們֐于用unchecked excetpion来处理程序中的错误(Prefer unchecked exceptions for all programmatic errorsQ?br />
4Q?Document exceptions.

你可以通过Javadoc's @throws 标签来说明(documentQ你的API中要抛出checked exception或者unchecked exception。然而,我更們֐于用来单元试来说明(documentQ异常。不你采用哪中方式Q你要让客户端代码知道你的API中所要抛出的异常。这里有一个用单元试来测试IndexOutOfBoundsException的例子:

public void testIndexOutOfBoundsException() {
ArrayList blankList = new ArrayList();
try {
blankList.get(10);
fail("Should raise an IndexOutOfBoundsException");
} catch (IndexOutOfBoundsException success) {}
}



上边的代码在hblankList.get(10)的时候会抛出IndexOutOfBoundsException,如果没有被抛出,fail ("Should raise an IndexOutOfBoundsException")昄说明该测试失败。通过书写试异常的单元测试,你不但可以看到异常是怎样的工作的Q而且你可以让你的代码变得来健壮?br />

下面作者将介绍界中使用异常的最佛_践(Best Practices for Using ExceptionsQ?br /> 1Q?L要做一些清理工作(Always clean up after yourselfQ?br />
如果你用一些资源例如数据库q接或者网l连接,误住要做一些清理工作(如关闭数据库q接或者网l连接)Q如果你的API抛出Unchecked exceptionQ那么你要用try-finally来做必要的清理工作:
public void dataAccessCode(){    
Connection conn 
= null;    
try{    
conn 
= getConnection();    
..some code that 
throws SQLException    
}
catch(SQLException ex){    
ex.printStacktrace();    
}
 finally{    
DBUtil.closeConnection(conn);    
}
    
}
    
   
class DBUtil{    
public static void closeConnection    
(Connection conn)
{    
try{    
conn.close();    
}
 catch(SQLException ex){    
logger.error(
"Cannot close connection");    
throw new RuntimeException(ex);    
}
    
}
    
}
    

DBUtil是一个工L来关闭Connection.有必要的说的使用的finally的重要性是不管E序是否到异常Q它都会被执行。在上边的例子中Qfinally中关闭连接,如果在关闭连接的时候出现错误就抛出RuntimeException.



2Q?不要使用异常来控制流E(Never use exceptions for flow controlQ?br />
下边代码中,MaximumCountReachedException被用于控制流E:

public void useExceptionsForFlowControl() {    
try {    
while (true{    
increaseCount();    
}
    
}
 catch (MaximumCountReachedException ex) {    
}
    
//Continue execution    
}
    
   
public void increaseCount()    
throws MaximumCountReachedException {    
if (count >= 5000)    
throw new MaximumCountReachedException();    
}
     

上边的useExceptionsForFlowControl()用一个无限@环来增加count直到抛出异常Q这U做法ƈ没有说让代码不易读,但是它是E序执行效率降低?br />
CQ只在要会抛出异常的地方q行异常处理?br />


3Q?不要忽略异常

当有异常被抛出的时候,如果你不x复它Q那么你要毫不犹豫的其转换为unchecked exceptionQ而不是用一个空的catch块或者什么也不做来忽略它Q以至于从表面来看象是什么也没有发生一栗?br />


4Q?不要捕获层的Exception

unchecked exception都是RuntimeException的子c,RuntimeException又承Exception,因此Q如果单U的捕获Exception,那么你同样也捕获了RuntimeException,如下代码Q?br />
try{
..
}catch(Exception ex){
}
一旦你写出了上边的代码Q注意catch块是I的Q,它将忽略所有的异常Q包括unchecked exception.

5Q?Log exceptions just once

Logging the same exception stack trace more than once can confuse the programmer examining the stack trace about the original source of exception. So just log it once.



Frank_Fang 2009-06-18 23:36 发表评论
]]>
[转]Z么不鼓励使用 Thread.stop、Thread.suspend?Thread.resume及解x?/title><link>http://www.tkk7.com/fhtdy2004/archive/2009/06/10/281315.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Wed, 10 Jun 2009 13:57:00 GMT</pubDate><guid>http://www.tkk7.com/fhtdy2004/archive/2009/06/10/281315.html</guid><wfw:comment>http://www.tkk7.com/fhtdy2004/comments/281315.html</wfw:comment><comments>http://www.tkk7.com/fhtdy2004/archive/2009/06/10/281315.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.tkk7.com/fhtdy2004/comments/commentRss/281315.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/fhtdy2004/services/trackbacks/281315.html</trackback:ping><description><![CDATA[     摘要: Z么不鼓励使用 Thread.stop、Thread.suspend?Thread.resume及解x?nbsp; <a href='http://www.tkk7.com/fhtdy2004/archive/2009/06/10/281315.html'>阅读全文</a><img src ="http://www.tkk7.com/fhtdy2004/aggbug/281315.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-06-10 21:57 <a href="http://www.tkk7.com/fhtdy2004/archive/2009/06/10/281315.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OWL实例描述http://www.tkk7.com/fhtdy2004/archive/2009/06/10/281310.htmlFrank_FangFrank_FangWed, 10 Jun 2009 13:56:00 GMThttp://www.tkk7.com/fhtdy2004/archive/2009/06/10/281310.htmlhttp://www.tkk7.com/fhtdy2004/comments/281310.htmlhttp://www.tkk7.com/fhtdy2004/archive/2009/06/10/281310.html#Feedback0http://www.tkk7.com/fhtdy2004/comments/commentRss/281310.htmlhttp://www.tkk7.com/fhtdy2004/services/trackbacks/281310.html

http://www.transwiki.org/wiki/index.php/OWL%E6%8C%87%E5%8D%97_%E6%8E%A8%E8%8D%90%E6%A0%87%E5%87%86-4#equivalentClass.2C_equivalentProperty Q本体介l)

http://imarine.blog.163.com/blog/static/5138018320071119110889/Q本体查询)

http://bbs.w3china.org/dispbbs.asp?boardID=2&ID=74918/ (本体查询Q?br />

-------------------------------------------------------
rdfs:subClassOf 描述

 <owl:Class rdf:ID="Wine">
   <rdfs:subClassOf rdf:resource="&food;PotableLiquid"/>
   <rdfs:label xml:lang="en">wine</rdfs:label>
   <rdfs:label xml:lang="fr">vin</rdfs:label>
 </owl:Class>

Wine PotableLiquid
--------------------------------------------------------
ObjectProperty   描述 wine hasWinDescriptor WineDescriptor

 <owl:ObjectProperty rdf:ID="hasWineDescriptor">
   <rdfs:domain rdf:resource="#Wine" />
   <rdfs:range  rdf:resource="#WineDescriptor" />
 </owl:ObjectProperty>


-------------------------------------------------------
DatatypeProperty 描述 VintageYear is 1998

  <owl:DatatypeProperty rdf:ID="yearValue">
    <rdfs:domain rdf:resource="#VintageYear" />   
    <rdfs:range  rdf:resource="&xsd;positiveInteger" />
  </owl:DatatypeProperty>
 
  <VintageYear rdf:ID="Year1998">
    <yearValue rdf:datatype="&xsd;positiveInteger">1998</yearValue>
  </VintageYear>

  <owl:ObjectProperty rdf:ID="hasVintageYear">
    <rdf:type rdf:resource="&owl;FunctionalProperty" />
    <rdfs:domain rdf:resource="#Vintage" />
    <rdfs:range  rdf:resource="#VintageYear" />
  </owl:ObjectProperty>

Vintage has VintageYear that is 1998 ------ 葡萄酒的q䆾?998 ?1998的葡萄酒

--------------------------------------------------------
个体(individual) 描述

 <owl:Class rdf:ID="WineGrape">
   <rdfs:subClassOf rdf:resource="&food;Grape" />
 </owl:Class>
 <WineGrape rdf:ID="CabernetSauvignonGrape" />

CabernetSauvignonGrape is WineGrape ---- 赤霞珠葡萄树

----------------------属性特?-----------------------
TransitiveProperty 描述
SymmetricProperty  描述

<owl:Class rdf:ID="Region" />

<owl:ObjectProperty rdf:ID="locatedIn">
   <rdf:type rdf:resource="&owl;TransitiveProperty" />
   <rdfs:domain rdf:resource="    <rdfs:range rdf:resource="#Region" />
</owl:ObjectProperty>

<owl:ObjectProperty rdf:ID="adjacentRegion">
  <rdf:type rdf:resource="&owl;SymmetricProperty" />
  <rdfs:domain rdf:resource="#Region" />
  <rdfs:range rdf:resource="#Region" />
</owl:ObjectProperty>

--------------------------------------------
FunctionalProperty   描述 一个给定的 Vintage个体只能使用hasVintageYear属性与单独一个年份相兌

 <owl:Class rdf:ID="VintageYear" />
 <owl:ObjectProperty rdf:ID="hasVintageYear">
   <rdf:type rdf:resource="&owl;FunctionalProperty" />
   <rdfs:domain rdf:resource="#Vintage" />
   <rdfs:range  rdf:resource="#VintageYear" />
 </owl:ObjectProperty>
---------------------------------------------
 inverseOf  描述 各种葡萄酒都有制造商

 <owl:ObjectProperty rdf:ID="hasMaker">
   <rdf:type rdf:resource="&owl;FunctionalProperty" />
 </owl:ObjectProperty>  
 <owl:ObjectProperty rdf:ID="producesWine">
   <owl:inverseOf rdf:resource="#hasMaker" />
 </owl:ObjectProperty>

---------------------------------------------
 InverseFunctionalProperty 

 <owl:ObjectProperty rdf:ID="hasMaker" />
 <owl:ObjectProperty rdf:ID="producesWine">
   <rdf:type rdf:resource="&owl;InverseFunctionalProperty" />
   <owl:inverseOf rdf:resource="#hasMaker" />
 </owl:ObjectProperty>

 owl:InverseFunctional意味着属性的值域中的元素为定义域中的每个元素提供了一个唯一的标?/p>


 ---属性限?-----
 -------------------------
 allValuesFrom   描述 Wine的制造商必须是Winery?br />  owl:someValuesFrom替换owl:allValuesFromQ那意味着臛_有一个Winecd例的hasMaker属性是指向一个Winerycȝ个体的?/p>

 <owl:Class rdf:ID="Wine">
   <rdfs:subClassOf rdf:resource="&food;PotableLiquid" />
   ...
   <rdfs:subClassOf>
     <owl:Restriction>
       <owl:onProperty rdf:resource="#hasMaker" />
       <owl:allValuesFrom rdf:resource="#Winery" />
     </owl:Restriction>
   </rdfs:subClassOf>
  
   ...
 </owl:Class>

 -------------------------------------------------------
 owl:cardinality  描述  允许对一个关pM的元素数目作出精的限制

  <owl:Class rdf:ID="Vintage">
   <rdfs:subClassOf>
     <owl:Restriction>
       <owl:onProperty rdf:resource="#hasVintageYear"/>
       <owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
     </owl:Restriction>
   </rdfs:subClassOf>
 </owl:Class>

 每瓶葡萄酒只有一个年?/p>

 -------------------------------------------------------
 hasValue  描述 一个个体只要至有“一?#8221;属性值等于hasValue的资源,q一个体是该类的成员?/p>

  <owl:Class rdf:ID="Burgundy">
   ...
   <rdfs:subClassOf>
     <owl:Restriction>
       <owl:onProperty rdf:resource="#hasSugar" />
       <owl:hasValue rdf:resource="#Dry" />
     </owl:Restriction>
   </rdfs:subClassOf>
 </owl:Class>

 所有的Burgundy酒都是干(dry)的酒。也卻I它们的hasSugar属性必至有一个是值等于DryQ干的)

------------------------------------------------------
 本体映射
 cd属性之间的{h关系Q-equivalentClass, equivalentProperty

 <owl:Class rdf:ID="TexasThings">
   <owl:equivalentClass>
     <owl:Restriction>
       <owl:onProperty rdf:resource="#locatedIn" />
       <owl:someValuesFrom rdf:resource="#TexasRegion" />
     </owl:Restriction>
   </owl:equivalentClass>
 </owl:Class>

 TexasThings指的是那些恰好位于TexasRegion的事物。用owl:equivalentClass 和用rdfs:subClassOf 的不同就像必要条件和充要条g的不同一栗如果是使用subClassOf的话Q位于TexasRegion的事物不一定是TexasThings。但是,如果使用owl:equivalentClassQ位于TexasRegion的事物一定属于TexasThingscR?/p>

------------------------------------------------------
个体间的同一?QsameAs

 <Wine rdf:ID="MikesFavoriteWine>
     <owl:sameAs rdf:resource="#StGenevieveTexasWhite" />
 </Wine>

 修饰Q或引用Q两个类用sameAsq是用equivalentClass效果是不同的。用sameAs的时候,把一个类解释Z个个体,像在OWL Full中一Pq有利于Ҏ体进行分cR?/p>

-----------------------------------------------------
 不同的个?br /> ------------------------------------------------------
differentFrom

 <WineSugar rdf:ID="Dry" />
 
 <WineSugar rdf:ID="Sweet">
   <owl:differentFrom rdf:resource="#Dry"/> 
 </WineSugar>
 
 <WineSugar rdf:ID="OffDry">
   <owl:differentFrom rdf:resource="#Dry"/>
   <owl:differentFrom rdf:resource="#Sweet"/>
 </WineSugar>

 ---------------------------------------------------
AllDifferent

 <owl:AllDifferent>
   <owl:distinctMembers rdf:parseType="Collection">
     <vin:WineColor rdf:about="#Red" />
     <vin:WineColor rdf:about="#White" />
     <vin:WineColor rdf:about="#Rose" />
   </owl:distinctMembers>
 </owl:AllDifferent>

 owl:distinctMembers属性声明只能和owl:AllDifferent属性声明一L合用?/p>

 -----------------------------------------------------
 intersectionOf

 <owl:Class rdf:ID="WhiteWine">
   <owl:intersectionOf rdf:parseType="Collection">
     <owl:Class rdf:about="#Wine" />
     <owl:Restriction>
       <owl:onProperty rdf:resource="#hasColor" />
       <owl:hasValue rdf:resource="#White" />
     </owl:Restriction>
   </owl:intersectionOf>
 </owl:Class>

 WhiteWine恰好是类Wine与所有颜色是白色的事物的集合的交?/p>

 -----------------------------------------------------
 unionOf

 <owl:Class rdf:ID="Fruit">
   <owl:unionOf rdf:parseType="Collection">
     <owl:Class rdf:about="#SweetFruit" />
     <owl:Class rdf:about="#NonSweetFruit" />
   </owl:unionOf>
 </owl:Class>

 ------------------------------------------------------
 complementOf 从某个论?domain of discourse)选出不属于某个类的所有个?/p>

 <owl:Class rdf:ID="NonFrenchWine">
   <owl:intersectionOf rdf:parseType="Collection">
     <owl:Class rdf:about="#Wine"/>
    
     <owl:Class>
       <owl:complementOf>
         <owl:Restriction>
           <owl:onProperty rdf:resource="#locatedIn" />
           <owl:hasValue rdf:resource="#FrenchRegion" />
         </owl:Restriction>
       </owl:complementOf>
     </owl:Class>
   </owl:intersectionOf>
 </owl:Class>

 -----------------------------------------------------------
 oneOf  枚D

 <owl:Class rdf:ID="WineColor">
   <rdfs:subClassOf rdf:resource="#WineDescriptor"/>
   <owl:oneOf rdf:parseType="Collection">
     <owl:Thing rdf:about="#White"/>
     <owl:Thing rdf:about="#Rose"/>
     <owl:Thing rdf:about="#Red"/>
   </owl:oneOf>
 </owl:Class>

 有效的个体声?/p>

 -----------------------------------------------------------
 disjointWith  不相交类  保证了属于某一个类的个体不能同时又是另一个指定类的实?/p>

 <owl:Class rdf:ID="Pasta">
   <rdfs:subClassOf rdf:resource="#EdibleThing"/>
   <owl:disjointWith rdf:resource="#Meat"/>
   <owl:disjointWith rdf:resource="#Fowl"/>
   <owl:disjointWith rdf:resource="#Seafood"/>
   <owl:disjointWith rdf:resource="#Dessert"/>
   <owl:disjointWith rdf:resource="#Fruit"/>
 </owl:Class>

Pasta与其它所有类是不怺的。例如,它ƈ没有保证Meat和Fruit是不怺?/p>

Frank_Fang 2009-06-10 21:56 发表评论
]]>
Java多线Esleep(),join(),interrupt(),wait(),notify()http://www.tkk7.com/fhtdy2004/archive/2009/06/08/280728.htmlFrank_FangFrank_FangMon, 08 Jun 2009 13:01:00 GMThttp://www.tkk7.com/fhtdy2004/archive/2009/06/08/280728.htmlhttp://www.tkk7.com/fhtdy2004/comments/280728.htmlhttp://www.tkk7.com/fhtdy2004/archive/2009/06/08/280728.html#Feedback5http://www.tkk7.com/fhtdy2004/comments/commentRss/280728.htmlhttp://www.tkk7.com/fhtdy2004/services/trackbacks/280728.html
以下是参?lt;<Java多线E模?gt;>?
1. sleep() & interrupt()
    U程A正在使用sleep()暂停着: Thread.sleep(100000);
    如果要取消他的等待状?可以在正在执行的U程?比如q里是B)调用
        a.interrupt();
    令线EA攑ּ睡眠操作,q里a是线EA对应到的Thread实例
    执行interrupt()?q不需要获取Thread实例的锁?MU程在Q何时?都可以调用其他线Einterrupt().当sleep中的U程被调用interrupt()?׃攑ּ暂停的状?q抛出InterruptedException.丢出异常?是AU程.

2. wait() & interrupt()
    U程A调用了wait()q入了等待状?也可以用interrupt()取消.
    不过q时候要心锁定的问?U程在进入等待区,会把锁定解除,当对{待中的U程调用interrupt()?注意是等待的U程调用其自qinterrupt()),会先重新获取锁定,再抛出异?在获取锁定之?是无法抛出异常的.

3. join() & interrupt()
    当线E以join(){待其他U程l束?一样可以用interrupt()取消?因ؓ调用join()不需要获取锁?故与sleep()时一?会马上蟩到catch块里. 注意是随调用interrupt()Ҏ,一定是d的线E来调用其自qinterruptҎ.如在U程a中调用来U程t.join().则a会等t执行完后在执行t.join后的代码,当在U程b中调用来a.interrupt()Ҏ,则会抛出InterruptedException

4. interrupt()只是改变中断状态而已
    interrupt()不会中断一个正在运行的U程。这一Ҏ实际上完成的是,在线E受到阻塞时抛出一个中断信Pq样U程得以退出阻塞的状态。更切的说Q如果线E被Object.wait, Thread.join和Thread.sleep三种Ҏ之一dQ那么,它将接收C个中断异常(InterruptedExceptionQ,从而提早地l结被阻塞状态?
    如果U程没有被阻塞,q时调用interrupt()不起作用;否则Q线E就得到异常(该线E必M先预备好处理此状况)Q接着逃离d状态?
    U程A在执行sleep,wait,join?U程B调用A的interruptҎ,的确q一个时候A会有InterruptedException异常抛出?但这其实是在sleep,wait,joinq些Ҏ内部会不断检查中断状态的?而自己抛出的InterruptedException?
    如果U程A正在执行一些指定的操作时如赋?for,while,if,调用Ҏ{?都不会去查中断状?所以线EA不会抛出InterruptedException,而会一直执行着自己的操?当线EAl于执行到wait(),sleep(),join()?才马上会抛出InterruptedException.
    若没有调用sleep(),wait(),join()q些Ҏ,或是没有在线E里自己查中断状态自己抛出InterruptedException的话,那InterruptedException是不会被抛出来的.

Z加个与Thread.sleep()相同效果的代?
public static void amethod(long x) throws InterruptedExcetion{
    if (x != 0) {
        Object o = new Object();
        synchronized (o) {
            o.wait(x);
        }
    }
}


Frank_Fang 2009-06-08 21:01 发表评论
]]>
正确理解ThreadLocalhttp://www.tkk7.com/fhtdy2004/archive/2009/06/02/279582.htmlFrank_FangFrank_FangTue, 02 Jun 2009 06:18:00 GMThttp://www.tkk7.com/fhtdy2004/archive/2009/06/02/279582.htmlhttp://www.tkk7.com/fhtdy2004/comments/279582.htmlhttp://www.tkk7.com/fhtdy2004/archive/2009/06/02/279582.html#Feedback3http://www.tkk7.com/fhtdy2004/comments/commentRss/279582.htmlhttp://www.tkk7.com/fhtdy2004/services/trackbacks/279582.html阅读全文

Frank_Fang 2009-06-02 14:18 发表评论
]]>
ThreadLocal和synchronizedhttp://www.tkk7.com/fhtdy2004/archive/2009/06/01/279469.htmlFrank_FangFrank_FangMon, 01 Jun 2009 13:57:00 GMThttp://www.tkk7.com/fhtdy2004/archive/2009/06/01/279469.htmlhttp://www.tkk7.com/fhtdy2004/comments/279469.htmlhttp://www.tkk7.com/fhtdy2004/archive/2009/06/01/279469.html#Feedback1http://www.tkk7.com/fhtdy2004/comments/commentRss/279469.htmlhttp://www.tkk7.com/fhtdy2004/services/trackbacks/279469.html阅读全文

Frank_Fang 2009-06-01 21:57 发表评论
]]>
Java多线E小l?/title><link>http://www.tkk7.com/fhtdy2004/archive/2009/06/01/279329.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Mon, 01 Jun 2009 01:31:00 GMT</pubDate><guid>http://www.tkk7.com/fhtdy2004/archive/2009/06/01/279329.html</guid><wfw:comment>http://www.tkk7.com/fhtdy2004/comments/279329.html</wfw:comment><comments>http://www.tkk7.com/fhtdy2004/archive/2009/06/01/279329.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.tkk7.com/fhtdy2004/comments/commentRss/279329.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/fhtdy2004/services/trackbacks/279329.html</trackback:ping><description><![CDATA[     摘要: Java多线E小l?nbsp; <a href='http://www.tkk7.com/fhtdy2004/archive/2009/06/01/279329.html'>阅读全文</a><img src ="http://www.tkk7.com/fhtdy2004/aggbug/279329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-06-01 09:31 <a href="http://www.tkk7.com/fhtdy2004/archive/2009/06/01/279329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java内部c?/title><link>http://www.tkk7.com/fhtdy2004/archive/2009/05/24/277741.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Sun, 24 May 2009 14:52:00 GMT</pubDate><guid>http://www.tkk7.com/fhtdy2004/archive/2009/05/24/277741.html</guid><description><![CDATA[     摘要: 重点理解Java引入内部cȝ原因以及好处 内部c能让你再逻辑上将怺从属的类l织hQƈ且在cȝ内部控制讉K权限。但是切讎ͼ内部cd合成时截然不同的Q这一炚w帔R要? 几个有代表性的代码?接口可以嵌套在类或其它接口中 接口的嵌?Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.Co...  <a href='http://www.tkk7.com/fhtdy2004/archive/2009/05/24/277741.html'>阅读全文</a><img src ="http://www.tkk7.com/fhtdy2004/aggbug/277741.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-24 22:52 <a href="http://www.tkk7.com/fhtdy2004/archive/2009/05/24/277741.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java对象的实例化q程,成员变量的初始化序http://www.tkk7.com/fhtdy2004/archive/2009/05/11/270110.htmlFrank_FangFrank_FangMon, 11 May 2009 13:16:00 GMThttp://www.tkk7.com/fhtdy2004/archive/2009/05/11/270110.htmlhttp://www.tkk7.com/fhtdy2004/comments/270110.htmlhttp://www.tkk7.com/fhtdy2004/archive/2009/05/11/270110.html#Feedback0http://www.tkk7.com/fhtdy2004/comments/commentRss/270110.htmlhttp://www.tkk7.com/fhtdy2004/services/trackbacks/270110.htmlJAVA中子cd象的实例化过E?/span>

 Person.java

class Person
{
 
public String name = "not know";//4
 public int age = -1 ;//5
 public Person()
 
{    
 }
 
public Person(String name , int age)//3
 {
  
this.name = name ;//6
  this.age = age;//7
 }
 
public void showInfo()
 
{
  System.out.println("Name is :"+name+" Age is :"+age);
 }
}
class Student extends Person
{
 
public String school = "not konwn";//8
    public Student()
    
{
     
super();    
    }
    
public Student (String name ,int age, String school)  //1
    {
     
super(name,age);  //2
     this.school = school;//9
    }
    
public void showInfo()
    
{
     
super.showInfo();
     System.out.println("School is :"+school);
    }
}

AllTest.java

class AllTest
{
 
public static void main(String[]args)
 
{
  Student stA = 
new Student("wanghao",20,"qinghuadaxue"); //0
 }
}

其语句的执行序是怎样的呢Q?/span>
java
中,在?/span>new操作W创Z个类的实例对象的时候,开始分配空间ƈ成员变量初始化?/span>默认?/span>数?/span>Q注意这里ƈ不是指将变量初始化ؓ在变量定义处的初始|?strong>是给整Ş赋?/span>0Q给字符串赋?/span>null q一点于C++不同Q(student.name = null , student.age = 0 Q?/span>
然后在进入类的构造函数?/span>

在构造函数里面,首先要检查是否有this或?/span>super调用Q?/span>this调用是完成本cLw的构造函C间的调用Q?/span>super调用是完成对父类的调用?strong>二者只能出C个,q且只能作ؓ构造函数的W一句出现?/span>在调?/span>this?/span>super的时候实现程序的跌{Q{而执行被调用?/span>this构造函数或?/span>super构造函数?/span>
?/span>this?/span>super执行完毕Q?strong>E序转而执行在cd义的时候进行的变量初始化工?/span>?/span>
q个执行完毕Q才是构造函C剩下的代码的执行?/span>
执行序已经用绿色标出?/span>

Order of initialization
Within a class, the order of initialization is determined by the order that the variables are defined within the class. The variable definitions may be scattered throughout and in between method definitions, but the variables are initialized before any methods can be called—even the constructor. For example: Feedback
//: c04:OrderOfInitialization.java
// Demonstrates initialization order.
import com.bruceeckel.simpletest.*;

// When the constructor is called to create a
// Tag object, you'll see a message:
class Tag {
  Tag(int marker) {
    System.out.println("Tag(" + marker + ")");
  }
}

class Card {
  Tag t1 = new Tag(1); // Before constructor
  Card() {
    // Indicate we're in the constructor:
    System.out.println("Card()");
    t3 = new Tag(33); // Reinitialize t3
  }
  Tag t2 = new Tag(2); // After constructor
  void f() {
    System.out.println("f()");
  }
  Tag t3 = new Tag(3); // At end
}

public class OrderOfInitialization {
  static Test monitor = new Test();
  public static void main(String[] args) {
    Card t = new Card();
    t.f(); // Shows that construction is done
    monitor.expect(new String[] {
      "Tag(1)",
      "Tag(2)",
      "Tag(3)",
      "Card()",
      "Tag(33)",
      "f()"
    });
  }
} ///:~


//: c04:StaticInitialization.java
// Specifying initial values in a class definition.
class Bowl {
  Bowl(int marker) {
    System.out.println("Bowl(" + marker + ")");
  }
  void f(int marker) {
    System.out.println("f(" + marker + ")");
  }
}

class Table {
  static Bowl b1 = new Bowl(1);
  Table() {
    System.out.println("Table()");
    b2.f(1);
  }
  void f2(int marker) {
    System.out.println("f2(" + marker + ")");
  }
  static Bowl b2 = new Bowl(2);
}

class Cupboard {
  Bowl b3 = new Bowl(3);
  static Bowl b4 = new Bowl(4);
  Cupboard() {
    System.out.println("Cupboard()");
    b4.f(2);
  }
  void f3(int marker) {
    System.out.println("f3(" + marker + ")");
  }
  static Bowl b5 = new Bowl(5);
}

public class StaticInitialization {
  static Test monitor = new Test();
  public static void main(String[] args) {
    System.out.println("Creating new Cupboard() in main");
    new Cupboard();
    System.out.println("Creating new Cupboard() in main");
    new Cupboard();
    t2.f2(1);
    t3.f3(1);
    monitor.expect(new String[] {
      "Bowl(1)",
      "Bowl(2)",
      "Table()",
      "f(1)",
      "Bowl(4)",
      "Bowl(5)",
      "Bowl(3)",
      "Cupboard()",
      "f(2)",
      "Creating new Cupboard() in main",
      "Bowl(3)",
      "Cupboard()",
      "f(2)",
      "Creating new Cupboard() in main",
      "Bowl(3)",
      "Cupboard()",
      "f(2)",
      "f2(1)",
      "f3(1)"
    });
  }
  static Table t2 = new Table();
  static Cupboard t3 = new Cupboard();
} ///:~


l承情况下的初始?br /> 了解一下包括承在内的初始化的q程是非常有益的,q样p有个?br /> 体的了解。看看下面这D代码:
//: c06:Beetle.java
// The full process of initialization.
class Insect {
  protected static Test monitor = new Test();
  private int i = 9;
  protected int j;
  Insect() {
    System.out.println("i = " + i + ", j = " + j);
    j = 39;
  }
  private static int x1 = print("static Insect.x1 initialized");
  static int print(String s) {
    System.out.println(s);
    return 47;
  }
}

public class Beetle extends Insect {
  private int k = print("Beetle.k initialized");
  public Beetle() {
    System.out.println("k = " + k);
    System.out.println("j = " + j);
  }
  private static int x2 = print("static Beetle.x2 initialized");
  public static void main(String[] args) {
    System.out.println("Beetle constructor");
    Beetle b = new Beetle();
    monitor.expect(new String[] {
      "static Insect.x1 initialized",
      "static Beetle.x2 initialized",
      "Beetle constructor",
      "i = 9, j = 0",
      "Beetle.k initialized",
      "k = 47",
      "j = 39"
    });
  }
} ///:~

当你?/span>Java q行Beetle 的时候,W一件事是讉K?/span>Beetel.main( )(q是一?/span>static ?span style="color: blue">?/span>)Q于是装载器(loader)׃?/span>

你寻扄~译?/span>Beetle cȝ代码(也就?/span>Beetle.class 文g)。在装蝲的过E中Q装载器注意到它有一个基c?/span>(也就?/span>extends 所要表C的意?/span>)Q于是它再装载基cR不你创不创徏基类对象Q这个过EM发生?/span>(试试看,把创建对象的那句注释掉,看看会有什么结果?/span>)如果基类q有基类Q那么这W二个基cM会被装蝲Q以此类?span style="color: blue">?strong>下一步,它会执行“根基c?/strong>(root bas e class)(q里是Insect)?/span>static 初始化,然后是下一个派生类?/span>static 初始化,以此cL。这个顺序非帔R要,因ؓzcȝ“静态初始化(卛_面讲?/span>static 初始?/span>)”有可能要依赖基类成员的正初始化?/span>

现在所有必要的c都已经装蝲l束Q可以创建对象了?/span>首先Q对象里的所有的primitive 都会被设成它们的~省|?/span>reference 也会被设?/span>null——这个过E是一瞬间完成的,对象的内存会被统一地设|成“两进制的?/span>(binary zero)”?strong>如果有对成员变量赋初|则对成员变量q行赋|然后调用基类的构造函数。调用是自动发生的,但是你可以?/span>super 来指定调用哪个构造函?/span>(也就Beetle( )构造函数所做的W一件事)。基cȝ构造过E以及构造顺序,同派生类的相同。基cL造函数运行完毕之后,会按照各个变量的字面序q行初始化。最后会执行构造函数的其余部分?/span>



Frank_Fang 2009-05-11 21:16 发表评论
]]>
C++虚函数声明ؓprivate也可以实现运行时多?/title><link>http://www.tkk7.com/fhtdy2004/archive/2009/05/07/269408.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Thu, 07 May 2009 06:02:00 GMT</pubDate><guid>http://www.tkk7.com/fhtdy2004/archive/2009/05/07/269408.html</guid><wfw:comment>http://www.tkk7.com/fhtdy2004/comments/269408.html</wfw:comment><comments>http://www.tkk7.com/fhtdy2004/archive/2009/05/07/269408.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/fhtdy2004/comments/commentRss/269408.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/fhtdy2004/services/trackbacks/269408.html</trackback:ping><description><![CDATA[    只有注册用户d后才能阅读该文?a href='http://www.tkk7.com/fhtdy2004/archive/2009/05/07/269408.html'>阅读全文</a><img src ="http://www.tkk7.com/fhtdy2004/aggbug/269408.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-07 14:02 <a href="http://www.tkk7.com/fhtdy2004/archive/2009/05/07/269408.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaҎ覆盖Overridehttp://www.tkk7.com/fhtdy2004/archive/2009/05/07/269407.htmlFrank_FangFrank_FangThu, 07 May 2009 05:56:00 GMThttp://www.tkk7.com/fhtdy2004/archive/2009/05/07/269407.htmlhttp://www.tkk7.com/fhtdy2004/comments/269407.htmlhttp://www.tkk7.com/fhtdy2004/archive/2009/05/07/269407.html#Feedback0http://www.tkk7.com/fhtdy2004/comments/commentRss/269407.htmlhttp://www.tkk7.com/fhtdy2004/services/trackbacks/269407.html阅读全文

Frank_Fang 2009-05-07 13:56 发表评论
]]>
Java对象的强、Y、弱和虚引用http://www.tkk7.com/fhtdy2004/archive/2009/04/30/268412.htmlFrank_FangFrank_FangThu, 30 Apr 2009 10:10:00 GMThttp://www.tkk7.com/fhtdy2004/archive/2009/04/30/268412.htmlhttp://www.tkk7.com/fhtdy2004/comments/268412.htmlhttp://www.tkk7.com/fhtdy2004/archive/2009/04/30/268412.html#Feedback3http://www.tkk7.com/fhtdy2004/comments/commentRss/268412.htmlhttp://www.tkk7.com/fhtdy2004/services/trackbacks/268412.html阅读全文

Frank_Fang 2009-04-30 18:10 发表评论
]]>
java try return finallyhttp://www.tkk7.com/fhtdy2004/archive/2009/04/30/268386.htmlFrank_FangFrank_FangThu, 30 Apr 2009 08:04:00 GMThttp://www.tkk7.com/fhtdy2004/archive/2009/04/30/268386.htmlhttp://www.tkk7.com/fhtdy2004/comments/268386.htmlhttp://www.tkk7.com/fhtdy2004/archive/2009/04/30/268386.html#Feedback3http://www.tkk7.com/fhtdy2004/comments/commentRss/268386.htmlhttp://www.tkk7.com/fhtdy2004/services/trackbacks/268386.html׃个笔试题惛_?br /> try有return,catch也有return,且有finally?br /> q且finally中对resutlq行的赋值ƈ不媄响之前的已经return 的result?br /> 最后返回的result引用q是之前的result引用
finally其实也可以有returnQ一般eclipse会提Cfinally block does not complete normally,但不会报?br /> q且会忽略之前的q回和抛出的异常

package returnfinally;

public class TestReturnAfterFinally {

     
public static void main(String[] args) {
      
try {
       String result 
= testException();
       System.out.println();
       System.out.println(result);
      }
 catch (Exception e) {
      
// System.out.println(result);
       System.out.println(e.toString());
      }

     }

     
    
public static String testException() throws Exception {
      String result 
= "";
      
try {
       
// if (true) throw new MyException("异常Q?);
       
//int i = 0;
       int i=0;
       
int b = 10 / i;
       
//函数不会正常的返?在返回前已经抛出异常了,抛出异常卛_数返回了
       /*
        * 相当于catch(Exception e){
        *    throw e;
        * }
        
*/

       
/*
       result="in try";
       return result;
       
*/

       
throw new Exception("h");
      }
catch(Exception e){
          System.out.println(e);
          Exception ee 
= e;
          
//throw ee;
          result="in catch";
          
return result;
      }

      
finally {
       result 
= "in finallyQ?/span>";
       System.out.println(result);
       
//return result;
       
//throw new Exception("ex cretated in finally");
      }

      
      
//return result;
     }


    }




 



Frank_Fang 2009-04-30 16:04 发表评论
]]>
java的回调机?/title><link>http://www.tkk7.com/fhtdy2004/archive/2009/04/29/268249.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Wed, 29 Apr 2009 14:31:00 GMT</pubDate><guid>http://www.tkk7.com/fhtdy2004/archive/2009/04/29/268249.html</guid><wfw:comment>http://www.tkk7.com/fhtdy2004/comments/268249.html</wfw:comment><comments>http://www.tkk7.com/fhtdy2004/archive/2009/04/29/268249.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/fhtdy2004/comments/commentRss/268249.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/fhtdy2004/services/trackbacks/268249.html</trackback:ping><description><![CDATA[    只有注册用户d后才能阅读该文?a href='http://www.tkk7.com/fhtdy2004/archive/2009/04/29/268249.html'>阅读全文</a><img src ="http://www.tkk7.com/fhtdy2004/aggbug/268249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-04-29 22:31 <a href="http://www.tkk7.com/fhtdy2004/archive/2009/04/29/268249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java StringW试l常遇到?/title><link>http://www.tkk7.com/fhtdy2004/archive/2009/04/29/268231.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Wed, 29 Apr 2009 13:04:00 GMT</pubDate><guid>http://www.tkk7.com/fhtdy2004/archive/2009/04/29/268231.html</guid><description><![CDATA[<p>java.lang.String的intern()Ҏ <br /> "abc".intern()Ҏ的返回D是字W串"abc"Q表面上看v来好像这个方法没什么用处。但实际上,它做了个动作: <br /> 查字W串池里是否存在"abc"q么一个字W串Q如果存在,p回池里的字符Ԍ如果不存在,该方法会?abc"d到字W串池中Q然后再q回它的引用?<br /> 我们做个试Q?<br />       String str1 = "a"; <br /> String str2 = "bc"; <br /> String str3 = "a"+"bc"; <br /> String str4 = str1+str2; <br />    <br /> System.out.println(str3==str4); <br /> str4 = (str1+str2).intern(); <br /> System.out.println(str3==str4); <br /> 输出的结果将会是: <br /> false <br /> true <br /> JDK的api文档是这么解释的Q?<br /> ======================================================================= <br /> q回字符串对象的规范化表CŞ式?<br /> 一个初始时为空的字W串池,它由c?String U有地维护?<br /> 当调?intern ҎӞ如果池已l包含一个等于此 String 对象的字W串Q该对象?equals(Object) Ҏ定Q,则返回池中的字符丌Ӏ否则,此 String 对象d到池中,q且q回?String 对象的引用?<br /> 它遵循对于Q何两个字W串 s ?tQ当且仅?s.equals(t) ?true Ӟs.intern() == t.intern() 才ؓ true?<br /> 所有字面值字W串和字W串赋值常量表辑ּ都是内部的。字W串字面值在《Java Language Specification》的 §3.10.5 中已定义?</p> <p>q回Q?<br /> 一个字W串Q内容与此字W串相同Q但它保证来自字W串池中?<br /> =======================================================================</p> <p>字符串字面池指的是常量池.</p> <p>字符串对象的创徏方式有两U?/p> <p>如下:</p> <p>String s1 = new String("");   //W一U?/p> <p>String s2 = "";               //W二U?/p> <p>W一U始l不会入池的.</p> <p>W二U要看情况而定({号双如果是常量则入池,非常量则不入?</p> <p>?</p> <p>String s3 = "a" + "b"; //"a"是常?"b"是常?帔R+帔R=帔R,所以会入池.</p> <p>String s4 = s1 + "b";   //s1是变?"b"是常?变量+帔R!=帔R,所以不会入?<br />          //那引用s4所指的对象在哪里创??????</p> <p>一旦入池的?׃先查找池中有无此对象.如果有此对象,则让对象引用指向此对?如果无此对象,则先创徏此对?再让对象引用指向此对?</p> <p>?</p> <p>String s5 = "abc"; //先在池中查找有无"abc"对象,如果?则让s5指向此对?如果池中?abc"对象,则在池中创徏一?abc"对象,然后让s5指向该对?补充一下:</p> <p>看了字节码后Q发?br /> String str ="a"+"b";<br /> 完全{同?br /> String str="ab"; <br /> </p> <p><br />  -----------------------------------------------------------------------------------------------------------------------------<br /> <br /> Java虚拟机有一个字W串池,保存着几乎所有的字符串常量。字W串表达式L指向字符串池中的一个对象?br /> public class Test...{<br />  public static void main(String[] args)...{<br />   String s1=new String("abc");<br />   String s2="abc";//攑օString池里<br />   String s3=new String("abc");<br />   System.out.println(s1==s2);//false<br />   System.out.println(s1==s3);//false<br />   System.out.println(s3==s2);//false<br />   System.out.println(s1==s1.intern());//s1.intern()到String池里找,而s1是在堆中所以返回false<br />   System.out.println(s2==s2.intern());//true<br />   System.out.println(s1.intern()==s3.intern());//两个字符串同时到String池里查找Q返回true<br />   <br />    //以下三个都放到String?br />   String hello="hello";<br />   String hel="hel";<br />   String lo="lo";<br />   System.out.println(hello=="hel"+"lo");//字符串相加以后,会到String池里找,有不产生Q所以返回true<br />   System.out.println(hello=="hello");//直接到String池里找,q回true<br />   System.out.println(hello=="hel"+lo);//字符串加一个引用,生一个新的对象,所以返回false<br />   System.out.println(hello==(hel+lo));//cM上面Q返回false<br />   System.out.println(hello==(hel+lo).intern());//产生新的对象Q但是有intern()ҎQ将到String池中找,q回true<br />  }<br /> }<br /> <br /> </p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080"> 1</span><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">package</span><span style="color: #000000"> com._6617.fhs.weatherservice;<br /> </span><span style="color: #008080"> 2</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><br /> </span><span style="color: #008080"> 3</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> java.util.HashSet;<br /> </span><span style="color: #008080"> 4</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> java.util.Set;<br /> </span><span style="color: #008080"> 5</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><br /> </span><span style="color: #008080"> 6</span><span style="color: #000000"><img id="Codehighlighter1_106_2030_Open_Image" onclick="this.style.display='none'; Codehighlighter1_106_2030_Open_Text.style.display='none'; Codehighlighter1_106_2030_Closed_Image.style.display='inline'; Codehighlighter1_106_2030_Closed_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_106_2030_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_106_2030_Closed_Text.style.display='none'; Codehighlighter1_106_2030_Open_Image.style.display='inline'; Codehighlighter1_106_2030_Open_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> Test </span><span id="Codehighlighter1_106_2030_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.tkk7.com/Images/dot.gif" /></span><span id="Codehighlighter1_106_2030_Open_Text"><span style="color: #000000">{<br /> </span><span style="color: #008080"> 7</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /> </span><span style="color: #008080"> 8</span><span style="color: #000000"><img id="Codehighlighter1_110_133_Open_Image" onclick="this.style.display='none'; Codehighlighter1_110_133_Open_Text.style.display='none'; Codehighlighter1_110_133_Closed_Image.style.display='inline'; Codehighlighter1_110_133_Closed_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_110_133_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_110_133_Closed_Text.style.display='none'; Codehighlighter1_110_133_Open_Image.style.display='inline'; Codehighlighter1_110_133_Open_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_110_133_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/** */</span><span id="Codehighlighter1_110_133_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br /> </span><span style="color: #008080"> 9</span><span style="color: #008000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />     * </span><span style="color: #808080">@param</span><span style="color: #008000"> args<br /> </span><span style="color: #008080">10</span><span style="color: #008000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />     </span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /> </span><span style="color: #008080">11</span><span style="color: #000000"><img id="Codehighlighter1_174_2027_Open_Image" onclick="this.style.display='none'; Codehighlighter1_174_2027_Open_Text.style.display='none'; Codehighlighter1_174_2027_Closed_Image.style.display='inline'; Codehighlighter1_174_2027_Closed_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_174_2027_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_174_2027_Closed_Text.style.display='none'; Codehighlighter1_174_2027_Open_Image.style.display='inline'; Codehighlighter1_174_2027_Open_Text.style.display='inline';" alt="" src="http://www.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> main(String[] args)</span><span id="Codehighlighter1_174_2027_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.tkk7.com/Images/dot.gif" /></span><span id="Codehighlighter1_174_2027_Open_Text"><span style="color: #000000">{<br /> </span><span style="color: #008080">37</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        <br /> </span><span style="color: #008080">38</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        Set set </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> HashSet();<br /> </span><span style="color: #008080">39</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        set.add(</span><span style="color: #0000ff">new</span><span style="color: #000000"> A());<br /> </span><span style="color: #008080">40</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        set.add(</span><span style="color: #0000ff">new</span><span style="color: #000000"> A());<br /> </span><span style="color: #008080">41</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        set.add(</span><span style="color: #0000ff">new</span><span style="color: #000000"> A());<br /> </span><span style="color: #008080">42</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(set.size());<br />                 //主要是看cA是否自己实现了hashcode和equalsҎ<br /> </span><span style="color: #008080">43</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        <br /> </span><span style="color: #008080">44</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        String s </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> String(</span><span style="color: #000000">"</span><span style="color: #000000">abc</span><span style="color: #000000">"</span><span style="color: #000000">);<br /> </span><span style="color: #008080">45</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(s</span><span style="color: #000000">==</span><span style="color: #000000">"</span><span style="color: #000000">abc</span><span style="color: #000000">"</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">f</span><span style="color: #008000"><br /> </span><span style="color: #008080">46</span><span style="color: #008000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">        System.out.println(s</span><span style="color: #000000">==</span><span style="color: #000000">"</span><span style="color: #000000">a</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">bc</span><span style="color: #000000">"</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">f</span><span style="color: #008000"><br /> </span><span style="color: #008080">47</span><span style="color: #008000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">        String t </span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">abc</span><span style="color: #000000">"</span><span style="color: #000000">;<br /> </span><span style="color: #008080">48</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(s</span><span style="color: #000000">==</span><span style="color: #000000">t);</span><span style="color: #008000">//</span><span style="color: #008000">f</span><span style="color: #008000"><br /> </span><span style="color: #008080">49</span><span style="color: #008000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">        String r </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">a</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">bc</span><span style="color: #000000">"</span><span style="color: #000000">;<br /> </span><span style="color: #008080">50</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(s</span><span style="color: #000000">==</span><span style="color: #000000">r);</span><span style="color: #008000">//</span><span style="color: #008000">f</span><span style="color: #008000"><br /> </span><span style="color: #008080">51</span><span style="color: #008000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">        System.out.println(t</span><span style="color: #000000">==</span><span style="color: #000000">r);</span><span style="color: #008000">//</span><span style="color: #008000">t</span><span style="color: #008000"><br /> </span><span style="color: #008080">52</span><span style="color: #008000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">        String u </span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">a</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #0000ff">new</span><span style="color: #000000"> String(</span><span style="color: #000000">"</span><span style="color: #000000">bc</span><span style="color: #000000">"</span><span style="color: #000000">);<br /> </span><span style="color: #008080">53</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(s</span><span style="color: #000000">==</span><span style="color: #000000">u);</span><span style="color: #008000">//</span><span style="color: #008000">f</span><span style="color: #008000"><br /> </span><span style="color: #008080">54</span><span style="color: #008000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">        System.out.println(r</span><span style="color: #000000">==</span><span style="color: #000000">u);</span><span style="color: #008000">//</span><span style="color: #008000">f<br /> </span><span style="color: #008080">55</span><span style="color: #008000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        <br /> </span><span style="color: #008080">56</span><span style="color: #008000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="color: #008000">//</span><span style="color: #008000">String[] s = new String[3,4];</span><span style="color: #008000"><br /> </span><span style="color: #008080">57</span><span style="color: #008000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">        System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">--------------</span><span style="color: #000000">"</span><span style="color: #000000">);<br /> </span><span style="color: #008080">58</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        String str1 </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">a</span><span style="color: #000000">"</span><span style="color: #000000">; <br /> </span><span style="color: #008080">59</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        String str2 </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">bc</span><span style="color: #000000">"</span><span style="color: #000000">; <br /> </span><span style="color: #008080">60</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        String str3 </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">a</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">bc</span><span style="color: #000000">"</span><span style="color: #000000">; <br /> </span><span style="color: #008080">61</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        String str4 </span><span style="color: #000000">=</span><span style="color: #000000"> str1</span><span style="color: #000000">+</span><span style="color: #000000">str2; <br /> </span><span style="color: #008080">62</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        String str5 </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">a</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">str2;<br /> </span><span style="color: #008080">63</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />           <br /> </span><span style="color: #008080">64</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(str3</span><span style="color: #000000">==</span><span style="color: #000000">str4); </span><span style="color: #008000">//</span><span style="color: #008000">f</span><span style="color: #008000"><br /> </span><span style="color: #008080">65</span><span style="color: #008000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">        System.out.println(str3</span><span style="color: #000000">==</span><span style="color: #000000">str5); </span><span style="color: #008000">//</span><span style="color: #008000">f</span><span style="color: #008000"><br /> </span><span style="color: #008080">66</span><span style="color: #008000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">        System.out.println(str3</span><span style="color: #000000">==</span><span style="color: #000000">str5); </span><span style="color: #008000">//</span><span style="color: #008000">f</span><span style="color: #008000"><br /> </span><span style="color: #008080">67</span><span style="color: #008000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">        str4 </span><span style="color: #000000">=</span><span style="color: #000000"> (str1</span><span style="color: #000000">+</span><span style="color: #000000">str2).intern(); <br /> </span><span style="color: #008080">68</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(str3</span><span style="color: #000000">==</span><span style="color: #000000">str4); </span><span style="color: #008000">//</span><span style="color: #008000">t</span><span style="color: #008000"><br /> </span><span style="color: #008080">69</span><span style="color: #008000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">        System.out.println(str3</span><span style="color: #000000">==</span><span style="color: #000000">str5.intern());</span><span style="color: #008000">//</span><span style="color: #008000">t</span><span style="color: #008000"><br /> </span><span style="color: #008080">70</span><span style="color: #008000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">        </span><span style="color: #000000"><br /> </span><span style="color: #008080">73</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /> </span><span style="color: #008080">74</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="color: #000000"><br /> </span><span style="color: #008080">75</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /> </span><span style="color: #008080">76</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br /> </span><span style="color: #008080">77</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><br /> </span><span style="color: #008080">78</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><br /> </span><span style="color: #008080">79</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><br /> </span><span style="color: #008080">80</span><span style="color: #000000"><img alt="" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span></div> <br /> <br /><img src ="http://www.tkk7.com/fhtdy2004/aggbug/268231.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-04-29 21:04 <a href="http://www.tkk7.com/fhtdy2004/archive/2009/04/29/268231.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://2023852.com" target="_blank">ƷžžþƵ</a>| <a href="http://bjbanjia01.com" target="_blank">ѹۿ</a>| <a href="http://selaohu.com" target="_blank">ĻСۺ</a>| <a href="http://qiyupu.com" target="_blank">aëƬ߿Ƭ</a>| <a href="http://zp0533.com" target="_blank">ۺƷ͵</a>| <a href="http://9ytx.com" target="_blank">˳ɵӰվɫwww</a>| <a href="http://ebanyou.com" target="_blank">ëƬ߲</a>| <a href="http://9xav.com" target="_blank">avۺ</a>| <a href="http://0827fang.com" target="_blank">ƷһʽӰ </a>| <a href="http://wwwav800.com" target="_blank">߾ƷƵѹۿ</a>| <a href="http://zgdhuibao.com" target="_blank">޾Ʒ</a>| <a href="http://www-xg5777.com" target="_blank">޹һ</a>| <a href="http://www-36664.com" target="_blank">˹վvƬѹۿ</a>| <a href="http://zxbj0471.com" target="_blank">av˾Ʒ</a>| <a href="http://zzmm88.com" target="_blank">Ƶ</a>| <a href="http://xianzznn.com" target="_blank">þAV뾫Ʒɫҹ </a>| <a href="http://ycjs999.com" target="_blank">߲ŹƵ</a>| <a href="http://wwwby1385.com" target="_blank">þAV뾫Ʒɫҹ</a>| <a href="http://bqjonline.com" target="_blank">޳avƬþ</a>| <a href="http://33sse.com" target="_blank">2019Ļֱ</a>| <a href="http://863409.com" target="_blank">޶ַ㶮</a>| <a href="http://cnpc1002.com" target="_blank">߿ƬѲ˳Ƶ</a>| <a href="http://taixin668.com" target="_blank">һëƬƬƵֻ</a>| <a href="http://455zx.com" target="_blank">ŷ޾þþƷ</a>| <a href="http://boyonet.com" target="_blank">պӰ</a>| <a href="http://2886868.com" target="_blank">һëƬƵվ</a>| <a href="http://9988u.com" target="_blank">ޡvþþ뾫Ʒ</a>| <a href="http://fenxue520.com" target="_blank">ĻƵѹۿƵ</a>| <a href="http://gylscm.com" target="_blank">޹ŷպƷһ</a>| <a href="http://51wdn.com" target="_blank">һëƬ߹ۿ</a>| <a href="http://zhaofeiz.com" target="_blank">aٰƵ</a>| <a href="http://102sds.com" target="_blank">Ʒۺ</a>| <a href="http://6668889.com" target="_blank">AVɫ˿</a>| <a href="http://xww678.com" target="_blank">Aר߹ۿq</a>| <a href="http://yulongfilm.com" target="_blank">?VþþƷ</a>| <a href="http://5gz0z.com" target="_blank">Ļ4</a>| <a href="http://gkhnf.com" target="_blank">Ѿþþþþ</a>| <a href="http://ssni703.com" target="_blank">޸ߵӰ</a>| <a href="http://011107.com" target="_blank">Ļк޴Ƭ</a>| <a href="http://www4438xx2.com" target="_blank">è˳վ߹ۿ</a>| <a href="http://8xjr.com" target="_blank">˾ѹۿ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>