﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-路漫漫其修远兮，吾将上下而求索-随笔分类-Java编程</title><link>http://www.blogjava.net/fhtdy2004/category/39225.html</link><description>经验浅薄，耐心积累；记性不好，记诸文字</description><language>zh-cn</language><lastBuildDate>Sat, 18 Jun 2011 22:12:44 GMT</lastBuildDate><pubDate>Sat, 18 Jun 2011 22:12:44 GMT</pubDate><ttl>60</ttl><item><title>t.interrupt(),t.isInterrupted(),Thread.interrupted()</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/08/22/292181.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Sat, 22 Aug 2009 03:07:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/08/22/292181.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/292181.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/08/22/292181.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/292181.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/292181.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在学校的论坛Java版发现很多问关于这样的问题，比如这几个方法有什么区别，想看t.interrupt()方法后线程的中断状态；如何终止一个线程其实之前已经大部分提及到。现总结一下，然后加上例子，毕竟例子容易理解http://www.blogjava.net/fhtdy2004/archive/2009/06/08/280728.html中有关interrupt()的解释已经很清楚了...&nbsp;&nbsp;<a href='http://www.blogjava.net/fhtdy2004/archive/2009/08/22/292181.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/292181.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-08-22 11:07 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/08/22/292181.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】线程中的默认异常处理</title><link>http://www.blogjava.net/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.blogjava.net/fhtdy2004/archive/2009/08/07/290215.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/290215.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/08/07/290215.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/290215.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/290215.html</trackback:ping><description><![CDATA[<blockquote>
<p>http://www.ibm.com/developerworks/cn/java/j-tiger08104/</p>
<p>跟踪无法预期的运行时异常可能是一件又慢又费力的事情，只获得默认线程名称和堆栈跟踪通常是不够的。在 <em>驯服 Tiger</em> 这一期专栏中，Java 开发人员 John Zukowski 向您展示了如何通过替代默认行为来定制输出。他还对比了通过细分 <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>虽然我们不想创建在无法预期时抛出运行时异常的程序，但这种情况还是会发生——尤其是第一次运行复杂程序时。通常是使用默认行为、打印堆栈溢出和结束线程的生命来处理这些异常。</p>
<p>从哪里发现默认行为？每个线程都属于一个由 <code>java.lang.ThreadGroup</code> 类表示的线程组。顾名思义，线程组允许您将线程组合在一起。您可能是为了方便而将线程组合，例如，一个线程池中的所有线程都属于组 X，而另一个池的所有线程则属于组 Y，或者是为了访问控制而将线程进行组合。组 X 中的线程无权访问或改变组 Y 中的线程，除非它们都在同一线程组内（或在一个子组内）。 </p>
<p>在 Tiger 之前， <code>ThreadGroup</code> 类提供了一种处理未捕获异常的方法： <code>ThreadGroup</code> 的 <code>uncaughtException()</code> 方法。如果异常不是 <code>ThreadDeath</code> ，则将线程的名称和堆栈回溯（stack backtrace）发送到 <code>System.err</code> 。但是 Tiger 添加了另一种方法： <code>Thread.UncaughtExceptionHandler</code> 接口。细分 <code>ThreadGroup</code> 或安装该新接口的实现都允许您更改默认行为。我们将对 Tiger 之前和之后提供的方法都进行研究。 </p>
<p><a name="1.0"><span class="atitle">使用 ThreadGroup 的定制行为</span></a></p>
<p>发生未捕获的异常时，默认行为是将堆栈溢出打印输出到系统错误（ <code>System.err</code> ）中，如清单 1 中所示。不需要使用任何命令参数来启动程序。 </p>
<br />
<a name="list1"><strong>清单 1. 线程溢出示例</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>不使用任何参数运行该程序将生成清单 2 中的输出。尽管它不是一个很长的堆栈跟踪，但它是一个完整的堆栈跟踪。</p>
<br />
<a name="list2"><strong>清单 2. 默认线程溢出输出</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 平台的许多东西一样，如果不喜欢默认行为，您可以对其进行更改。在 Java 平台的 Tiger 版以前的版本中，不能替代所有线程的默认行为，但是可以创建一个新的 <code>ThreadGroup</code> ，并更改在该组内创建的任何线程的默认行为。您可以重写 <code>uncaughtException(Thread t, Throwable e)</code> 方法来定制该行为。然后，当发生未预料的运行时异常时，该线程组内创建的任何线程都将获得新的行为。不过，最好是修复基础问题，我将提供一个简单的示例，说明更改默认行为所必需的步骤。清单 3 展示了将执行代码放入新线程的调整过的测试程序： </p>
<br />
<a name="list3"><strong>清单 3. 调整过的线程溢出示例</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> 类是一个新的内容，清单 4 中显示了它的定义。为了进行说明，通过重写 <code>uncaughtException()</code> 方法实现的特殊行为将在一个弹出窗口中显示该异常，这项操作是在特殊 <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>这里创建的定制 <code>Handler</code> 的类型为 <code>LoggingWindowHandler</code> ，该类型的定义在清单 5 中。处理程序使用了一个支持类 <code>LoggingWindow</code> ，该类将异常显示在屏幕上。 <a href="http://www.ibm.com/developerworks/cn/java/j-tiger08104/#list6" cmimpressionsent="1">清单 6</a> 中显示了该类的定义。 <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 href="http://www.ibm.com/developerworks/cn/java/j-tiger08104/#list3" cmimpressionsent="1">清单 3</a> 中的 <code>WindowDump</code> 程序将出现图 1 中的屏幕。因为没有从 <code>Logger</code> 中删除控制台处理程序，所以堆栈溢出仍将出现在控制台上。 </p>
<br />
<a name="N10145"><strong>图 1. 记录的堆栈跟踪</strong></a><br />
<img height="200" alt="记录的堆栈跟踪" src="http://www.ibm.com/developerworks/cn/java/j-tiger08104/stack.jpg" width="400" /> <br />
<p>发生运行时异常时，可能要做许多工作来更改发生的问题。该代码的大部分都是 Logging Handler，但是，要执行更改，就必须细分 <code>ThreadGroup</code> ，重写 <code>uncaughtException()</code> ，然后在该线程组中执行您的线程。不过，让我们通过只安装 <code>Thread.UncaughtExceptionHandler</code> ，来看一看 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" href="http://www.ibm.com/developerworks/cn/java/j-tiger08104/#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="2.0"><span class="atitle">使用 UncaughtExceptionHandler 的定制行为</span></a></p>
<p>对于 Tiger， <code>Thread</code> 类定义中添加了一个新的公共内部类 <code>UncaughtExceptionHandler</code> ，更完整的名称为 <code>Thread.UncaughtExceptionHandler</code> （其他类访问内部类时需要使用完整名称）。接口的定义是一个方法，如图 7 中所示： </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>您可能没有注意到，清单 7 中的方法与我们前面重写的 <code>ThreadGroup</code> 的方法相同。实际上，现在由 <code>ThreadGroup</code> 类实现该接口。 </p>
<p>新的内部类可以帮助我们了解下列两对新方法，并有助于我们在 <code>Thread</code> 中使用它们： </p>
<ul>
    <li><code>getUncaughtExceptionHandler()</code> 和 <code>setUncaughtExceptionHandler()</code> 。
    <li><code>getDefaultUncaughtExceptionHandler()</code> 和 <code>setDefaultUncaughtExceptionHandler()</code> 。 </li>
</ul>
<p>第一对方法是 <code>getUncaughtExceptionHandler()</code> 和 <code>setUncaughtExceptionHandler()</code> ，它们允许您为当前线程及其后代定制行为，从而允许二十或更多的线程拥有自己的定制行为。不过，您更可能使用第二对方法 <code>getDefaultUncaughtExceptionHandler()</code> 和 <code>setDefaultUncaughtExceptionHandler()</code> 。如果使用第二对方法设置默认处理程序，那么没有自己的异常处理程序的所有线程都将使用默认处理程序。 </p>
<p>听起来好像很简单。为了进行说明，清单 8 转换了 <a href="http://www.ibm.com/developerworks/cn/java/j-tiger08104/#list3" cmimpressionsent="1">清单 3</a> 中的 <code>ThreadGroup</code> 友好的程序，使用新的 <code>UncaughtExceptionHandler</code> 接口： </p>
<br />
<a name="list8"><strong>清单 8. UncaughtExceptionHandler 示例</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> ，并没有创建新的处理程序实现。请注意，与原来的代码相比，新代码要简洁得多。 </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" href="http://www.ibm.com/developerworks/cn/java/j-tiger08104/#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="3.0"><span class="atitle">其他线程更改</span></a></p>
<p><code>Thread</code> 类不仅支持使用 Tiger 添加的未捕获异常处理程序，它还支持使用 <code>getAllStackTraces()</code> 获得所有有效线程的堆栈跟踪，或者支持使用 <code>getStackTrace()</code> 来只获得当前线程的堆栈跟踪。这两种堆栈跟踪都返回类型为 <code>java.lang.StackTraceElement</code> 的对象， <code>java.lang.StackTraceElement</code> 是 Java 1.4 平台中添加的一个类，它可以让您生成自己的堆栈跟踪。同时，Java 5 平台新添加的功能是一个惟一线程标识符（可以使用 <code>getId()</code> 获得该标识符）和一个新的 <code>Thread.State</code> 类，以及与该类相关的 <code>getThreadState()</code> 方法。最后一个线程更改是一个状态枚举表，该表是用来监视系统状态，而不是用来同步状态的。 </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" href="http://www.ibm.com/developerworks/cn/java/j-tiger08104/#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="4.0"><span class="atitle">结束语</span></a></p>
<p>像添加未捕获的异常处理程序这样的简单库更改，可以极大地增加原代码的可理解性。虽然在线程组级别上，新的库代码的功能与原来库代码的相同，但新模型中的易用性和灵活性远远超出了将代码调整为更新的方式所需的时间。当然，老方法仍然可以使用，但最好将代码更新为最新的库功能。</p>
 <img src ="http://www.blogjava.net/fhtdy2004/aggbug/290215.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-08-07 13:15 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/08/07/290215.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中主线程如何捕获子线程抛出的异常</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/08/07/290210.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Fri, 07 Aug 2009 04:38:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/08/07/290210.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/290210.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/08/07/290210.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/290210.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/290210.html</trackback:ping><description><![CDATA[这么来看待这个问题。首先明确线程代码的边界。其实很简单，Runnable接口的run方法所界定的边界就可以看作是线程代码的边界。Runnable接口中run方法原型如下： &nbsp; <br />
&nbsp; &lt;&lt; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public &nbsp; void &nbsp; run(); &nbsp; <br />
&nbsp; &gt;&gt; &nbsp; <br />
&nbsp; 而所有的具体线程都实现这个方法，所以这里就明确了一点，线程代码不能抛出任何checked异常。所有的线程中的checked异常都只能被线程本身消化掉。:) &nbsp; 这样本身也是符合线程的设计理念的，线程本身就是被看作独立的执行片断，它应该对自己负责，所以由它来消化所有的checked异常是很正常的。 &nbsp; <br />
&nbsp; 这样就回答了楼主的第一个问题：checked异常一定要在线程内部消化。 &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; 但是，线程代码中是可以抛出错误(Error)和运行级别异常(RuntimeException)的。Error俺们可以忽略，因为通常Error是应该留给vm的，而RuntimeException确是比较正常的，如果在运行过程中满足了某种条件导致线程必须中断，可以选择使用抛出运行级别异常来处理，如下： &nbsp; <br />
&nbsp; &lt;&lt; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public &nbsp; void &nbsp; run() &nbsp; { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if &nbsp; (...) &nbsp; throw &nbsp; new &nbsp; RuntimeException(); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; &gt;&gt; &nbsp; <br />
&nbsp; 当线程代码抛出运行级别异常之后，线程会中断。:)这点java中解释得很清楚： &nbsp; <br />
&nbsp; &lt;&lt; &nbsp; @see &nbsp; Thread &nbsp; <br />
&nbsp; All &nbsp; threads &nbsp; that &nbsp; are &nbsp; not &nbsp; daemon &nbsp; threads &nbsp; have &nbsp; died, &nbsp; either &nbsp; by &nbsp; returning &nbsp; from &nbsp; the &nbsp; call &nbsp; to &nbsp; the &nbsp; run &nbsp; method &nbsp; or &nbsp; "by &nbsp; throwing &nbsp; an &nbsp; exception &nbsp; that &nbsp; propagates &nbsp; beyond &nbsp; the &nbsp; run &nbsp; method". &nbsp; &nbsp; <br />
&nbsp; &gt;&gt; &nbsp; <br />
&nbsp; 但是对于invoke此线程的主线程会产生什么影响呢？主线程不受这个影响，不会处理这个RuntimeException，而且根本不能catch到这个异常。会继续执行自己的代码 &nbsp; :) &nbsp; <br />
&nbsp; 所以得到结论：线程方法的异常只能自己来处理。 &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; 关于最后一点，不相信的话大家可以做这么一个试验： &nbsp; <br />
&nbsp; &lt;&lt; &nbsp; <br />
&nbsp; public &nbsp; class &nbsp; TestThreadException &nbsp; extends &nbsp; Thread &nbsp; { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public &nbsp; void &nbsp; run() &nbsp; { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw &nbsp; new &nbsp; RuntimeException(); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public &nbsp; static &nbsp; void &nbsp; main(String[] &nbsp; args) &nbsp; throws &nbsp; InterruptedException &nbsp; { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try &nbsp; { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new &nbsp; TestThreadException().start(); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; catch(RuntimeException &nbsp; ex) &nbsp; { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // &nbsp; 看看能不能到达这里？ &nbsp; :) &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Thread.sleep(1000); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // &nbsp; 看看能不能到达这里？ &nbsp; :) &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &gt;&gt;&nbsp;&nbsp; <br />
<br />
<br />
<span style="color: red">记不得在哪里看到的代码，可以处理到线程中抛出的RuntimeException： &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; class &nbsp; ApplicationLoader &nbsp; extends &nbsp; ThreadGroup &nbsp; <br />
&nbsp; { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private &nbsp; ApplicationLoader() &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; super("ApplicationLoader"); &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public &nbsp; static &nbsp; void &nbsp; main(String[] &nbsp; args) &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Runnable &nbsp; appStarter &nbsp; = &nbsp; new &nbsp; Runnable() &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public &nbsp; void &nbsp; run() &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //invoke &nbsp; your &nbsp; application &nbsp; (i.e.MySystem.main(args) &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw &nbsp; new &nbsp; NullPointerException(); &nbsp; //example, &nbsp; throw &nbsp; a &nbsp; runtime &nbsp; exception &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new &nbsp; Thread(new &nbsp; ApplicationLoader(), &nbsp; appStarter).start(); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //We &nbsp; overload &nbsp; this &nbsp; method &nbsp; from &nbsp; our &nbsp; parent &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //ThreadGroup &nbsp; , &nbsp; which &nbsp; will &nbsp; make &nbsp; sure &nbsp; that &nbsp; it &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //gets &nbsp; called &nbsp; when &nbsp; it &nbsp; needs &nbsp; to &nbsp; be. &nbsp; &nbsp; This &nbsp; is &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //where &nbsp; the &nbsp; magic &nbsp; occurs. &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public &nbsp; void &nbsp; uncaughtException(Thread &nbsp; thread, &nbsp; Throwable &nbsp; exception) &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Handle &nbsp; the &nbsp; error/exception. &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Typical &nbsp; operations &nbsp; might &nbsp; be &nbsp; displaying &nbsp; a &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //useful &nbsp; dialog, &nbsp; writing &nbsp; to &nbsp; an &nbsp; event &nbsp; log, &nbsp; etc. &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exception.printStackTrace();//example, &nbsp; print &nbsp; stack &nbsp; trace &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; }&nbsp;&nbsp; <br />
</span><br />
<br />
呵呵，uncaughtException好像是唯一能够处理线程抛出的uncaught异常的入口。看来还是有细心人啊。确实如此，通过ThreadGroup的uncaughtException方法还是有处理的机会。当线程抛出uncaughtException的时候，JVM会调用ThreadGroup的此方法。默认的处理如下： &nbsp; <br />
&nbsp; &lt;&lt; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public &nbsp; void &nbsp; uncaughtException(Thread &nbsp; t, &nbsp; Throwable &nbsp; e) &nbsp; { &nbsp; <br />
&nbsp; if &nbsp; (parent &nbsp; != &nbsp; null) &nbsp; { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; parent.uncaughtException(t, &nbsp; e); &nbsp; <br />
&nbsp; } &nbsp; else &nbsp; if &nbsp; (!(e &nbsp; instanceof &nbsp; ThreadDeath)) &nbsp; { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace(System.err); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; &gt;&gt; &nbsp; <br />
&nbsp; 每个Thread都会有一个ThreadGroup对象，可以通过Thread.getThreadGroup()方法得到，提供了上述默认的uncaught异常处理方法。 &nbsp; <br />
&nbsp; 上面没有提这点，因为俺认为在正常的情况下，这个方法的处理情况就已经足够了。还是那个线程设计的理念：&#8220;线程的问题应该线程自己本身来解决，而不要委托到外部。&#8221;通常情况下，外部不需要处理线程的异常。当然也有例外。:)&nbsp;&nbsp;
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/290210.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-08-07 12:38 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/08/07/290210.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】Java1.5泛型指南中文版(Java1.5 Generic Tutorial) </title><link>http://www.blogjava.net/fhtdy2004/archive/2009/07/27/288633.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Mon, 27 Jul 2009 12:50:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/07/27/288633.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/288633.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/07/27/288633.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/288633.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/288633.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Java1.5泛型指南中文版(Java1.5 Generic Tutorial)英文版pdf下载链接：http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf终于翻译完了，感觉挺累！译文有些地方可能有误或者不准确，所以保留了一些原文，对于重要的地方，也保留原文以助理解，欢迎来信指正或讨论，mailto:chengchengji@163.c...&nbsp;&nbsp;<a href='http://www.blogjava.net/fhtdy2004/archive/2009/07/27/288633.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/288633.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-07-27 20:50 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/07/27/288633.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java集合类小结</title><link>http://www.blogjava.net/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.blogjava.net/fhtdy2004/archive/2009/07/16/286932.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/286932.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/07/16/286932.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/286932.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/286932.html</trackback:ping><description><![CDATA[Java集合类小结
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/286932.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-07-16 00:01 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/07/16/286932.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java反射机制学习小结</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286024.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Thu, 09 Jul 2009 02:08:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286024.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/286024.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286024.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/286024.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/286024.html</trackback:ping><description><![CDATA[<p>先留着</p>
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/286024.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-07-09 10:08 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286024.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Hashtable分析</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/07/03/285330.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Fri, 03 Jul 2009 05:24:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/07/03/285330.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/285330.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/07/03/285330.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/285330.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/285330.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Hashtable的结构，采用的是数据结构中所说的链地址法处理冲突的方法从上面的结构图可以看出，Hashtable的实质就是一个数组＋链表。图中的Entry就是链表的实现，Entry的结构中包含了对自己的另一个实例的引用next，用以指向另外一个Entry。而图中标有数字的部分是一个Entry数组，数字就是这个Entry数组的index。那么往Hashtable增加键值对的时候，ind...&nbsp;&nbsp;<a href='http://www.blogjava.net/fhtdy2004/archive/2009/07/03/285330.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/285330.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-07-03 13:24 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/07/03/285330.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 内存模型及 volatile关键字语义</title><link>http://www.blogjava.net/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.blogjava.net/fhtdy2004/archive/2009/06/28/284435.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/284435.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/06/28/284435.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/284435.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/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 />
还得了解一下Java内存模型。。。<br />
<br />
看了一下Java虚拟机规范，就比较清楚了<br />
<br />
</p>
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/284435.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-06-28 00:50 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/06/28/284435.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]J2EE项目异常处理</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/06/24/283881.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Wed, 24 Jun 2009 02:29:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/06/24/283881.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/283881.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/06/24/283881.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/283881.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/283881.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 被ibm给鄙视后，好好看了一下Java的异常机制，的确自己太弱了，很多东西之前都没有仔细的去了解研究。同时自己也确实没有什么special的地方。下一步准备在放假之前好好研究一下Java网络编程，nio,mina以前虽然用了下也没有深入。暑期不找实习了，学学Linux编程和ACE，再复习一下基础好好充一下电，现在是笔试都过不了。转帖地址http://www.javaeye.com/to...&nbsp;&nbsp;<a href='http://www.blogjava.net/fhtdy2004/archive/2009/06/24/283881.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/283881.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-06-24 10:29 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/06/24/283881.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java transient关键字</title><link>http://www.blogjava.net/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.blogjava.net/fhtdy2004/archive/2009/06/20/286112.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/286112.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/06/20/286112.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/286112.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/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.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">Volatile修饰的成员变量在每次被线程访问时，都强迫从主内存中重读该成员变量的值。而且，当成员变量发生变化时，强迫线程将变化值回写到主内存。这样在任何时刻，两个不同的线程总是看到某个成员变量的同一个值。&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Java语言规范中指出：为了获得最佳速度，允许线程保存共享成员变量的私有拷贝，而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />这样当多个线程同时与某个对象交互时，就必须要注意到要让线程及时的得到共享成员变量的变化。&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />而volatile关键字就是提示VM：对于这个成员变量不能保存它的私有拷贝，而应直接与共享成员变量交互。&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />使用建议：在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中，或者为常量时，不必使用。&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />由于使用volatile屏蔽掉了VM中必要的代码优化，所以在效率上比较低，因此一定在必要时才使用此关键字。&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;<br />
<strong><span style="color: red"><strong><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />java关键字Transient</strong>&nbsp;&nbsp;&nbsp;</span></strong><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/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/&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />翻译自http:</span><span style="color: #008000">//</span><span style="color: #008000">www.devx.com/tips/Tip/13726。&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;<br />
<span style="color: red"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Java的serialization提供了一种持久化对象实例的机制。当持久化对象时，可能有一个特殊的对象数据成员，我们不想&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization，可以在这个域前加上关键字transient。&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />transient是Java语言的关键字，用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候，transient型变量的值不包括在串行化的表示中，然而非transient型的变量是被包括进去的。&nbsp;&nbsp;<br />
</span><span style="color: red"><strong style="color: red"><span style="color: #000000"><strong>注意static变量也是可以串行化的&nbsp;</strong><br />
</span></strong></span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />首先，让我们看一些Java&nbsp;serialization的代码：&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;LoggingInfo&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;java.io.Serializable&nbsp;&nbsp;&nbsp;<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.blogjava.net/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.blogjava.net/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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_929_1579_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Date&nbsp;loggingDate&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Date();&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;uid;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">transient</span><span style="color: #000000">&nbsp;String&nbsp;pwd;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;LoggingInfo(String&nbsp;user,&nbsp;String&nbsp;password)&nbsp;&nbsp;&nbsp;<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.blogjava.net/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.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1104_1163_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uid&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;user;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pwd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;password;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;toString()&nbsp;&nbsp;&nbsp;<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.blogjava.net/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.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1204_1574_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;password</span><span style="color: #000000">=</span><span style="color: #0000ff">null</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(pwd&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;&nbsp;&nbsp;<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.blogjava.net/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.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1277_1323_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;password&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">NOT&nbsp;SET</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;&nbsp;<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.blogjava.net/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.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1351_1395_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;password&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pwd;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">logon&nbsp;info:&nbsp;\n&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">user:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;uid&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">\n&nbsp;&nbsp;&nbsp;logging&nbsp;date&nbsp;:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;loggingDate.toString()&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">\n&nbsp;&nbsp;&nbsp;password:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;password;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />现在我们创建一个这个类的实例，并且串行化(serialize)它&nbsp;,然后将这个串行化对象写如磁盘。&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />LoggingInfo&nbsp;logInfo&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;LoggingInfo(</span><span style="color: #000000">"</span><span style="color: #000000">MIKE</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">MECHANICS</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />System.out.println(logInfo.toString());&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;&nbsp;<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.blogjava.net/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.blogjava.net/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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1755_1917_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;ObjectOutputStream&nbsp;o&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ObjectOutputStream(&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileOutputStream(</span><span style="color: #000000">"</span><span style="color: #000000">logInfo.out</span><span style="color: #000000">"</span><span style="color: #000000">));&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;o.writeObject(logInfo);&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;o.close();&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<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.blogjava.net/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.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception&nbsp;e)&nbsp;</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.blogjava.net/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&nbsp;with&nbsp;exception}&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />To&nbsp;read&nbsp;the&nbsp;object&nbsp;back,&nbsp;we&nbsp;can&nbsp;write&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;&nbsp;<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.blogjava.net/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.blogjava.net/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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_2021_2237_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;ObjectInputStream&nbsp;in&nbsp;</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ObjectInputStream(&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileInputStream(</span><span style="color: #000000">"</span><span style="color: #000000">logInfo.out</span><span style="color: #000000">"</span><span style="color: #000000">));&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;LoggingInfo&nbsp;logInfo&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(LoggingInfo)in.readObject();&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;System.out.println(logInfo.toString());&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<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.blogjava.net/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.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception&nbsp;e)&nbsp;</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.blogjava.net/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&nbsp;with&nbsp;exception}&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />如果我们运行这段代码，我们会注意到从磁盘中读回(read——back&nbsp;(de</span><span style="color: #000000">-</span><span style="color: #000000">serializing))的对象打印password为</span><span style="color: #000000">"</span><span style="color: #000000">NOT&nbsp;SET</span><span style="color: #000000">"</span><span style="color: #000000">。这是当我们定义pwd域为transient时，所期望的正确结果。&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />现在，让我们来看一下粗心对待transient域可能引起的潜在问题。假设我们修改了类定义，提供给transient域一个默认值，&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />代码如下：&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;GuestLoggingInfo&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;java.io.Serializable&nbsp;&nbsp;&nbsp;<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.blogjava.net/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.blogjava.net/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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_2548_2844_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Date&nbsp;loggingDate&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Date();&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;uid;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">transient</span><span style="color: #000000">&nbsp;String&nbsp;pwd;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;GuestLoggingInfo()&nbsp;&nbsp;&nbsp;<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.blogjava.net/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.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_2700_2761_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uid&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">guest</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pwd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">guest</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;toString()&nbsp;&nbsp;&nbsp;<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.blogjava.net/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.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_2802_2839_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">same&nbsp;as&nbsp;above&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><strong>现在，如果我们穿行化GuestLoggingInfo的一个实例，将它写入磁盘，并且再将它从磁盘中读出，我们仍然看到读回的对象打印password&nbsp;为&nbsp;</strong></span><strong><span style="color: #000000">"</span><span style="color: #000000">NOT&nbsp;SET</span><span style="color: #000000">"</span></strong><span style="color: #000000"><strong>。当从磁盘中读出某个类的实例时，实际上并不会执行这个类的构造函数，&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />而是载入了一个该类对象的持久化状态，并将这个状态赋值给该类的另一个对象。&nbsp;&nbsp;<br />
</strong><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span></div>
</span></span>
 <img src ="http://www.blogjava.net/fhtdy2004/aggbug/286112.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-06-20 18:23 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/06/20/286112.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Serializable小结</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/06/20/286933.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Sat, 20 Jun 2009 10:00:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/06/20/286933.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/286933.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/06/20/286933.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/286933.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/286933.html</trackback:ping><description><![CDATA[   <img src ="http://www.blogjava.net/fhtdy2004/aggbug/286933.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-06-20 18:00 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/06/20/286933.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java.io.Serializable与java.io.Externalizable的比较</title><link>http://www.blogjava.net/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.blogjava.net/fhtdy2004/archive/2009/06/20/283372.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/283372.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/06/20/283372.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/283372.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/283372.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当两个进程在进行远程通信时，无论是何种类型的数据，都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列，才能在网络上传送，称为对象的序列化；接收方则需要把字节序列再恢复为Java对象，称为对象的反序列化。 只有实现了Serializable和Externalizable接口的类的对象才能被序列化，而Extern...&nbsp;&nbsp;<a href='http://www.blogjava.net/fhtdy2004/archive/2009/06/20/283372.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/283372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-06-20 17:43 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/06/20/283372.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】避免在Java中使用Checked Exception</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/06/20/283358.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Sat, 20 Jun 2009 07:49:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/06/20/283358.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/283358.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/06/20/283358.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/283358.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/283358.html</trackback:ping><description><![CDATA[<font size="4"><span><font color="#0000ff">
<p><span style="color: #000000">Java 提供了两种Exception 的模式，一种是执行的时候所产生的Exception (Runtime Exception)，另外一种则是受控制的Exception (Checked Exception)。</span></p>
<p><span style="color: #000000">所有的Checked Exception 均从java.lang.Exception 继承而来，而Runtime Exception 则继承java.lang.RuntimeException 或java.lang.Error (实际上java.lang.RuntimeException 的上一层也是java.lang.Exception，这说明作为exception两者并没有本质的区别，只是java语言本身从功能考虑有所区分，这才导致下面提到的不同点)。</span></p>
<p><span style="color: #000000">一个函数如果会抛出Checked Exception ，（这里包含两种情况，一个是函数本身抛出，另外一种是它调用的函数会抛出Checked Exception 但是它并没有去catch这个exception），那在声明此函数的时候必须标明throws XXXException()。而Runtime Exception不需要如此声明。</span></p>
<p><span style="color: #000000">逻辑上看，Runtime Exception 与Checked Exception 使用目的不一样。一般而言，Checked Exception 表示这个Exception 必须要被处理，也就是说程序设计者应该已经知道可能会收到某个Exception(因为要try catch住) ，所以程序设计者应该能也必须（或者标明throws XXXException()继续抛出去，或者try catch处理，不然是编译不过的）针对这些不同的Checked Exception 做出不同的处理。而Runtime Exception 通常会暗示着程序上的错误，这种错误会导致程序设计者无法处理，而造成程序无法继续执行下去（可以try catch处理而避免程序挂掉，但是这常常会掩盖问题所在）。</span></p>
<p><br />
<span style="color: #000000">checked exception由于必须被处理，会给程序员带来额外的麻烦，试想一个函数a，它会调用到b1，b2...，b9一共9个函数，这些函数每个都会抛出checked exception，而a函数里面又没有办法处理这些exception，那在声明a函数的时候就必须连写9个throw xxxException，够累的！！然而这仅仅是问题的一个方面，所以下面这篇文章试图说服我们尽量使用runtime exception替代checked exception(前面提到可以try catch处理runtime exception，而避免程序挂掉，这也是这样做的一个前提)。</span><br />
</p>
</font></span></font>
<p style="margin: 0cm 0cm 0pt"><em><font size="4"><font face="Arial">这篇文章指出了Java中checked Exception的一些缺点，提出应该在程序设计中避免使用checked Exception,对于需要处理checked Exception的代码，可以使用ExceptionAdapter这个类对checked Exception进行包装。这篇文章的概念和ExceptionAdapter这个类均源自Bruce Eckel的Does Java need Checked Exception。<br />
<br />
<br />
Java</font>的<font face="Arial">Exception</font>分为两类，一类是<font face="Arial">RuntimeException</font>及其子类，另外一类就是<font face="Arial">checked Exception</font>。<font face="Arial">Java</font>要求函数对没有被<font face="Arial">catch</font>处理掉的<font face="Arial">checked Exception</font>，需要将其写在函数的声明部分。然而，这一要求常常给程序员带来一些不必要的负担。</font></em></p>
<p style="margin: 0cm 0cm 0pt"><em><font size="4">为了避免在函数声明中写<font face="Arial">throws</font>部分，在<font face="Arial">Java</font>项目里面常常可以看到以下代码用来&#8216;吞掉&#8217;<font face="Arial">Exception</font></font></em><span><em><font size="4">：<br />
</font></em></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"><img id="Codehighlighter1_5_17_Open_Image" onclick="this.style.display='none'; Codehighlighter1_5_17_Open_Text.style.display='none'; Codehighlighter1_5_17_Closed_Image.style.display='inline'; Codehighlighter1_5_17_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_5_17_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_5_17_Closed_Text.style.display='none'; Codehighlighter1_5_17_Open_Image.style.display='inline'; Codehighlighter1_5_17_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_5_17_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_5_17_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span style="color: #008000"><br />
<img id="Codehighlighter1_40_77_Open_Image" onclick="this.style.display='none'; Codehighlighter1_40_77_Open_Text.style.display='none'; Codehighlighter1_40_77_Closed_Image.style.display='inline'; Codehighlighter1_40_77_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_40_77_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_40_77_Closed_Text.style.display='none'; Codehighlighter1_40_77_Open_Image.style.display='inline'; Codehighlighter1_40_77_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;ex)&nbsp;</span><span id="Codehighlighter1_40_77_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_40_77_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<p style="margin: 0cm 0cm 0pt"><br />
</span></p>
<p style="margin: 0cm 0cm 0pt"><em><font size="4">这显然不是一个好的处理<font face="Arial">Exception</font>办法，事实上，<font face="Arial">catch</font>并处理一个<font face="Arial">Exception</font>意味着让程序从发生的错误<font face="Arial">(Exception)</font>中恢复过来。从这种意义上说，已上的代码只可能在一些很简单的情况下工作而不带来问题。</font></em></p>
<p style="margin: 0cm 0cm 0pt"><em><font size="4">对于很多<font face="Arial">Exception</font>，往往没有去处理它并让程序从错误中恢复出来的办法，这时唯一能做的事情可能就是在界面上显示一些提示信息给用户。这种情况下让程序抛出遇到的<font face="Arial">Exception</font>是更为合理的做法。然而，这样做会使得一些函数的声明急剧膨胀。一个函数可能需要声明会抛出的<font face="Arial">7</font>、<font face="Arial">8</font>个<font face="Arial">checked Exception</font>，而且每个调用它的函数也需要同样的声明。</font></em></p>
<p style="margin: 0cm 0cm 0pt"><em><font size="4">比这更糟糕的是，这有可能破坏类设计的<font face="Arial">open-close</font>原则。简单来说，<font face="Arial">open-close</font>原则是指当扩展一个模块的时候，可以不影响其现有的<font face="Arial">client</font>。<font face="Arial">open-close</font>原则是通过继承来实现的，当继承一个类的时候，我们既扩展了这个类，也不会影响原有的<font face="Arial">client</font>（因为对这个类没有改动）。</font></em></p>
<p style="margin: 0cm 0cm 0pt"><em><font size="4">现在考虑下面这种情况，有一个父类<font face="Arial">Base</font>：</font></em></p>
<p style="margin: 0cm 0cm 0pt">&nbsp;</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"><img id="Codehighlighter1_18_82_Open_Image" onclick="this.style.display='none'; Codehighlighter1_18_82_Open_Text.style.display='none'; Codehighlighter1_18_82_Closed_Image.style.display='inline'; Codehighlighter1_18_82_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_18_82_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_18_82_Closed_Text.style.display='none'; Codehighlighter1_18_82_Open_Image.style.display='inline'; Codehighlighter1_18_82_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Base&nbsp;</span><span id="Codehighlighter1_18_82_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_18_82_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_60_80_Open_Image" onclick="this.style.display='none'; Codehighlighter1_60_80_Open_Text.style.display='none'; Codehighlighter1_60_80_Closed_Image.style.display='inline'; Codehighlighter1_60_80_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_60_80_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_60_80_Closed_Text.style.display='none'; Codehighlighter1_60_80_Open_Image.style.display='inline'; Codehighlighter1_60_80_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;foo()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;ExceptionA&nbsp;</span><span id="Codehighlighter1_60_80_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_60_80_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<p style="margin: 0cm 0cm 0pt">&nbsp;</p>
<p style="margin: 0cm 0cm 0pt"><em><font size="4">现在需要继承<font face="Arial">Base</font>这个类并重载<font face="Arial">foo</font>这个方法，在新的实现中，<font face="Arial">foo</font>可能抛出<font face="Arial">ExceptionB</font></font></em><span><em><font size="4">：<br />
</font></em></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"><img id="Codehighlighter1_33_97_Open_Image" onclick="this.style.display='none'; Codehighlighter1_33_97_Open_Text.style.display='none'; Codehighlighter1_33_97_Closed_Image.style.display='inline'; Codehighlighter1_33_97_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_33_97_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_33_97_Closed_Text.style.display='none'; Codehighlighter1_33_97_Open_Image.style.display='inline'; Codehighlighter1_33_97_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Extend&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Base&nbsp;</span><span id="Codehighlighter1_33_97_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_33_97_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_75_95_Open_Image" onclick="this.style.display='none'; Codehighlighter1_75_95_Open_Text.style.display='none'; Codehighlighter1_75_95_Closed_Image.style.display='inline'; Codehighlighter1_75_95_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_75_95_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_75_95_Closed_Text.style.display='none'; Codehighlighter1_75_95_Open_Image.style.display='inline'; Codehighlighter1_75_95_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;foo()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;ExceptionB&nbsp;</span><span id="Codehighlighter1_75_95_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_75_95_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<p style="margin: 0cm 0cm 0pt"><br />
</span></p>
<p style="margin: 0cm 0cm 0pt"><em><font size="4">然而，这样写在<font face="Arial">Java</font>里面是不合法的，<span style="color: red"><em><font size="4">尽管<font face="Arial">Java</font>不会抛出的<font face="Arial">Exception</font>看作函数特征的一部分，但子类声明抛出的<font face="Arial">Exception</font>必须是父类的子集。<br />
</font></em></span></font></em><em><font size="4">可以在<font face="Arial">Base</font>类的<font face="Arial">foo</font>方法中加入抛出<font face="Arial">ExceptionB</font>的声明，然而，这样就破坏了<font face="Arial">open-close</font>原则。而且，有时我们没有办法去修改父类，比如当重载一个<font face="Arial">Jdk</font>里的类的时候。</font></em></p>
<p style="margin: 0cm 0cm 0pt"><em><font size="4">另一个可能的做法是在<font face="Arial">Extend</font>的<font face="Arial">foo</font>方法中<font face="Arial">catch</font>住<font face="Arial">ExceptionB</font>，然后构造一个<font face="Arial">ExceptionA</font>并抛出。这是个可行的办法但也只是一个权宜之计。</font></em></p>
<p style="margin: 0cm 0cm 0pt"><em><font size="4">如果使用<font face="Arial">RuntimeException</font>，这些问题都不会存在。这说明<font face="Arial">checked Exception</font>并不是一个很实用的概念，也意味着在程序设计的时候，我们应该让自己的<font face="Arial">Exception</font>类继承<font face="Arial">RuntimeException</font>而不是<font face="Arial">Exception</font>。（这和<font face="Arial">JDK</font>的建议正好相反，但实践证明这样做代码的质量更好。）</font></em></p>
<p style="margin: 0cm 0cm 0pt"><em><font size="4">对于那些需要处理<font face="Arial">checked Exception</font>的代码，可以利用一个<font face="Arial">ExceptionAdapter</font>的类把<font face="Arial">checked Exception</font>包装成一个<font face="Arial">RuntimeException</font>抛出。<font face="Arial">ExceptionAdapter</font>来自<font face="Arial">Bruce Eckel</font>的<font face="Arial">Does Java need Checked Exception</font>这篇文章，<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"><img id="Codehighlighter1_55_480_Open_Image" onclick="this.style.display='none'; Codehighlighter1_55_480_Open_Text.style.display='none'; Codehighlighter1_55_480_Closed_Image.style.display='inline'; Codehighlighter1_55_480_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_55_480_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_55_480_Closed_Text.style.display='none'; Codehighlighter1_55_480_Open_Image.style.display='inline'; Codehighlighter1_55_480_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ExceptionAdapter&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;RuntimeException&nbsp;</span><span id="Codehighlighter1_55_480_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_55_480_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_100_126_Open_Image" onclick="this.style.display='none'; Codehighlighter1_100_126_Open_Text.style.display='none'; Codehighlighter1_100_126_Closed_Image.style.display='inline'; Codehighlighter1_100_126_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_100_126_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_100_126_Closed_Text.style.display='none'; Codehighlighter1_100_126_Open_Image.style.display='inline'; Codehighlighter1_100_126_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;ExceptionAdapter(Exception&nbsp;ex)&nbsp;</span><span id="Codehighlighter1_100_126_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_100_126_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">(ex);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_184_232_Open_Image" onclick="this.style.display='none'; Codehighlighter1_184_232_Open_Text.style.display='none'; Codehighlighter1_184_232_Closed_Image.style.display='inline'; Codehighlighter1_184_232_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_184_232_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_184_232_Closed_Text.style.display='none'; Codehighlighter1_184_232_Open_Image.style.display='inline'; Codehighlighter1_184_232_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;printStackTrace(java.io.PrintStream&nbsp;s)&nbsp;</span><span id="Codehighlighter1_184_232_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_184_232_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getCause().printStackTrace(s);&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_290_336_Open_Image" onclick="this.style.display='none'; Codehighlighter1_290_336_Open_Text.style.display='none'; Codehighlighter1_290_336_Closed_Image.style.display='inline'; Codehighlighter1_290_336_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_290_336_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_290_336_Closed_Text.style.display='none'; Codehighlighter1_290_336_Open_Image.style.display='inline'; Codehighlighter1_290_336_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;printStackTrace(java.io.PrintWriter&nbsp;s)&nbsp;</span><span id="Codehighlighter1_290_336_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_290_336_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getCause().printStackTrace(s);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;rethrow()的作用是把被包装的Exception再次抛出。</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;rethrow()&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception<br />
<img id="Codehighlighter1_435_478_Open_Image" onclick="this.style.display='none'; Codehighlighter1_435_478_Open_Text.style.display='none'; Codehighlighter1_435_478_Closed_Image.style.display='inline'; Codehighlighter1_435_478_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_435_478_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_435_478_Closed_Text.style.display='none'; Codehighlighter1_435_478_Open_Image.style.display='inline'; Codehighlighter1_435_478_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_435_478_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_435_478_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;(Exception)&nbsp;getCause();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<p style="margin: 0cm 0cm 0pt"></font></em><br />
<font face="宋体"><font size="4"></font></font></p>
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/283358.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-06-20 15:49 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/06/20/283358.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Exception小结(二)</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/06/18/286768.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Thu, 18 Jun 2009 15:40:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/06/18/286768.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/286768.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/06/18/286768.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/286768.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/286768.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: RuntimeException异常以及其子类异常，不需要异常说明就可以从任何地方抛出是uncheck&nbsp;exception。从程序的输出看出，无论有没有抛出异常，finally子句总会得到执行，这个程序也启发我们应该如何处理我们前面讲到过的,Java异常（和C++的异常一样）会阻止程序回到异常抛出的地方恢复执行这个问题。如果你把try块放进一个循环，你就能构建一个...&nbsp;&nbsp;<a href='http://www.blogjava.net/fhtdy2004/archive/2009/06/18/286768.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/286768.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-06-18 23:40 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/06/18/286768.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Exception小结</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/06/18/283133.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Thu, 18 Jun 2009 15:36:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/06/18/283133.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/283133.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/06/18/283133.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/283133.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/283133.html</trackback:ping><description><![CDATA[<p>唉，今天ibm面试看来是被鄙视了，问及异常不知道是要问CheckedException和UncheckedException<br />
thinking in java看的早忘了。<br />
看了好几篇帖子，还是理解不够深刻<br />
<a href="http://www.javaeye.com/topic/2038">http://www.javaeye.com/topic/2038</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.javaeye.com/topic/2038">主题：为什么 Java 中要使用 Checked Exceptions</a><br />
<a href="http://www.javaeye.com/topic/14082">http://www.javaeye.com/topic/14082</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.javaeye.com/topic/14082">主题：我对Checked Exceptions的看法 (续为什么java引入Checked Ex...</a><br />
<a href="http://www.javaeye.com/topic/10482">http://www.javaeye.com/topic/10482</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.javaeye.com/topic/10482">主题：我对Checked Exception观点的变化</a><br />
<a href="http://www.javaeye.com/topic/72170">http://www.javaeye.com/topic/72170</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.javaeye.com/topic/72170">主题：J2EE项目异常处理</a><br />
<a href="http://www.ibm.com/developerworks/cn/java/j-jtp05254/index.html">http://www.ibm.com/developerworks/cn/java/j-jtp05254/index.html</a><br />
<br />
http://www.onjava.com/pub/a/onjava/2006/01/11/exception-handling-framework-for-j2ee.html?page=6&amp;x-order=date<br />
<br />
<br />
<br />
http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html?page=2<br />
<br />
本文是Exception处理的一篇不错的文章，从Java Exception的概念介绍起，依次讲解了Exception的类型（Checked/Unchecked），Exception处理的最佳实现：<br />
1． 选择Checked还是Unchecked的几个经典依据<br />
2． Exception的封装问题<br />
3． 如无必要不要创建自己的Exception<br />
4． 不要用Exception来作流程控制<br />
5． 不要轻易的忽略捕获的Exception<br />
6． 不要简单地捕获顶层的Exception<br />
原文地址：<br />
<a href="http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html">http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html<br />
</a><br />
<br />
关于异常处理的一个问题就是要对何时（when）和如何（how）使用它们做到了然于心。在本文中我将介绍一些关于异常处理的最佳实践，同时我也会涉及到最近争论十分激烈的checked Exception的使用问题。<br />
<br />
作为开发员，我们都希望能写出解决问题并且是高质量的代码。不幸的是，一些副作用（side effects）伴随着异常在我们的代码中慢慢滋生。无庸置疑，没有人喜欢副作用（side effects）,所以我们很快就用我们自己的方式来避免它，我曾经看到一些聪明的程序员用下面的方式来处理异常：<br />
<br />
public void consumeAndForgetAllExceptions(){<br />
try {<br />
...some code that throws exceptions<br />
} catch (Exception ex){<br />
ex.printStacktrace();<br />
}<br />
}<br />
<br />
上边的代码有什么问题么？<br />
<br />
在回答以前让我们想想怎样才是正确的？是的，一旦程序碰到异常，它就该挂起程序而"做"点什么。那么上边的代码是这样子的么？看吧，它隐瞒了什么？它把所有的"苦水"往肚里咽（在控制台打印出异常信息），然后一切继续，从表面上看就像什么都没有发生过一样......，很显然，上边代码达到的效果并不是我们所期望的。<br />
<br />
后来又怎样？<br />
<br />
public void someMethod() throws Exception{<br />
}<br />
<br />
上边的代码又有什么问题？<br />
<br />
很明显，上边的方法体是空的，它不实现任何的功能（没有一句代码），试问一个空方法体能抛出什么异常？当然Java并不阻止你这么干。最近，我也遇到类似的情景，方法声明会抛出异常，但是代码中并没有任何"机会"来"展示"异常。当我问开发员为什么要这样做的时候，他回答我说"我知道，它确实有点那个，但我以前就是这么干的并且它确实能为我工作。"<br />
<br />
在C++社区曾经花了数年实践来实践如何使用异常，关于此类的争论在 java社区才刚刚开始。我曾经看到许多Java程序员针对使用异常的问题进行争论。如果对于异常处理不当的话，异常可以大大减慢应用程序的执行速度，因为它将消耗内存和CPU来创建、抛出并捕获异常。如果过分的依赖异常处理，代码对易读和易使用这两方面产生影响，以至于会让我们写出上边两处"糟糕"代码。<br />
<br />
异常原理<br />
<br />
大体上说，有三种不同的"情景"会导致异常的抛出：<br />
<br />
l 编程错误导致异常（Exception due Programming errors）: 这种情景下，异常往往处于编程错误（如：NullPointerException 或者 IllegalArgumentException）,这时异常一旦抛出，客户端将变得无能为力。<br />
<br />
l 客户端代码错误导致异常（Exception due client code errors）: 说白点就是客户端试图调用API不允许的操作。<br />
<br />
l 资源失败导致异常（Exception due to resource failures）: 如内存不足或网络连接失败导致出现异常等。这些异常的出现客户端可以采取相应的措施来恢复应用程序的继续运行。<br />
<br />
Java中异常的类型<br />
<br />
Java 中定义了两类异常：<br />
<br />
l Checked exception: 这类异常都是Exception的子类<br />
<br />
l Unchecked exception: 这类异常都是RuntimeException的子类，虽然RuntimeException同样也是Exception的子类，但是它们是特殊的，它们不能通过client code来试图解决，所以称为Unchecked exception<br />
<br />
举个例子，下图为NullPointerException的继承关系：</p>
<img height="240" alt="" src="http://www.blogjava.net/images/blogjava_net/fhtdy2004/ExceptionHierarchy.gif" width="229" border="0" /><br />
图中，NullPointerException继承自RuntimeException，所以它是Unchecked exception.<br />
<br />
<span style="color: red"><strong><em>以往我都是应用checked exception多于Unchecked exception，最近，在java社区激起了一场关于checked exception和使用它们的价值的争论。这场争论起源于JAVA是第一个拥有Checked exception的主流OO语言这样一个事实，而C++和C#都是根本没有Checked exception，它们所有的异常都是unchecked。</em></strong></span><br />
<br />
一个checked exception强迫它的客户端可以抛出并捕获它，一旦客户端不能有效地处理这些被抛出的异常就会给程序的执行带来不期望的负担。<br />
Checked exception还可能带来封装泄漏，看下面的代码：<br />
<br />
public List getAllAccounts() throws<br />
FileNotFoundException, SQLException{<br />
...<br />
}<br />
<br />
上边的方法抛出两个异常。客户端必须显示的对这两种异常进行捕获和处理即使是在完全不知道这种异常到底是因为文件还是数据库操作引起的情况下。因此，此时的异常处理将导致一种方法和调用之间不合适的耦合。<br />
<br />
<br />
<br />
接下来我会给出几种设计异常的最佳实践 （Best Practises for Designing the API）<br />
<br />
1． 当要决定是采用checked exception还是Unchecked exception的时候，你要问自己一个问题，"如果这种异常一旦抛出，客户端会做怎样的补救？"<br />
如果客户端可以通过其他的方法恢复异常，那么这种异常就是checked exception；如果客户端对出现的这种异常无能为力，那么这种异常就是Unchecked exception；从使用上讲，当异常出现的时候要做一些试图恢复它的动作而不要仅仅的打印它的信息，总来的来说，看下表：<br />
<br />
Client's reaction when exception happens<br />
Exception type<br />
<br />
Client code cannot do anything<br />
Make it an unchecked exception<br />
<br />
Client code will take some useful recovery action based on information in exception<br />
Make it a checked exception<br />
<br />
<br />
此外，尽量使用unchecked exception来处理编程错误：因为unchecked exception不用使客户端代码显示的处理它们，它们自己会在出现的地方挂起程序并打印出异常信息。Java API中提供了丰富的unchecked excetpion，譬如：NullPointerException , IllegalArgumentException 和 IllegalStateException等，因此我一般使用这些标准的异常类而不愿亲自创建新的异常类，这样使我的代码易于理解并避免的过多的消耗内存。<br />
<br />
2． 保护封装性（Preserve encapsulation）<br />
<br />
不要让你要抛出的checked exception升级到较高的层次。例如，不要让SQLException延伸到业务层。业务层并不需要（不关心？）SQLException。你有两种方法来解决这种问题：<br />
<br />
l 转变SQLException为另外一个checked exception，如果客户端并不需要恢复这种异常的话；<br />
<br />
l 转变SQLException为一个unchecked exception，如果客户端对这种异常无能为力的话；<br />
<br />
多数情况下，客户端代码都是对SQLException无能为力的，因此你要毫不犹豫的把它转变为一个unchecked exception，看看下边的代码：<br />
public void dataAccessCode(){<br />
try{<br />
..some code that throws SQLException<br />
}catch(SQLException ex){<br />
ex.printStacktrace();<br />
}<br />
}<br />
<br />
<br />
上边的catch块紧紧打印异常信息而没有任何的直接操作，这是情有可原的，因为对于SQLException你还奢望客户端做些什么呢？（但是显然这种就象什么事情都没发生一样的做法是不可取的）那么有没有另外一种更加可行的方法呢？<br />
<br />
public void dataAccessCode(){<br />
try{<br />
..some code that throws SQLException<br />
}catch(SQLException ex){<br />
throw new RuntimeException(ex);<br />
}<br />
}<br />
<br />
上边的做法是把SQLException转换为RuntimeException，一旦SQLException被抛出，那么程序将抛出RuntimeException,此时程序被挂起并返回客户端异常信息。<br />
<br />
如果你有足够的信心恢复它当SQLException被抛出的时候，那么你也可以把它转换为一个有意义的checked exception, 但是我发现在大多时候抛出RuntimeException已经足够用了。<br />
<br />
3． 不要创建没有意义的异常（Try not to create new custom exceptions if they do not have useful information for client code.）<br />
<br />
看看下面的代码有什么问题？<br />
<br />
public class DuplicateUsernameException<br />
extends Exception {}<br />
<br />
<br />
它除了有一个"意义明确"的名字以外没有任何有用的信息了。不要忘记Exception跟其他的Java类一样，客户端可以调用其中的方法来得到更多的信息。<br />
<br />
我们可以为其添加一些必要的方法，如下：<br />
<br />
public class DuplicateUsernameException<br />
extends Exception {<br />
public DuplicateUsernameException <br />
(String username){....}<br />
public String requestedUsername(){...}<br />
public String[] availableNames(){...}<br />
}<br />
<br />
<br />
<br />
在新的代码中有两个有用的方法：reqeuestedUsername(),客户但可以通过它得到请求的名称；availableNames(),客户端可以通过它得到一组有用的usernames。这样客户端在得到其返回的信息来明确自己的操作失败的原因。但是如果你不想添加更多的信息，那么你可以抛出一个标准的Exception:<br />
<br />
throw new Exception("Username already taken");<br />
更甚的情况，如果你认为客户端并不想用过多的操作而仅仅想看到异常信息，你可以抛出一个unchecked exception:<br />
<br />
throw new RuntimeException("Username already taken");<br />
<br />
另外，你可以提供一个方法来验证该username是否被占用。<br />
<br />
很有必要再重申一下，checked exception应该让客户端从中得到丰富的信息。要想让你的代码更加易读，请倾向于用unchecked excetpion来处理程序中的错误（Prefer unchecked exceptions for all programmatic errors）。<br />
<br />
4． Document exceptions.<br />
<br />
你可以通过Javadoc's @throws 标签来说明（document）你的API中要抛出checked exception或者unchecked exception。然而，我更倾向于使用来单元测试来说明（document）异常。不管你采用哪中方式，你要让客户端代码知道你的API中所要抛出的异常。这里有一个用单元测试来测试IndexOutOfBoundsException的例子：<br />
<br />
public void testIndexOutOfBoundsException() {<br />
ArrayList blankList = new ArrayList();<br />
try {<br />
blankList.get(10);<br />
fail("Should raise an IndexOutOfBoundsException");<br />
} catch (IndexOutOfBoundsException success) {}<br />
}<br />
<br />
<br />
<br />
上边的代码在请求blankList.get(10)的时候会抛出IndexOutOfBoundsException,如果没有被抛出，将fail ("Should raise an IndexOutOfBoundsException")显示说明该测试失败。通过书写测试异常的单元测试，你不但可以看到异常是怎样的工作的，而且你可以让你的代码变得越来越健壮。<br />
<br />
<br />
下面作者将介绍界中使用异常的最佳实践（Best Practices for Using Exceptions）<br />
1． 总是要做一些清理工作（Always clean up after yourself）<br />
<br />
如果你使用一些资源例如数据库连接或者网络连接，请记住要做一些清理工作（如关闭数据库连接或者网络连接），如果你的API抛出Unchecked exception，那么你要用try-finally来做必要的清理工作：<br />
<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 id="Codehighlighter1_28_250_Open_Image" onclick="this.style.display='none'; Codehighlighter1_28_250_Open_Text.style.display='none'; Codehighlighter1_28_250_Closed_Image.style.display='inline'; Codehighlighter1_28_250_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_28_250_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_28_250_Closed_Text.style.display='none'; Codehighlighter1_28_250_Open_Image.style.display='inline'; Codehighlighter1_28_250_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;dataAccessCode()</span><span id="Codehighlighter1_28_250_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_28_250_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />Connection&nbsp;conn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_65_140_Open_Image" onclick="this.style.display='none'; Codehighlighter1_65_140_Open_Text.style.display='none'; Codehighlighter1_65_140_Closed_Image.style.display='inline'; Codehighlighter1_65_140_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_65_140_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_65_140_Closed_Text.style.display='none'; Codehighlighter1_65_140_Open_Image.style.display='inline'; Codehighlighter1_65_140_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #0000ff">try</span><span id="Codehighlighter1_65_140_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_65_140_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />conn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getConnection();&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />..some&nbsp;code&nbsp;that&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;SQLException&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_163_195_Open_Image" onclick="this.style.display='none'; Codehighlighter1_163_195_Open_Text.style.display='none'; Codehighlighter1_163_195_Closed_Image.style.display='inline'; Codehighlighter1_163_195_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_163_195_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_163_195_Closed_Text.style.display='none'; Codehighlighter1_163_195_Open_Image.style.display='inline'; Codehighlighter1_163_195_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(SQLException&nbsp;ex)</span><span id="Codehighlighter1_163_195_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_163_195_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />ex.printStacktrace();&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_204_244_Open_Image" onclick="this.style.display='none'; Codehighlighter1_204_244_Open_Text.style.display='none'; Codehighlighter1_204_244_Closed_Image.style.display='inline'; Codehighlighter1_204_244_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_204_244_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_204_244_Closed_Text.style.display='none'; Codehighlighter1_204_244_Open_Image.style.display='inline'; Codehighlighter1_204_244_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">finally</span><span id="Codehighlighter1_204_244_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_204_244_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />DBUtil.closeConnection(conn);&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_272_490_Open_Image" onclick="this.style.display='none'; Codehighlighter1_272_490_Open_Text.style.display='none'; Codehighlighter1_272_490_Closed_Image.style.display='inline'; Codehighlighter1_272_490_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_272_490_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_272_490_Closed_Text.style.display='none'; Codehighlighter1_272_490_Open_Image.style.display='inline'; Codehighlighter1_272_490_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;DBUtil</span><span id="Codehighlighter1_272_490_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_272_490_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;closeConnection&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_334_484_Open_Image" onclick="this.style.display='none'; Codehighlighter1_334_484_Open_Text.style.display='none'; Codehighlighter1_334_484_Closed_Image.style.display='inline'; Codehighlighter1_334_484_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_334_484_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_334_484_Closed_Text.style.display='none'; Codehighlighter1_334_484_Open_Image.style.display='inline'; Codehighlighter1_334_484_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />(Connection&nbsp;conn)</span><span id="Codehighlighter1_334_484_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_334_484_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_343_367_Open_Image" onclick="this.style.display='none'; Codehighlighter1_343_367_Open_Text.style.display='none'; Codehighlighter1_343_367_Closed_Image.style.display='inline'; Codehighlighter1_343_367_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_343_367_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_343_367_Closed_Text.style.display='none'; Codehighlighter1_343_367_Open_Image.style.display='inline'; Codehighlighter1_343_367_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #0000ff">try</span><span id="Codehighlighter1_343_367_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_343_367_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />conn.close();&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_391_478_Open_Image" onclick="this.style.display='none'; Codehighlighter1_391_478_Open_Text.style.display='none'; Codehighlighter1_391_478_Closed_Image.style.display='inline'; Codehighlighter1_391_478_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_391_478_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_391_478_Closed_Text.style.display='none'; Codehighlighter1_391_478_Open_Image.style.display='inline'; Codehighlighter1_391_478_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">(SQLException&nbsp;ex)</span><span id="Codehighlighter1_391_478_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_391_478_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />logger.error(</span><span style="color: #000000">"</span><span style="color: #000000">Cannot&nbsp;close&nbsp;connection</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;RuntimeException(ex);&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<p>DBUtil是一个工具类来关闭Connection.有必要的说的使用的finally的重要性是不管程序是否碰到异常，它都会被执行。在上边的例子中，finally中关闭连接，如果在关闭连接的时候出现错误就抛出RuntimeException.<br />
<br />
<br />
<br />
2． 不要使用异常来控制流程（Never use exceptions for flow control）<br />
<br />
下边代码中，MaximumCountReachedException被用于控制流程：<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"><img id="Codehighlighter1_42_183_Open_Image" onclick="this.style.display='none'; Codehighlighter1_42_183_Open_Text.style.display='none'; Codehighlighter1_42_183_Closed_Image.style.display='inline'; Codehighlighter1_42_183_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_42_183_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_42_183_Closed_Text.style.display='none'; Codehighlighter1_42_183_Open_Image.style.display='inline'; Codehighlighter1_42_183_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;useExceptionsForFlowControl()&nbsp;</span><span id="Codehighlighter1_42_183_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_42_183_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_52_104_Open_Image" onclick="this.style.display='none'; Codehighlighter1_52_104_Open_Text.style.display='none'; Codehighlighter1_52_104_Closed_Image.style.display='inline'; Codehighlighter1_52_104_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_52_104_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_52_104_Closed_Text.style.display='none'; Codehighlighter1_52_104_Open_Image.style.display='inline'; Codehighlighter1_52_104_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_52_104_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_52_104_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_71_98_Open_Image" onclick="this.style.display='none'; Codehighlighter1_71_98_Open_Text.style.display='none'; Codehighlighter1_71_98_Closed_Image.style.display='inline'; Codehighlighter1_71_98_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_71_98_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_71_98_Closed_Text.style.display='none'; Codehighlighter1_71_98_Open_Image.style.display='inline'; Codehighlighter1_71_98_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">true</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_71_98_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_71_98_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />increaseCount();&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_146_152_Open_Image" onclick="this.style.display='none'; Codehighlighter1_146_152_Open_Text.style.display='none'; Codehighlighter1_146_152_Closed_Image.style.display='inline'; Codehighlighter1_146_152_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_146_152_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_146_152_Closed_Text.style.display='none'; Codehighlighter1_146_152_Open_Image.style.display='inline'; Codehighlighter1_146_152_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(MaximumCountReachedException&nbsp;ex)&nbsp;</span><span id="Codehighlighter1_146_152_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_146_152_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">Continue&nbsp;execution&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #000000">}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;increaseCount()&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_261_336_Open_Image" onclick="this.style.display='none'; Codehighlighter1_261_336_Open_Text.style.display='none'; Codehighlighter1_261_336_Closed_Image.style.display='inline'; Codehighlighter1_261_336_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_261_336_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_261_336_Closed_Text.style.display='none'; Codehighlighter1_261_336_Open_Image.style.display='inline'; Codehighlighter1_261_336_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;MaximumCountReachedException&nbsp;</span><span id="Codehighlighter1_261_336_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_261_336_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(count&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">5000</span><span style="color: #000000">)&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MaximumCountReachedException();&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<p>上边的useExceptionsForFlowControl()用一个无限循环来增加count直到抛出异常，这种做法并没有说让代码不易读，但是它是程序执行效率降低。<br />
<br />
记住，只在要会抛出异常的地方进行异常处理。<br />
<br />
<br />
<br />
3． 不要忽略异常<br />
<br />
当有异常被抛出的时候，如果你不想恢复它，那么你要毫不犹豫的将其转换为unchecked exception，而不是用一个空的catch块或者什么也不做来忽略它，以至于从表面来看象是什么也没有发生一样。<br />
<br />
<br />
<br />
4． 不要捕获顶层的Exception<br />
<br />
unchecked exception都是RuntimeException的子类，RuntimeException又继承Exception,因此，如果单纯的捕获Exception,那么你同样也捕获了RuntimeException,如下代码：<br />
<br />
try{<br />
..<br />
}catch(Exception ex){<br />
}<br />
一旦你写出了上边的代码（注意catch块是空的），它将忽略所有的异常，包括unchecked exception.<br />
<br />
5． Log exceptions just once<br />
<br />
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.<br />
</p>
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/283133.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-06-18 23:36 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/06/18/283133.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]为什么不鼓励使用 Thread.stop、Thread.suspend和 Thread.resume及解决方法</title><link>http://www.blogjava.net/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.blogjava.net/fhtdy2004/archive/2009/06/10/281315.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/281315.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/06/10/281315.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/281315.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/281315.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 为什么不鼓励使用 Thread.stop、Thread.suspend和 Thread.resume及解决方法&nbsp;&nbsp;<a href='http://www.blogjava.net/fhtdy2004/archive/2009/06/10/281315.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/281315.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-06-10 21:57 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/06/10/281315.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OWL实例描述</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/06/10/281310.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Wed, 10 Jun 2009 13:56:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/06/10/281310.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/281310.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/06/10/281310.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/281310.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/281310.html</trackback:ping><description><![CDATA[<div class="blog_content">
<p><a href="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">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</a>&nbsp;（本体介绍）<br />
<br />
<a href="http://imarine.blog.163.com/blog/static/5138018320071119110889/">http://imarine.blog.163.com/blog/static/5138018320071119110889/</a>（本体查询）<br />
<br />
<a href="http://bbs.w3china.org/dispbbs.asp?boardID=2&amp;ID=74918/">http://bbs.w3china.org/dispbbs.asp?boardID=2&amp;ID=74918/</a> (本体查询）<br />
<br />
<br />
-------------------------------------------------------<br />
rdfs:subClassOf 描述</p>
<p>&nbsp;&lt;owl:Class rdf:ID="Wine"&gt;<br />
&nbsp;&nbsp; &lt;rdfs:subClassOf rdf:resource="&amp;food;PotableLiquid"/&gt;<br />
&nbsp;&nbsp; &lt;rdfs:label xml:lang="en"&gt;wine&lt;/rdfs:label&gt;<br />
&nbsp;&nbsp; &lt;rdfs:label xml:lang="fr"&gt;vin&lt;/rdfs:label&gt;<br />
&nbsp;&lt;/owl:Class&gt;</p>
<p>Wine PotableLiquid<br />
--------------------------------------------------------<br />
ObjectProperty&nbsp;&nbsp; 描述 wine hasWinDescriptor WineDescriptor</p>
<p>&nbsp;&lt;owl:ObjectProperty rdf:ID="hasWineDescriptor"&gt;<br />
&nbsp;&nbsp; &lt;rdfs:domain rdf:resource="#Wine" /&gt;<br />
&nbsp;&nbsp; &lt;rdfs:range&nbsp; rdf:resource="#WineDescriptor" /&gt;<br />
&nbsp;&lt;/owl:ObjectProperty&gt; </p>
<p><br />
-------------------------------------------------------<br />
DatatypeProperty 描述 VintageYear is 1998</p>
<p>&nbsp; &lt;owl:DatatypeProperty rdf:ID="yearValue"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;rdfs:domain rdf:resource="#VintageYear" /&gt;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;rdfs:range&nbsp; rdf:resource="&amp;xsd;positiveInteger" /&gt;<br />
&nbsp; &lt;/owl:DatatypeProperty&gt;<br />
&nbsp; <br />
&nbsp; &lt;VintageYear rdf:ID="Year1998"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;yearValue rdf:datatype="&amp;xsd;positiveInteger"&gt;1998&lt;/yearValue&gt;<br />
&nbsp; &lt;/VintageYear&gt;</p>
<p>&nbsp; &lt;owl:ObjectProperty rdf:ID="hasVintageYear"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;rdf:type rdf:resource="&amp;owl;FunctionalProperty" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;rdfs:domain rdf:resource="#Vintage" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;rdfs:range&nbsp; rdf:resource="#VintageYear" /&gt;<br />
&nbsp; &lt;/owl:ObjectProperty&gt;</p>
<p>Vintage has VintageYear that is 1998 ------ 葡萄酒的年份是1998 或 1998的葡萄酒</p>
<p>--------------------------------------------------------<br />
个体(individual) 描述</p>
<p>&nbsp;&lt;owl:Class rdf:ID="WineGrape"&gt;<br />
&nbsp;&nbsp; &lt;rdfs:subClassOf rdf:resource="&amp;food;Grape" /&gt;<br />
&nbsp;&lt;/owl:Class&gt; <br />
&nbsp;&lt;WineGrape rdf:ID="CabernetSauvignonGrape" /&gt;</p>
<p>CabernetSauvignonGrape is WineGrape ---- 赤霞珠葡萄树</p>
<p>----------------------属性特性------------------------<br />
TransitiveProperty 描述 <br />
SymmetricProperty&nbsp; 描述</p>
<p>&lt;owl:Class rdf:ID="Region" /&gt;</p>
<p>&lt;owl:ObjectProperty rdf:ID="locatedIn"&gt;<br />
&nbsp;&nbsp; &lt;rdf:type rdf:resource="&amp;owl;TransitiveProperty" /&gt;<br />
&nbsp;&nbsp; &lt;rdfs:domain rdf:resource="<a href="http://www.w3.org/2002/07/owl#Thing">http://www.w3.org/2002/07/owl#Thing</a>" /&gt;<br />
&nbsp;&nbsp; &lt;rdfs:range rdf:resource="#Region" /&gt;<br />
&lt;/owl:ObjectProperty&gt;</p>
<p>&lt;owl:ObjectProperty rdf:ID="adjacentRegion"&gt;<br />
&nbsp; &lt;rdf:type rdf:resource="&amp;owl;SymmetricProperty" /&gt;<br />
&nbsp; &lt;rdfs:domain rdf:resource="#Region" /&gt;<br />
&nbsp; &lt;rdfs:range rdf:resource="#Region" /&gt;<br />
&lt;/owl:ObjectProperty&gt;</p>
<p>--------------------------------------------<br />
FunctionalProperty&nbsp;&nbsp; 描述 一个给定的 Vintage个体只能使用hasVintageYear属性与单独一个年份相关联</p>
<p>&nbsp;&lt;owl:Class rdf:ID="VintageYear" /&gt; <br />
&nbsp;&lt;owl:ObjectProperty rdf:ID="hasVintageYear"&gt;<br />
&nbsp;&nbsp; &lt;rdf:type rdf:resource="&amp;owl;FunctionalProperty" /&gt;<br />
&nbsp;&nbsp; &lt;rdfs:domain rdf:resource="#Vintage" /&gt;<br />
&nbsp;&nbsp; &lt;rdfs:range&nbsp; rdf:resource="#VintageYear" /&gt;<br />
&nbsp;&lt;/owl:ObjectProperty&gt;<br />
---------------------------------------------<br />
&nbsp;inverseOf&nbsp; 描述 各种葡萄酒都有制造商</p>
<p>&nbsp;&lt;owl:ObjectProperty rdf:ID="hasMaker"&gt;<br />
&nbsp;&nbsp; &lt;rdf:type rdf:resource="&amp;owl;FunctionalProperty" /&gt;<br />
&nbsp;&lt;/owl:ObjectProperty&gt;&nbsp;&nbsp; <br />
&nbsp;&lt;owl:ObjectProperty rdf:ID="producesWine"&gt;<br />
&nbsp;&nbsp; &lt;owl:inverseOf rdf:resource="#hasMaker" /&gt;<br />
&nbsp;&lt;/owl:ObjectProperty&gt;</p>
<p>---------------------------------------------<br />
&nbsp;InverseFunctionalProperty&nbsp; </p>
<p>&nbsp;&lt;owl:ObjectProperty rdf:ID="hasMaker" /&gt; <br />
&nbsp;&lt;owl:ObjectProperty rdf:ID="producesWine"&gt;<br />
&nbsp;&nbsp; &lt;rdf:type rdf:resource="&amp;owl;InverseFunctionalProperty" /&gt;<br />
&nbsp;&nbsp; &lt;owl:inverseOf rdf:resource="#hasMaker" /&gt;<br />
&nbsp;&lt;/owl:ObjectProperty&gt;</p>
<p>&nbsp;owl:InverseFunctional意味着属性的值域中的元素为定义域中的每个元素提供了一个唯一的标识</p>
<p><br />
&nbsp;---属性限制------<br />
&nbsp;-------------------------<br />
&nbsp;allValuesFrom&nbsp;&nbsp; 描述 Wine的制造商必须是Winery。<br />
&nbsp;owl:someValuesFrom替换owl:allValuesFrom，那就意味着至少有一个Wine类实例的hasMaker属性是指向一个Winery类的个体的。</p>
<p>&nbsp;&lt;owl:Class rdf:ID="Wine"&gt;<br />
&nbsp;&nbsp; &lt;rdfs:subClassOf rdf:resource="&amp;food;PotableLiquid" /&gt;<br />
&nbsp;&nbsp; ...<br />
&nbsp;&nbsp; &lt;rdfs:subClassOf&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;owl:Restriction&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;owl:onProperty rdf:resource="#hasMaker" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;owl:allValuesFrom rdf:resource="#Winery" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/owl:Restriction&gt;<br />
&nbsp;&nbsp; &lt;/rdfs:subClassOf&gt;<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; ...<br />
&nbsp;&lt;/owl:Class&gt;</p>
<p>&nbsp;-------------------------------------------------------<br />
&nbsp;owl:cardinality&nbsp; 描述&nbsp; 允许对一个关系中的元素数目作出精确的限制</p>
<p>&nbsp; &lt;owl:Class rdf:ID="Vintage"&gt; <br />
&nbsp;&nbsp; &lt;rdfs:subClassOf&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;owl:Restriction&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;owl:onProperty rdf:resource="#hasVintageYear"/&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;owl:cardinality rdf:datatype="&amp;xsd;nonNegativeInteger"&gt;1&lt;/owl:cardinality&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/owl:Restriction&gt;<br />
&nbsp;&nbsp; &lt;/rdfs:subClassOf&gt;<br />
&nbsp;&lt;/owl:Class&gt;</p>
<p>&nbsp;每瓶葡萄酒只有一个年度</p>
<p>&nbsp;-------------------------------------------------------<br />
&nbsp;hasValue&nbsp; 描述 一个个体只要至少有&#8220;一个&#8221;属性值等于hasValue的资源，这一个体就是该类的成员。</p>
<p>&nbsp; &lt;owl:Class rdf:ID="Burgundy"&gt;<br />
&nbsp;&nbsp; ...<br />
&nbsp;&nbsp; &lt;rdfs:subClassOf&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;owl:Restriction&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;owl:onProperty rdf:resource="#hasSugar" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;owl:hasValue rdf:resource="#Dry" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/owl:Restriction&gt;<br />
&nbsp;&nbsp; &lt;/rdfs:subClassOf&gt;<br />
&nbsp;&lt;/owl:Class&gt;</p>
<p>&nbsp;所有的Burgundy酒都是干(dry)的酒。也即，它们的hasSugar属性必须至少有一个是值等于Dry（干的）</p>
<p>------------------------------------------------------<br />
&nbsp;本体映射<br />
&nbsp;类和属性之间的等价关系－－equivalentClass, equivalentProperty</p>
<p>&nbsp;&lt;owl:Class rdf:ID="TexasThings"&gt;<br />
&nbsp;&nbsp; &lt;owl:equivalentClass&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;owl:Restriction&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;owl:onProperty rdf:resource="#locatedIn" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;owl:someValuesFrom rdf:resource="#TexasRegion" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/owl:Restriction&gt;<br />
&nbsp;&nbsp; &lt;/owl:equivalentClass&gt;<br />
&nbsp;&lt;/owl:Class&gt;</p>
<p>&nbsp;TexasThings指的是那些恰好位于TexasRegion的事物。使用owl:equivalentClass 和使用rdfs:subClassOf 的不同就像必要条件和充要条件的不同一样。如果是使用subClassOf的话，位于TexasRegion的事物不一定是TexasThings。但是，如果使用owl:equivalentClass，位于TexasRegion的事物一定属于TexasThings类。</p>
<p>------------------------------------------------------<br />
个体间的同一性 －sameAs</p>
<p>&nbsp;&lt;Wine rdf:ID="MikesFavoriteWine&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;owl:sameAs rdf:resource="#StGenevieveTexasWhite" /&gt;<br />
&nbsp;&lt;/Wine&gt;</p>
<p>&nbsp;修饰（或引用）两个类用sameAs还是用equivalentClass效果是不同的。用sameAs的时候，把一个类解释为一个个体，就像在OWL Full中一样，这有利于对本体进行分类。</p>
<p>-----------------------------------------------------<br />
&nbsp;不同的个体<br />
------------------------------------------------------<br />
differentFrom</p>
<p>&nbsp;&lt;WineSugar rdf:ID="Dry" /&gt;<br />
&nbsp;<br />
&nbsp;&lt;WineSugar rdf:ID="Sweet"&gt; <br />
&nbsp;&nbsp; &lt;owl:differentFrom rdf:resource="#Dry"/&gt;&nbsp; <br />
&nbsp;&lt;/WineSugar&gt; <br />
&nbsp;<br />
&nbsp;&lt;WineSugar rdf:ID="OffDry"&gt;<br />
&nbsp;&nbsp; &lt;owl:differentFrom rdf:resource="#Dry"/&gt; <br />
&nbsp;&nbsp; &lt;owl:differentFrom rdf:resource="#Sweet"/&gt; <br />
&nbsp;&lt;/WineSugar&gt;</p>
<p>&nbsp;---------------------------------------------------<br />
AllDifferent</p>
<p>&nbsp;&lt;owl:AllDifferent&gt;<br />
&nbsp;&nbsp; &lt;owl:distinctMembers rdf:parseType="Collection"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;vin:WineColor rdf:about="#Red" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;vin:WineColor rdf:about="#White" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;vin:WineColor rdf:about="#Rose" /&gt;<br />
&nbsp;&nbsp; &lt;/owl:distinctMembers&gt;<br />
&nbsp;&lt;/owl:AllDifferent&gt;</p>
<p>&nbsp;owl:distinctMembers属性声明只能和owl:AllDifferent属性声明一起结合使用。</p>
<p>&nbsp;-----------------------------------------------------<br />
&nbsp;intersectionOf</p>
<p>&nbsp;&lt;owl:Class rdf:ID="WhiteWine"&gt;<br />
&nbsp;&nbsp; &lt;owl:intersectionOf rdf:parseType="Collection"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;owl:Class rdf:about="#Wine" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;owl:Restriction&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;owl:onProperty rdf:resource="#hasColor" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;owl:hasValue rdf:resource="#White" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/owl:Restriction&gt;<br />
&nbsp;&nbsp; &lt;/owl:intersectionOf&gt;<br />
&nbsp;&lt;/owl:Class&gt;</p>
<p>&nbsp;WhiteWine恰好是类Wine与所有颜色是白色的事物的集合的交集</p>
<p>&nbsp;-----------------------------------------------------<br />
&nbsp;unionOf</p>
<p>&nbsp;&lt;owl:Class rdf:ID="Fruit"&gt;<br />
&nbsp;&nbsp; &lt;owl:unionOf rdf:parseType="Collection"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;owl:Class rdf:about="#SweetFruit" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;owl:Class rdf:about="#NonSweetFruit" /&gt;<br />
&nbsp;&nbsp; &lt;/owl:unionOf&gt;<br />
&nbsp;&lt;/owl:Class&gt;</p>
<p>&nbsp;------------------------------------------------------<br />
&nbsp;complementOf 从某个论域(domain of discourse)选出不属于某个类的所有个体</p>
<p>&nbsp;&lt;owl:Class rdf:ID="NonFrenchWine"&gt;<br />
&nbsp;&nbsp; &lt;owl:intersectionOf rdf:parseType="Collection"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;owl:Class rdf:about="#Wine"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;owl:Class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;owl:complementOf&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;owl:Restriction&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;owl:onProperty rdf:resource="#locatedIn" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;owl:hasValue rdf:resource="#FrenchRegion" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/owl:Restriction&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/owl:complementOf&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/owl:Class&gt;<br />
&nbsp;&nbsp; &lt;/owl:intersectionOf&gt;<br />
&nbsp;&lt;/owl:Class&gt;</p>
<p>&nbsp;-----------------------------------------------------------<br />
&nbsp;oneOf&nbsp; 枚举</p>
<p>&nbsp;&lt;owl:Class rdf:ID="WineColor"&gt;<br />
&nbsp;&nbsp; &lt;rdfs:subClassOf rdf:resource="#WineDescriptor"/&gt;<br />
&nbsp;&nbsp; &lt;owl:oneOf rdf:parseType="Collection"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;owl:Thing rdf:about="#White"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;owl:Thing rdf:about="#Rose"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;owl:Thing rdf:about="#Red"/&gt;<br />
&nbsp;&nbsp; &lt;/owl:oneOf&gt;<br />
&nbsp;&lt;/owl:Class&gt;</p>
<p>&nbsp;有效的个体声明</p>
<p>&nbsp;-----------------------------------------------------------<br />
&nbsp;disjointWith&nbsp; 不相交类&nbsp; 保证了属于某一个类的个体不能同时又是另一个指定类的实例</p>
<p>&nbsp;&lt;owl:Class rdf:ID="Pasta"&gt;<br />
&nbsp;&nbsp; &lt;rdfs:subClassOf rdf:resource="#EdibleThing"/&gt;<br />
&nbsp;&nbsp; &lt;owl:disjointWith rdf:resource="#Meat"/&gt;<br />
&nbsp;&nbsp; &lt;owl:disjointWith rdf:resource="#Fowl"/&gt;<br />
&nbsp;&nbsp; &lt;owl:disjointWith rdf:resource="#Seafood"/&gt;<br />
&nbsp;&nbsp; &lt;owl:disjointWith rdf:resource="#Dessert"/&gt;<br />
&nbsp;&nbsp; &lt;owl:disjointWith rdf:resource="#Fruit"/&gt;<br />
&nbsp;&lt;/owl:Class&gt;</p>
<p>Pasta与其它所有类是不相交的。例如，它并没有保证Meat和Fruit是不相交的</p>
</div>
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/281310.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-06-10 21:56 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/06/10/281310.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java多线程sleep(),join(),interrupt(),wait(),notify()</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/06/08/280728.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Mon, 08 Jun 2009 13:01:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/06/08/280728.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/280728.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/06/08/280728.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/280728.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/280728.html</trackback:ping><description><![CDATA[关于Java多线程知识可以看看《Thinking in Java 》中的多线程部分和《Java网络编程》中第5章多线程的部分<br />
<br />
以下是参考&lt;&lt;Java多线程模式&gt;&gt;的 <br />
1. sleep() &amp; interrupt() <br />
&nbsp;&nbsp;&nbsp; 线程A正在使用sleep()暂停着: Thread.sleep(100000); <br />
&nbsp;&nbsp;&nbsp; 如果要取消他的等待状态,可以在正在执行的线程里(比如这里是B)调用 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.interrupt(); <br />
&nbsp;&nbsp;&nbsp; 令线程A放弃睡眠操作,这里a是线程A对应到的Thread实例 <br />
&nbsp;&nbsp;&nbsp; 执行interrupt()时,并不需要获取Thread实例的锁定.任何线程在任何时刻,都可以调用其他线程interrupt().当sleep中的线程被调用interrupt()时,就会放弃暂停的状态.并抛出InterruptedException.丢出异常的,是A线程. <br />
<br />
2. wait() &amp; interrupt() <br />
&nbsp;&nbsp;&nbsp; 线程A调用了wait()进入了等待状态,也可以用interrupt()取消. <br />
&nbsp;&nbsp;&nbsp; 不过这时候要小心锁定的问题.线程在进入等待区,会把锁定解除,当对<span style="color: red">等待中的线程调用interrupt()时(注意是等待的线程调用其自己的interrupt())</span>,<span style="color: red">会先重新获取锁定,再抛出异常.在获取锁定之前,是无法抛出异常的. <br />
</span><br />
3. join() &amp; interrupt() <br />
&nbsp;&nbsp;&nbsp; 当线程以join()等待其他线程结束时,一样可以使用interrupt()取消之.因为调用join()不需要获取锁定,故与sleep()时一样,会马上跳到catch块里. <span style="color: red">注意是随调用interrupt()方法,一定是阻塞的线程来调用其自己的interrupt方法.如在线程a中调用来线程t.join().则a会等t执行完后在执行t.join后的代码,当在线程b中调用来a.interrupt()方法,则会抛出InterruptedException<br />
</span><br />
4. interrupt()只是改变中断状态而已 <br />
&nbsp;&nbsp;&nbsp; interrupt()不会中断一个正在运行的线程。这一方法实际上完成的是，在线程受到阻塞时抛出一个中断信号，这样线程就得以退出阻塞的状态。更确切的说，如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞，那么，它将接收到一个中断异常（InterruptedException），从而提早地终结被阻塞状态。 <br />
&nbsp;&nbsp;&nbsp; 如果线程没有被阻塞，这时调用interrupt()将不起作用；否则，线程就将得到异常（该线程必须事先预备好处理此状况），接着逃离阻塞状态。 <br />
&nbsp;&nbsp;&nbsp; 线程A在执行sleep,wait,join时,线程B调用A的interrupt方法,的确这一个时候A会有InterruptedException异常抛出来.但这其实是在sleep,wait,join这些方法内部会不断检查中断状态的值,而自己抛出的InterruptedException。 <br />
&nbsp;&nbsp;&nbsp; 如果线程A正在执行一些指定的操作时如赋值,for,while,if,调用方法等,都不会去检查中断状态,所以线程A不会抛出InterruptedException,而会一直执行着自己的操作.当线程A终于执行到wait(),sleep(),join()时,才马上会抛出InterruptedException. <br />
&nbsp;&nbsp;&nbsp; 若没有调用sleep(),wait(),join()这些方法,或是没有在线程里自己检查中断状态自己抛出InterruptedException的话,那InterruptedException是不会被抛出来的. <br />
<br />
顺便加个与Thread.sleep()相同效果的代码: <br />
public static void amethod(long x) throws InterruptedExcetion{ <br />
&nbsp;&nbsp;&nbsp; if (x != 0) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object o = new Object(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized (o) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o.wait(x); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; } <br />
} <br />
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/280728.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-06-08 21:01 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/06/08/280728.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正确理解ThreadLocal</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/06/02/279582.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Tue, 02 Jun 2009 06:18:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/06/02/279582.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/279582.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/06/02/279582.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/279582.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/279582.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ThreadLocal 不是用来解决共享对象的多线程访问问题的&nbsp;&nbsp;<a href='http://www.blogjava.net/fhtdy2004/archive/2009/06/02/279582.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/279582.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-06-02 14:18 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/06/02/279582.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ThreadLocal和synchronized</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/06/01/279469.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Mon, 01 Jun 2009 13:57:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/06/01/279469.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/279469.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/06/01/279469.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/279469.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/279469.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ThreadLocal和synchronized &nbsp;&nbsp;<a href='http://www.blogjava.net/fhtdy2004/archive/2009/06/01/279469.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/279469.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-06-01 21:57 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/06/01/279469.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java多线程小结</title><link>http://www.blogjava.net/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.blogjava.net/fhtdy2004/archive/2009/06/01/279329.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/279329.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/06/01/279329.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/279329.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/279329.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Java多线程小结&nbsp;&nbsp;<a href='http://www.blogjava.net/fhtdy2004/archive/2009/06/01/279329.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/279329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-06-01 09:31 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/06/01/279329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java内部类</title><link>http://www.blogjava.net/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.blogjava.net/fhtdy2004/archive/2009/05/24/277741.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 重点理解Java引入内部类的原因以及好处内部类能让你再逻辑上将相互从属的类组织起来，并且在类的内部控制访问权限。但是切记，内部类和合成时截然不同的，这一点非常重要。几个有代表性的代码块接口可以嵌套在类或其它接口中接口的嵌套Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.Co...&nbsp;&nbsp;<a href='http://www.blogjava.net/fhtdy2004/archive/2009/05/24/277741.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/277741.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-24 22:52 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/05/24/277741.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java对象的实例化过程,成员变量的初始化顺序</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/05/11/270110.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Mon, 11 May 2009 13:16:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/05/11/270110.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/270110.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/05/11/270110.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/270110.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/270110.html</trackback:ping><description><![CDATA[&nbsp;
<p style="background: #eeeedd; margin: 7.5pt 0cm; text-align: left" align="left"><span style="font-size: 11pt; font-family: Verdana">JAVA<span style="font-family: 宋体">中子类对象的实例化过程</span></span></p>
<p style="background: #eeeedd; margin: 7.5pt 0cm; text-align: left" align="left"><span style="font-size: 11pt; font-family: Verdana">&nbsp;Person.java</span></p>
<p style="background: #e6e6e6; word-break: break-all; text-align: left" align="left"><span style="font-size: 11pt; font-family: Verdana"><img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.gif" width="11" border="0" v:shapes="_x0000_i1025" /><span style="color: blue">class</span><span style="color: black">&nbsp;Person<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image002.gif" width="11" border="0" v:shapes="_13_284_Open_Image" /><img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.gif" width="11" border="0" v:shapes="_13_284_Closed_Image" /></span><span style="color: black">{<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1028" />&nbsp;</span><span style="color: blue">public</span><span style="color: black">&nbsp;String&nbsp;name&nbsp;=&nbsp;"not&nbsp;know";</span><strong><span style="color: green">//4</span></strong><span style="color: green"><br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1029" /></span>&nbsp;<span style="color: blue">public</span>&nbsp;<span style="color: blue">int</span><span style="color: black">&nbsp;age&nbsp;=&nbsp;-1&nbsp;;</span><strong><span style="color: green">//5</span></strong><span style="color: green"><br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1030" /></span>&nbsp;<span style="color: blue">public</span><span style="color: black">&nbsp;Person()<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image005.gif" width="11" border="0" v:shapes="_96_103_Open_Image" /><img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image006.gif" width="11" border="0" v:shapes="_96_103_Closed_Image" />&nbsp;</span><span style="color: black">{&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image007.gif" width="11" border="0" v:shapes="_x0000_i1033" />&nbsp;}<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1060" />&nbsp;</span><span style="color: blue">public</span><span style="color: black">&nbsp;Person(String&nbsp;name&nbsp;,&nbsp;</span><span style="color: blue">int</span><span style="color: black">&nbsp;age<strong>)</strong></span><strong><span style="color: green">//3</span></strong><span style="color: green"><br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image005.gif" width="11" border="0" v:shapes="_147_195_Open_Image" /><img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image006.gif" width="11" border="0" v:shapes="_147_195_Closed_Image" /></span>&nbsp;<span style="color: black">{<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1063" />&nbsp;&nbsp;</span><span style="color: blue">this</span><span style="color: black">.name&nbsp;=&nbsp;name&nbsp;;</span><strong><span style="color: green">//6</span></strong><span style="color: green"><br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1064" /></span><span style="color: black">&nbsp;&nbsp;</span><span style="color: blue">this</span><span style="color: black">.age&nbsp;=&nbsp;age;</span><strong><span style="color: green">//7</span></strong><span style="color: green"><br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image007.gif" width="11" border="0" v:shapes="_x0000_i1065" /></span><span style="color: black">&nbsp;}<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1066" />&nbsp;</span><span style="color: blue">public</span>&nbsp;<span style="color: blue">void</span><span style="color: black">&nbsp;showInfo()<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image005.gif" width="11" border="0" v:shapes="_222_282_Open_Image" /><img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image006.gif" width="11" border="0" v:shapes="_222_282_Closed_Image" />&nbsp;</span><span style="color: black">{<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1069" />&nbsp;&nbsp;System.out.println("Name&nbsp;is&nbsp;:"+name+" Age&nbsp;is&nbsp;:"+age);<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image007.gif" width="11" border="0" v:shapes="_x0000_i1070" />&nbsp;}<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image008.gif" width="11" border="0" v:shapes="_x0000_i1037" />}<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.gif" width="11" border="0" v:shapes="_x0000_i1038" /></span><span style="color: blue">class</span><span style="color: black">&nbsp;Student&nbsp;</span><span style="color: blue">extends</span><span style="color: black">&nbsp;Person<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image002.gif" width="11" border="0" v:shapes="_315_648_Open_Image" /><img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.gif" width="11" border="0" v:shapes="_315_648_Closed_Image" /></span><span style="color: black">{<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1041" />&nbsp;</span><span style="color: blue">public</span><span style="color: black">&nbsp;String&nbsp;school&nbsp;=&nbsp;"not&nbsp;konwn"<strong>;</strong></span><strong><span style="color: green">//8</span></strong><span style="color: green"><br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1042" /></span><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue">public</span><span style="color: black">&nbsp;Student()<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image005.gif" width="11" border="0" v:shapes="_382_406_Open_Image" /><img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image006.gif" width="11" border="0" v:shapes="_382_406_Closed_Image" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black">{<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1045" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue">super</span><span style="color: black">();&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image007.gif" width="11" border="0" v:shapes="_x0000_i1046" />&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1047" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue">public</span><span style="color: black">&nbsp;Student&nbsp;(String&nbsp;name&nbsp;,</span><span style="color: blue">int</span><span style="color: black">&nbsp;age,&nbsp;String&nbsp;school)&nbsp;&nbsp;</span><strong><span style="color: green">//1</span></strong><span style="color: green"><br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image005.gif" width="11" border="0" v:shapes="_474_537_Open_Image" /><img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image006.gif" width="11" border="0" v:shapes="_474_537_Closed_Image" /></span><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black">{<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1050" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue">super</span><span style="color: black">(name,age);&nbsp;<strong>&nbsp;</strong></span><strong><span style="color: green">//2</span></strong><span style="color: green"><br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1051" /></span><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue">this</span><span style="color: black">.school&nbsp;=&nbsp;school<strong>;</strong></span><strong><span style="color: green">//9</span></strong><span style="color: green"><br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image007.gif" width="11" border="0" v:shapes="_x0000_i1052" /></span><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1053" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue">public</span>&nbsp;<span style="color: blue">void</span><span style="color: black">&nbsp;showInfo()<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image005.gif" width="11" border="0" v:shapes="_570_646_Open_Image" /><img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image006.gif" width="11" border="0" v:shapes="_570_646_Closed_Image" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black">{<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1056" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue">super</span><span style="color: black">.showInfo();<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1057" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("School&nbsp;is&nbsp;:"+school);<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image007.gif" width="11" border="0" v:shapes="_x0000_i1058" />&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image008.gif" width="11" border="0" v:shapes="_x0000_i1059" />}</span></span></p>
<p style="background: #eeeedd; margin: 7.5pt 0cm; text-align: left" align="left"><span style="font-size: 11pt; font-family: Verdana">AllTest.java</span></p>
<p style="background: #e6e6e6; word-break: break-all; text-align: left" align="left"><span style="font-size: 11pt; font-family: Verdana"><img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.gif" width="11" border="0" v:shapes="_x0000_i1071" /><span style="color: blue">class</span><span style="color: black">&nbsp;AllTest<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image002.gif" width="11" border="0" v:shapes="_14_123_Open_Image" /><img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.gif" width="11" border="0" v:shapes="_14_123_Closed_Image" /></span><span style="color: black">{<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1074" />&nbsp;</span><span style="color: blue">public</span>&nbsp;<span style="color: blue">static</span>&nbsp;<span style="color: blue">void</span><span style="color: black">&nbsp;main(String[]args)<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image005.gif" width="11" border="0" v:shapes="_56_121_Open_Image" /><img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image006.gif" width="11" border="0" v:shapes="_56_121_Closed_Image" />&nbsp;</span><span style="color: black">{<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1034" />&nbsp;&nbsp;Student&nbsp;stA&nbsp;=&nbsp;</span><span style="color: blue">new</span><span style="color: black">&nbsp;Student("wanghao",20,"qinghuadaxue");<strong>&nbsp;</strong></span><strong><span style="color: green">//0</span></strong><span style="color: green"><br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image007.gif" width="11" border="0" v:shapes="_x0000_i1035" /></span><span style="color: black">&nbsp;}<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image008.gif" width="11" border="0" v:shapes="_x0000_i1036" />}</span></span></p>
<p style="background: #eeeedd; margin: 7.5pt 0cm; text-align: left" align="left"><span style="font-size: 11pt; font-family: 宋体">其语句的执行顺序是怎样的呢？</span><span style="font-size: 11pt; font-family: Verdana"><br />
java</span><strong><span style="font-size: 11pt; color: blue; font-family: 宋体">中，在使用</span></strong><strong><span style="font-size: 11pt; color: blue; font-family: Verdana">new</span></strong><strong><span style="font-size: 11pt; color: blue; font-family: 宋体">操作符创建一个类的实例对象的时候，开始分配空间并将成员变量初始化为</span></strong><strong><span style="font-size: 11pt; color: red; font-family: 宋体">默认的</span></strong><strong><span style="font-size: 11pt; color: blue; font-family: 宋体">数值</span></strong><span style="font-size: 11pt; font-family: 宋体">，注意这里并不是指将变量初始化为在变量定义处的初始值，而<strong><span style="color: red">是给整形赋值</span></strong></span><strong><span style="font-size: 11pt; color: red; font-family: Verdana">0</span></strong><strong><span style="font-size: 11pt; color: red; font-family: 宋体">，给字符串赋值</span></strong><strong><span style="font-size: 11pt; color: red; font-family: Verdana">null </span></strong><strong><span style="font-size: 11pt; color: red; font-family: 宋体">这一点于</span></strong><strong><span style="font-size: 11pt; color: red; font-family: Verdana">C++</span></strong><strong><span style="font-size: 11pt; color: red; font-family: 宋体">不同</span></strong><span style="font-size: 11pt; font-family: 宋体">，（</span><span style="font-size: 11pt; font-family: Verdana">student.name = null , student.age = 0 </span><span style="font-size: 11pt; font-family: 宋体">）</span><span style="font-size: 11pt; font-family: Verdana"><br />
</span><strong><span style="font-size: 11pt; color: red; font-family: 宋体">然后</span></strong><span style="font-size: 11pt; font-family: 宋体">在进入类的构造函数。</span></p>
<p style="background: #eeeedd; margin: 7.5pt 0cm; text-align: left" align="left"><span style="font-size: 11pt; font-family: 宋体">在构造函数里面，首先要检查是否有</span><span style="font-size: 11pt; font-family: Verdana">this</span><span style="font-size: 11pt; font-family: 宋体">或者</span><span style="font-size: 11pt; font-family: Verdana">super</span><span style="font-size: 11pt; font-family: 宋体">调用，</span><span style="font-size: 11pt; font-family: Verdana">this</span><span style="font-size: 11pt; font-family: 宋体">调用是完成本类本身的构造函数之间的调用，</span><span style="font-size: 11pt; font-family: Verdana">super</span><span style="font-size: 11pt; font-family: 宋体">调用是完成对父类的调用。<strong><span style="color: blue">二者只能出现一个，并且只能作为构造函数的第一句出现。</span></strong>在调用</span><span style="font-size: 11pt; font-family: Verdana">this</span><span style="font-size: 11pt; font-family: 宋体">和</span><span style="font-size: 11pt; font-family: Verdana">super</span><span style="font-size: 11pt; font-family: 宋体">的时候实现程序的跳转，转而执行被调用的</span><span style="font-size: 11pt; font-family: Verdana">this</span><span style="font-size: 11pt; font-family: 宋体">构造函数或者</span><span style="font-size: 11pt; font-family: Verdana">super</span><span style="font-size: 11pt; font-family: 宋体">构造函数。</span><span style="font-size: 11pt; font-family: Verdana"><br />
</span><span style="font-size: 11pt; font-family: 宋体">在</span><span style="font-size: 11pt; font-family: Verdana">this</span><span style="font-size: 11pt; font-family: 宋体">和</span><span style="font-size: 11pt; font-family: Verdana">super</span><span style="font-size: 11pt; font-family: 宋体">执行完毕，<strong><span style="color: blue">程序转而执行在类定义的时候进行的变量初始化工作</span></strong><span style="color: blue">。</span></span><span style="font-size: 11pt; font-family: Verdana"><br />
</span><span style="font-size: 11pt; font-family: 宋体">这个执行完毕，才是构造函数中剩下的代码的执行。</span><span style="font-size: 11pt; font-family: Verdana"><br />
</span><span style="font-size: 11pt; font-family: 宋体">执行顺序已经用绿色标出。</span><span style="font-family: Georgia"></p>
<p>Order of initialization<br />
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<br />
//: c04:OrderOfInitialization.java<br />
// Demonstrates initialization order.<br />
import com.bruceeckel.simpletest.*;</p>
<p>// When the constructor is called to create a<br />
// Tag object, you'll see a message:<br />
class Tag {<br />
&nbsp; Tag(int marker) {<br />
&nbsp;&nbsp;&nbsp; System.out.println("Tag(" + marker + ")");<br />
&nbsp; }<br />
}</p>
<p>class Card {<br />
&nbsp; Tag t1 = new Tag(1); // Before constructor<br />
&nbsp; Card() {<br />
&nbsp;&nbsp;&nbsp; // Indicate we're in the constructor:<br />
&nbsp;&nbsp;&nbsp; System.out.println("Card()");<br />
&nbsp;&nbsp;&nbsp; t3 = new Tag(33); // Reinitialize t3<br />
&nbsp; }<br />
&nbsp; Tag t2 = new Tag(2); // After constructor<br />
&nbsp; void f() {<br />
&nbsp;&nbsp;&nbsp; System.out.println("f()");<br />
&nbsp; }<br />
&nbsp; Tag t3 = new Tag(3); // At end<br />
}</p>
<p>public class OrderOfInitialization {<br />
&nbsp; static Test monitor = new Test();<br />
&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp; Card t = new Card();<br />
&nbsp;&nbsp;&nbsp; t.f(); // Shows that construction is done<br />
&nbsp;&nbsp;&nbsp; monitor.expect(new String[] {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Tag(1)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Tag(2)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Tag(3)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Card()",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Tag(33)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "f()"<br />
&nbsp;&nbsp;&nbsp; });<br />
&nbsp; }<br />
} ///:~</p>
<p><br />
//: c04:StaticInitialization.java<br />
// Specifying initial values in a class definition.<br />
class Bowl {<br />
&nbsp; Bowl(int marker) {<br />
&nbsp;&nbsp;&nbsp; System.out.println("Bowl(" + marker + ")");<br />
&nbsp; }<br />
&nbsp; void f(int marker) {<br />
&nbsp;&nbsp;&nbsp; System.out.println("f(" + marker + ")");<br />
&nbsp; }<br />
}</p>
<p>class Table {<br />
&nbsp; static Bowl b1 = new Bowl(1);<br />
&nbsp; Table() {<br />
&nbsp;&nbsp;&nbsp; System.out.println("Table()");<br />
&nbsp;&nbsp;&nbsp; b2.f(1);<br />
&nbsp; }<br />
&nbsp; void f2(int marker) {<br />
&nbsp;&nbsp;&nbsp; System.out.println("f2(" + marker + ")");<br />
&nbsp; }<br />
&nbsp; static Bowl b2 = new Bowl(2);<br />
}</p>
<p>class Cupboard {<br />
&nbsp; Bowl b3 = new Bowl(3);<br />
&nbsp; static Bowl b4 = new Bowl(4);<br />
&nbsp; Cupboard() {<br />
&nbsp;&nbsp;&nbsp; System.out.println("Cupboard()");<br />
&nbsp;&nbsp;&nbsp; b4.f(2);<br />
&nbsp; }<br />
&nbsp; void f3(int marker) {<br />
&nbsp;&nbsp;&nbsp; System.out.println("f3(" + marker + ")");<br />
&nbsp; }<br />
&nbsp; static Bowl b5 = new Bowl(5);<br />
}</p>
<p>public class StaticInitialization {<br />
&nbsp; static Test monitor = new Test();<br />
&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp; System.out.println("Creating new Cupboard() in main");<br />
&nbsp;&nbsp;&nbsp; new Cupboard();<br />
&nbsp;&nbsp;&nbsp; System.out.println("Creating new Cupboard() in main");<br />
&nbsp;&nbsp;&nbsp; new Cupboard();<br />
&nbsp;&nbsp;&nbsp; t2.f2(1);<br />
&nbsp;&nbsp;&nbsp; t3.f3(1);<br />
&nbsp;&nbsp;&nbsp; monitor.expect(new String[] {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Bowl(1)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Bowl(2)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Table()",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "f(1)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Bowl(4)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Bowl(5)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Bowl(3)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Cupboard()",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "f(2)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Creating new Cupboard() in main",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Bowl(3)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Cupboard()",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "f(2)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Creating new Cupboard() in main",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Bowl(3)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Cupboard()",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "f(2)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "f2(1)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "f3(1)"<br />
&nbsp;&nbsp;&nbsp; });<br />
&nbsp; }<br />
&nbsp; static Table t2 = new Table();<br />
&nbsp; static Cupboard t3 = new Cupboard();<br />
} ///:~</p>
<p><br />
继承情况下的初始化<br />
了解一下包括继承在内的初始化的过程将是非常有益的，这样就能有个总<br />
体的了解。看看下面这段代码：<br />
//: c06:Beetle.java<br />
// The full process of initialization.<br />
class Insect {<br />
&nbsp; protected static Test monitor = new Test();<br />
&nbsp; private int i = 9;<br />
&nbsp; protected int j;<br />
&nbsp; Insect() {<br />
&nbsp;&nbsp;&nbsp; System.out.println("i = " + i + ", j = " + j);<br />
&nbsp;&nbsp;&nbsp; j = 39;<br />
&nbsp; }<br />
&nbsp; private static int x1 = print("static Insect.x1 initialized");<br />
&nbsp; static int print(String s) {<br />
&nbsp;&nbsp;&nbsp; System.out.println(s);<br />
&nbsp;&nbsp;&nbsp; return 47;<br />
&nbsp; }<br />
}</p>
<p>public class Beetle extends Insect {<br />
&nbsp; private int k = print("Beetle.k initialized");<br />
&nbsp; public Beetle() {<br />
&nbsp;&nbsp;&nbsp; System.out.println("k = " + k);<br />
&nbsp;&nbsp;&nbsp; System.out.println("j = " + j);<br />
&nbsp; }<br />
&nbsp; private static int x2 = print("static Beetle.x2 initialized");<br />
&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp; System.out.println("Beetle constructor");<br />
&nbsp;&nbsp;&nbsp; Beetle b = new Beetle();<br />
&nbsp;&nbsp;&nbsp; monitor.expect(new String[] {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "static Insect.x1 initialized",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "static Beetle.x2 initialized",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Beetle constructor",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "i = 9, j = 0",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Beetle.k initialized",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "k = 47",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "j = 39"<br />
&nbsp;&nbsp;&nbsp; });<br />
&nbsp; }<br />
} ///:~</p>
<p></span><span style="font-size: 12pt; font-family: 宋体">当你用</span><span style="font-size: 12pt; font-family: TT1D3Eo00">Java </span><span style="font-size: 12pt; font-family: 宋体">运行</span><span style="font-size: 12pt; font-family: TT1D3Eo00">Beetle </span><span style="font-size: 12pt; font-family: 宋体">的时候，第一件事就是访问了</span><span style="font-size: 12pt; font-family: TT1D3Eo00">Beetel.main( )(</span><span style="font-size: 12pt; font-family: 宋体">这是一个</span><span style="font-size: 12pt; font-family: TT1D3Eo00">static </span><span style="font-size: 12pt; font-family: 宋体">方<span style="color: blue">法</span></span><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">)</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">，于是装载器</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">(loader)</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">就会为</span></strong></p>
<p><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">你寻找经编译的</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">Beetle </span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">类的代码</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">(</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">也就是</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">Beetle.class </span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">文件</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">)</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">。在装载的过程中，装载器注意到它有一个基类</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">(</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">也就是</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">extends </span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">所要表示的意思</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">)</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">，于是它再装载基类。不管你创不创建基类对象，这个过程总会发生。</span></strong><span style="font-size: 12pt; font-family: TT1D3Eo00">(</span><span style="font-size: 12pt; font-family: 宋体">试试看，把创建对象的那句注释掉，看看会有什么结果。</span><span style="font-size: 12pt; font-family: TT1D3Eo00">)</span><span style="font-size: 12pt; font-family: 宋体">如果基类还有基类，那么这第二个基类也会被装载，以此类推<span style="color: blue">。<strong>下一步，它会执行&#8220;根基类</strong></span></span><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">(root bas e class)</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">&#8221;</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">(</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">这里就是</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">Insect)</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">的</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">static </span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">初始化，然后是下一个派生类的</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">static </span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">初始化，</span></strong><span style="font-size: 12pt; font-family: 宋体">以此类推。这个顺序非常重要，因为派生类的&#8220;静态初始化</span><span style="font-size: 12pt; font-family: TT1D3Eo00">(</span><span style="font-size: 12pt; font-family: 宋体">即前面讲的</span><span style="font-size: 12pt; font-family: TT1D3Eo00">static </span><span style="font-size: 12pt; font-family: 宋体">初始化</span><span style="font-size: 12pt; font-family: TT1D3Eo00">)</span><span style="font-size: 12pt; font-family: 宋体">&#8221;有可能要依赖基类成员的正确初始化。</span></p>
<p><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">现在所有必要的类都已经装载结束，可以创建对象了。</span></strong><span style="font-size: 12pt; font-family: 宋体">首先，对象里的所有的</span><span style="font-size: 12pt; font-family: TT1D3Eo00">primitive </span><span style="font-size: 12pt; font-family: 宋体">都会被设成它们的缺省值，而</span><span style="font-size: 12pt; font-family: TT1D3Eo00">reference </span><span style="font-size: 12pt; font-family: 宋体">也会被设成</span><span style="font-size: 12pt; font-family: TT1D3Eo00">null</span><span style="font-size: 12pt; font-family: 宋体">——这个过程是<strong><span style="color: blue">一瞬间</span></strong>完成的，对象的内存会被统一地设置成&#8220;两进制的零</span><span style="font-size: 12pt; font-family: TT1D3Eo00">(binary zero)</span><span style="font-size: 12pt; font-family: 宋体">&#8221;。<strong><span style="color: blue">如果有对成员变量赋初值，则对成员变量进行赋值，然后调用基类的构造函数。调用是自动发生的，但是你可以使用</span></strong></span><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">super </span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">来指定调用哪个构造函数</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">(</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">也就</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">Beetle( )</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">构造函数所做的第一件事</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">)</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">。基类的构造过程以及构造顺序，同派生类的相同。基类构造函数运行完毕之后，会按照各个变量的字面顺序进行初始化。最后会执行构造函数的其余部分。</span></strong></p>
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/270110.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-11 21:16 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/05/11/270110.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++虚函数声明为private也可以实现运行时多态</title><link>http://www.blogjava.net/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.blogjava.net/fhtdy2004/archive/2009/05/07/269408.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/269408.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/05/07/269408.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/269408.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/269408.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/fhtdy2004/archive/2009/05/07/269408.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/269408.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-07 14:02 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/05/07/269408.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java方法覆盖Override</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/05/07/269407.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Thu, 07 May 2009 05:56:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/05/07/269407.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/269407.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/05/07/269407.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/269407.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/269407.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/fhtdy2004/archive/2009/05/07/269407.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/269407.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-07 13:56 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/05/07/269407.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java对象的强、软、弱和虚引用</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/04/30/268412.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Thu, 30 Apr 2009 10:10:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/04/30/268412.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/268412.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/04/30/268412.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/268412.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/268412.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/fhtdy2004/archive/2009/04/30/268412.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/268412.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-04-30 18:10 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/04/30/268412.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java try return finally</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/04/30/268386.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Thu, 30 Apr 2009 08:04:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/04/30/268386.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/268386.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/04/30/268386.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/268386.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/268386.html</trackback:ping><description><![CDATA[<p>由一个笔试题想到的<br />
try有return,catch也有return,且有finally块<br />
<em><span style="color: red"><em>并且finally中对resutl进行的赋值并不影响之前的已经return 的result值<br />
最后返回的result引用还是之前的result引用<br />
finally其实也可以有return，一般eclipse会提示finally block does not complete normally,但不会报错<br />
并且会忽略之前的返回和抛出的异常</em></span><br />
</em></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"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;returnfinally;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_60_1021_Open_Image" onclick="this.style.display='none'; Codehighlighter1_60_1021_Open_Text.style.display='none'; Codehighlighter1_60_1021_Closed_Image.style.display='inline'; Codehighlighter1_60_1021_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_60_1021_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_60_1021_Closed_Text.style.display='none'; Codehighlighter1_60_1021_Open_Image.style.display='inline'; Codehighlighter1_60_1021_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TestReturnAfterFinally&nbsp;</span><span id="Codehighlighter1_60_1021_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_60_1021_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_104_316_Open_Image" onclick="this.style.display='none'; Codehighlighter1_104_316_Open_Text.style.display='none'; Codehighlighter1_104_316_Closed_Image.style.display='inline'; Codehighlighter1_104_316_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_104_316_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_104_316_Closed_Text.style.display='none'; Codehighlighter1_104_316_Open_Image.style.display='inline'; Codehighlighter1_104_316_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_104_316_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_104_316_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_113_213_Open_Image" onclick="this.style.display='none'; Codehighlighter1_113_213_Open_Text.style.display='none'; Codehighlighter1_113_213_Closed_Image.style.display='inline'; Codehighlighter1_113_213_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_113_213_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_113_213_Closed_Text.style.display='none'; Codehighlighter1_113_213_Open_Image.style.display='inline'; Codehighlighter1_113_213_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_113_213_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_113_213_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;result&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;testException();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(result);<br />
<img id="Codehighlighter1_235_312_Open_Image" onclick="this.style.display='none'; Codehighlighter1_235_312_Open_Text.style.display='none'; Codehighlighter1_235_312_Closed_Image.style.display='inline'; Codehighlighter1_235_312_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_235_312_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_235_312_Closed_Text.style.display='none'; Codehighlighter1_235_312_Open_Image.style.display='inline'; Codehighlighter1_235_312_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;e)&nbsp;</span><span id="Codehighlighter1_235_312_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_235_312_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;System.out.println(result);</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e.toString());<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_376_1017_Open_Image" onclick="this.style.display='none'; Codehighlighter1_376_1017_Open_Text.style.display='none'; Codehighlighter1_376_1017_Closed_Image.style.display='inline'; Codehighlighter1_376_1017_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_376_1017_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_376_1017_Closed_Text.style.display='none'; Codehighlighter1_376_1017_Open_Image.style.display='inline'; Codehighlighter1_376_1017_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;String&nbsp;testException()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;</span><span id="Codehighlighter1_376_1017_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_376_1017_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;result&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_408_706_Open_Image" onclick="this.style.display='none'; Codehighlighter1_408_706_Open_Text.style.display='none'; Codehighlighter1_408_706_Closed_Image.style.display='inline'; Codehighlighter1_408_706_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_408_706_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_408_706_Closed_Text.style.display='none'; Codehighlighter1_408_706_Open_Image.style.display='inline'; Codehighlighter1_408_706_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_408_706_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_408_706_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;if&nbsp;(true)&nbsp;throw&nbsp;new&nbsp;MyException("异常！");<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">int&nbsp;i&nbsp;=&nbsp;0;</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">&nbsp;i;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">函数不会正常的返回,在返回前已经抛出异常了，抛出异常即函数返回了</span><span style="color: #008000"><br />
<img id="Codehighlighter1_550_617_Open_Image" onclick="this.style.display='none'; Codehighlighter1_550_617_Open_Text.style.display='none'; Codehighlighter1_550_617_Closed_Image.style.display='inline'; Codehighlighter1_550_617_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_550_617_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_550_617_Closed_Text.style.display='none'; Codehighlighter1_550_617_Open_Image.style.display='inline'; Codehighlighter1_550_617_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_550_617_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_550_617_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;相当于catch(Exception&nbsp;e){<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;e;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;}<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_623_671_Open_Image" onclick="this.style.display='none'; Codehighlighter1_623_671_Open_Text.style.display='none'; Codehighlighter1_623_671_Closed_Image.style.display='inline'; Codehighlighter1_623_671_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_623_671_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_623_671_Closed_Text.style.display='none'; Codehighlighter1_623_671_Open_Image.style.display='inline'; Codehighlighter1_623_671_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_623_671_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_623_671_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result="in&nbsp;try";<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;result;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Exception(</span><span style="color: #000000">"</span><span style="color: #000000">h</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img id="Codehighlighter1_725_837_Open_Image" onclick="this.style.display='none'; Codehighlighter1_725_837_Open_Text.style.display='none'; Codehighlighter1_725_837_Closed_Image.style.display='inline'; Codehighlighter1_725_837_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_725_837_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_725_837_Closed_Text.style.display='none'; Codehighlighter1_725_837_Open_Image.style.display='inline'; Codehighlighter1_725_837_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception&nbsp;e)</span><span id="Codehighlighter1_725_837_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_725_837_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exception&nbsp;ee&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;e;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">throw&nbsp;ee;</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">in&nbsp;catch</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;result;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_850_989_Open_Image" onclick="this.style.display='none'; Codehighlighter1_850_989_Open_Text.style.display='none'; Codehighlighter1_850_989_Closed_Image.style.display='inline'; Codehighlighter1_850_989_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_850_989_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_850_989_Closed_Text.style.display='none'; Codehighlighter1_850_989_Open_Image.style.display='inline'; Codehighlighter1_850_989_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">finally</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_850_989_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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_850_989_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">in&nbsp;finally！</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(result);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">return&nbsp;result;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">throw&nbsp;new&nbsp;Exception("ex&nbsp;cretated&nbsp;in&nbsp;finally");</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">return&nbsp;result;</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<p><br />
<br />
<br />
&nbsp;</p>
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/268386.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-04-30 16:04 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/04/30/268386.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java的回调机制</title><link>http://www.blogjava.net/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.blogjava.net/fhtdy2004/archive/2009/04/29/268249.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/268249.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/04/29/268249.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/268249.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/268249.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/fhtdy2004/archive/2009/04/29/268249.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/268249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-04-29 22:31 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/04/29/268249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java String笔试经常遇到的</title><link>http://www.blogjava.net/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.blogjava.net/fhtdy2004/archive/2009/04/29/268231.html</guid><description><![CDATA[<p>java.lang.String的intern()方法 <br />
"abc".intern()方法的返回值还是字符串"abc"，表面上看起来好像这个方法没什么用处。但实际上，它做了个小动作： <br />
检查字符串池里是否存在"abc"这么一个字符串，如果存在，就返回池里的字符串；如果不存在，该方法会把"abc"添加到字符串池中，然后再返回它的引用。 <br />
我们做个测试： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String str1 = "a"; <br />
String str2 = "bc"; <br />
String str3 = "a"+"bc"; <br />
String str4 = str1+str2; <br />
&nbsp;&nbsp; <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文档是这么解释的： <br />
======================================================================= <br />
返回字符串对象的规范化表示形式。 <br />
一个初始时为空的字符串池，它由类 String 私有地维护。 <br />
当调用 intern 方法时，如果池已经包含一个等于此 String 对象的字符串（该对象由 equals(Object) 方法确定），则返回池中的字符串。否则，将此 String 对象添加到池中，并且返回此 String 对象的引用。 <br />
它遵循对于任何两个字符串 s 和 t，当且仅当 s.equals(t) 为 true 时，s.intern() == t.intern() 才为 true。 <br />
所有字面值字符串和字符串赋值常量表达式都是内部的。字符串字面值在《Java Language Specification》的 &#167;3.10.5 中已定义。 </p>
<p>返回： <br />
一个字符串，内容与此字符串相同，但它保证来自字符串池中。 <br />
=======================================================================</p>
<p>字符串字面池指的是常量池.</p>
<p>字符串对象的创建方式有两种</p>
<p>如下:</p>
<p>String s1 = new String("");&nbsp;&nbsp; //第一种</p>
<p>String s2 = "";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //第二种</p>
<p>第一种始终不会入池的.</p>
<p>第二种要看情况而定(等号右边如果是常量则入池,非常量则不入池)</p>
<p>例:</p>
<p>String s3 = "a" + "b"; //"a"是常量,"b"是常量,常量+常量=常量,所以会入池.</p>
<p>String s4 = s1 + "b";&nbsp;&nbsp; //s1是变量,"b"是常量,变量+常量!=常量,所以不会入池.<br />
　　　　　　　　　//那引用s4所指的对象在哪里创建??????</p>
<p>一旦入池的话,就会先查找池中有无此对象.如果有此对象,则让对象引用指向此对象;如果无此对象,则先创建此对象,再让对象引用指向此对象.</p>
<p>例:</p>
<p>String s5 = "abc"; //先在池中查找有无"abc"对象,如果有,则让s5指向此对象;如果池中无"abc"对象,则在池中创建一个"abc"对象,然后让s5指向该对象.补充一下：</p>
<p>看了字节码后，发现<br />
String str ="a"+"b";<br />
完全等同于<br />
String str="ab"; <br />
</p>
<p><br />
&nbsp;-----------------------------------------------------------------------------------------------------------------------------<br />
<br />
Java虚拟机有一个字符串池，保存着几乎所有的字符串常量。字符串表达式总是指向字符串池中的一个对象。<br />
public class Test...{<br />
&nbsp;public static void main(String[] args)...{<br />
&nbsp; String s1=new String("abc");<br />
&nbsp; String s2="abc";//放入String池里<br />
&nbsp; String s3=new String("abc");<br />
&nbsp; System.out.println(s1==s2);//false<br />
&nbsp; System.out.println(s1==s3);//false<br />
&nbsp; System.out.println(s3==s2);//false<br />
&nbsp; System.out.println(s1==s1.intern());//s1.intern()到String池里找，而s1是在堆中所以返回false<br />
&nbsp; System.out.println(s2==s2.intern());//true<br />
&nbsp; System.out.println(s1.intern()==s3.intern());//两个字符串同时到String池里查找，返回true<br />
&nbsp; <br />
&nbsp;&nbsp; //以下三个都放到String池<br />
&nbsp; String hello="hello";<br />
&nbsp; String hel="hel";<br />
&nbsp; String lo="lo";<br />
&nbsp; System.out.println(hello=="hel"+"lo");//字符串相加以后，会到String池里找，有不产生，所以返回true<br />
&nbsp; System.out.println(hello=="hello");//直接到String池里找，返回true<br />
&nbsp; System.out.println(hello=="hel"+lo);//字符串加一个引用，将产生一个新的对象，所以返回false<br />
&nbsp; System.out.println(hello==(hel+lo));//类似上面，返回false<br />
&nbsp; System.out.println(hello==(hel+lo).intern());//产生新的对象，但是有intern()方法，将到String池中找，返回true<br />
&nbsp;}<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">&nbsp;1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com._6617.fhs.weatherservice;<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.HashSet;<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Set;<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">&nbsp;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.blogjava.net/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.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Test&nbsp;</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.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_106_2030_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: #008080">&nbsp;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.blogjava.net/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.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</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">/**&nbsp;*/</span><span id="Codehighlighter1_110_133_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;args<br />
</span><span style="color: #008080">10</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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.blogjava.net/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.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;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.blogjava.net/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.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">38</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set&nbsp;set&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashSet();<br />
</span><span style="color: #008080">39</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set.add(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;A());<br />
</span><span style="color: #008080">40</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set.add(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;A());<br />
</span><span style="color: #008080">41</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set.add(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;A());<br />
</span><span style="color: #008080">42</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(set.size());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//主要是看类A是否自己实现了hashcode和equals方法<br />
</span><span style="color: #008080">43</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">44</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;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.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;t&nbsp;</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.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</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.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;u&nbsp;</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">&nbsp;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.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">56</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">String[]&nbsp;s&nbsp;=&nbsp;new&nbsp;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.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">a</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;<br />
</span><span style="color: #008080">59</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">bc</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;<br />
</span><span style="color: #008080">60</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str3&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</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">;&nbsp;<br />
</span><span style="color: #008080">61</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str4&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;str1</span><span style="color: #000000">+</span><span style="color: #000000">str2;&nbsp;<br />
</span><span style="color: #008080">62</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str5&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</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.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">64</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(str3</span><span style="color: #000000">==</span><span style="color: #000000">str4);&nbsp;</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.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(str3</span><span style="color: #000000">==</span><span style="color: #000000">str5);&nbsp;</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.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(str3</span><span style="color: #000000">==</span><span style="color: #000000">str5);&nbsp;</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.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str4&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(str1</span><span style="color: #000000">+</span><span style="color: #000000">str2).intern();&nbsp;<br />
</span><span style="color: #008080">68</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(str3</span><span style="color: #000000">==</span><span style="color: #000000">str4);&nbsp;</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.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000"><br />
</span><span style="color: #008080">73</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: #008080">74</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">75</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: #008080">76</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/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.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">78</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">79</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">80</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<br />
<br /><img src ="http://www.blogjava.net/fhtdy2004/aggbug/268231.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-04-29 21:04 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/04/29/268231.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>