锘??xml version="1.0" encoding="utf-8" standalone="yes"?> http://www.ibm.com/developerworks/cn/java/j-tiger08104/ 璺熻釜鏃犳硶棰勬湡鐨勮繍琛屾椂寮傚父鍙兘鏄竴浠跺張鎱㈠張璐瑰姏鐨勪簨鎯咃紝鍙幏寰楅粯璁ょ嚎紼嬪悕縐板拰鍫嗘爤璺熻釜閫氬父鏄笉澶熺殑銆傚湪 椹湇 Tiger 榪欎竴鏈熶笓鏍忎腑錛孞ava 寮鍙戜漢鍛?John Zukowski 鍚戞偍灞曠ず浜嗗浣曢氳繃鏇夸唬榛樿琛屼負鏉ュ畾鍒惰緭鍑恒備粬榪樺姣斾簡閫氳繃緇嗗垎 铏界劧鎴戜滑涓嶆兂鍒涘緩鍦ㄦ棤娉曢鏈熸椂鎶涘嚭榪愯鏃跺紓甯哥殑紼嬪簭錛屼絾榪欑鎯呭喌榪樻槸浼氬彂鐢熲斺斿挨鍏舵槸絎竴嬈¤繍琛屽鏉傜▼搴忔椂銆傞氬父鏄嬌鐢ㄩ粯璁よ涓恒佹墦鍗板爢鏍堟孩鍑哄拰緇撴潫綰跨▼鐨勭敓鍛芥潵澶勭悊榪欎簺寮傚父銆?/p>
浠庡摢閲屽彂鐜伴粯璁よ涓猴紵姣忎釜綰跨▼閮藉睘浜庝竴涓敱 鍦?Tiger 涔嬪墠錛? 浣跨敤 ThreadGroup 鐨勫畾鍒惰涓?/span> 鍙戠敓鏈崟鑾風殑寮傚父鏃訛紝榛樿琛屼負鏄皢鍫嗘爤婧㈠嚭鎵撳嵃杈撳嚭鍒扮郴緇熼敊璇紙 涓嶄嬌鐢ㄤ換浣曞弬鏁拌繍琛岃紼嬪簭灝嗙敓鎴愭竻鍗?2 涓殑杈撳嚭銆傚敖綆″畠涓嶆槸涓涓緢闀跨殑鍫嗘爤璺熻釜錛屼絾瀹冩槸涓涓畬鏁寸殑鍫嗘爤璺熻釜銆?/p>
姝e Java 騫沖彴鐨勮澶氫笢瑗夸竴鏍鳳紝濡傛灉涓嶅枩嬈㈤粯璁よ涓猴紝鎮ㄥ彲浠ュ鍏惰繘琛屾洿鏀廣傚湪 Java 騫沖彴鐨?Tiger 鐗堜互鍓嶇殑鐗堟湰涓紝涓嶈兘鏇夸唬鎵鏈夌嚎紼嬬殑榛樿琛屼負錛屼絾鏄彲浠ュ垱寤轟竴涓柊鐨? 榪欓噷鍒涘緩鐨勫畾鍒? 鎵ц 娓呭崟 3 涓殑 鍙戠敓榪愯鏃跺紓甯告椂錛屽彲鑳借鍋氳澶氬伐浣滄潵鏇存敼鍙戠敓鐨勯棶棰樸傝浠g爜鐨勫ぇ閮ㄥ垎閮芥槸 Logging Handler錛屼絾鏄紝瑕佹墽琛屾洿鏀癸紝灝卞繀欏葷粏鍒? 浣跨敤 UncaughtExceptionHandler 鐨勫畾鍒惰涓?/span> 瀵逛簬 Tiger錛? 鎮ㄥ彲鑳芥病鏈夋敞鎰忓埌錛屾竻鍗?7 涓殑鏂規硶涓庢垜浠墠闈㈤噸鍐欑殑 鏂扮殑鍐呴儴綾誨彲浠ュ府鍔╂垜浠簡瑙d笅鍒椾袱瀵規柊鏂規硶錛屽茍鏈夊姪浜庢垜浠湪 絎竴瀵規柟娉曟槸 鍚搗鏉ュソ鍍忓緢綆鍗曘備負浜嗚繘琛岃鏄庯紝娓呭崟 8 杞崲浜?娓呭崟 3 涓殑 璇ョ▼搴忓彧鏄皢 鍍忔坊鍔犳湭鎹曡幏鐨勫紓甯稿鐞嗙▼搴忚繖鏍風殑綆鍗曞簱鏇存敼錛屽彲浠ユ瀬澶у湴澧炲姞鍘熶唬鐮佺殑鍙悊瑙fс傝櫧鐒跺湪綰跨▼緇勭駭鍒笂錛屾柊鐨勫簱浠g爜鐨勫姛鑳戒笌鍘熸潵搴撲唬鐮佺殑鐩稿悓錛屼絾鏂版ā鍨嬩腑鐨勬槗鐢ㄦу拰鐏墊椿鎬ц繙榪滆秴鍑轟簡灝嗕唬鐮佽皟鏁翠負鏇存柊鐨勬柟寮忔墍闇鐨勬椂闂淬傚綋鐒訛紝鑰佹柟娉曚粛鐒跺彲浠ヤ嬌鐢紝浣嗘渶濂藉皢浠g爜鏇存柊涓烘渶鏂扮殑搴撳姛鑳姐?/p>
ThreadGroup
瀹氬埗杈撳嚭鐨勮佹柟娉曚笌閫氳繃鎻愪緵鑷繁鐨?UncaughtExceptionHandler
瀹氬埗杈撳嚭鐨勬柊鏂規硶銆?java.lang.ThreadGroup
綾昏〃紺虹殑綰跨▼緇勩傞【鍚嶆濅箟錛岀嚎紼嬬粍鍏佽鎮ㄥ皢綰跨▼緇勫悎鍦ㄤ竴璧楓傛偍鍙兘鏄負浜嗘柟渚胯屽皢綰跨▼緇勫悎錛屼緥濡傦紝涓涓嚎紼嬫睜涓殑鎵鏈夌嚎紼嬮兘灞炰簬緇?X錛岃屽彟涓涓睜鐨勬墍鏈夌嚎紼嬪垯灞炰簬緇?Y錛屾垨鑰呮槸涓轟簡璁塊棶鎺у埗鑰屽皢綰跨▼榪涜緇勫悎銆傜粍 X 涓殑綰跨▼鏃犳潈璁塊棶鎴栨敼鍙樼粍 Y 涓殑綰跨▼錛岄櫎闈炲畠浠兘鍦ㄥ悓涓綰跨▼緇勫唴錛堟垨鍦ㄤ竴涓瓙緇勫唴錛夈?ThreadGroup
綾繪彁渚涗簡涓縐嶅鐞嗘湭鎹曡幏寮傚父鐨勬柟娉曪細 ThreadGroup
鐨?uncaughtException()
鏂規硶銆傚鏋滃紓甯鎬笉鏄?ThreadDeath
錛屽垯灝嗙嚎紼嬬殑鍚嶇О鍜屽爢鏍堝洖婧紙stack backtrace錛夊彂閫佸埌 System.err
銆備絾鏄?Tiger 娣誨姞浜嗗彟涓縐嶆柟娉曪細 Thread.UncaughtExceptionHandler
鎺ュ彛銆傜粏鍒?ThreadGroup
鎴栧畨瑁呰鏂版帴鍙g殑瀹炵幇閮藉厑璁告偍鏇存敼榛樿琛屼負銆傛垜浠皢瀵?Tiger 涔嬪墠鍜屼箣鍚庢彁渚涚殑鏂規硶閮借繘琛岀爺絀躲?System.err
錛変腑錛屽娓呭崟 1 涓墍紺恒備笉闇瑕佷嬌鐢ㄤ換浣曞懡浠ゅ弬鏁版潵鍚姩紼嬪簭銆?
娓呭崟 1. 綰跨▼婧㈠嚭紺轟緥
public class SimpleDump {
public static void main(String args[]) {
System.out.println(args[0]);
}
}
娓呭崟 2. 榛樿綰跨▼婧㈠嚭杈撳嚭
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at SimpleDump.main(SimpleDump.java:3)
ThreadGroup
錛屽茍鏇存敼鍦ㄨ緇勫唴鍒涘緩鐨勪換浣曠嚎紼嬬殑榛樿琛屼負銆傛偍鍙互閲嶅啓 uncaughtException(Thread t, Throwable e)
鏂規硶鏉ュ畾鍒惰琛屼負銆傜劧鍚庯紝褰撳彂鐢熸湭棰勬枡鐨勮繍琛屾椂寮傚父鏃訛紝璇ョ嚎紼嬬粍鍐呭垱寤虹殑浠諱綍綰跨▼閮藉皢鑾峰緱鏂扮殑琛屼負銆備笉榪囷紝鏈濂芥槸淇鍩虹闂錛屾垜灝嗘彁渚涗竴涓畝鍗曠殑紺轟緥錛岃鏄庢洿鏀歸粯璁よ涓烘墍蹇呴渶鐨勬楠ゃ傛竻鍗?3 灞曠ず浜嗗皢鎵ц浠g爜鏀懼叆鏂扮嚎紼嬬殑璋冩暣榪囩殑嫻嬭瘯紼嬪簭錛?
娓呭崟 3. 璋冩暣榪囩殑綰跨▼婧㈠嚭紺轟緥
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();
}
}
LoggingThreadGroup
綾繪槸涓涓柊鐨勫唴瀹癸紝娓呭崟 4 涓樉紺轟簡瀹冪殑瀹氫箟銆備負浜嗚繘琛岃鏄庯紝閫氳繃閲嶅啓 uncaughtException()
鏂規硶瀹炵幇鐨勭壒孌婅涓哄皢鍦ㄤ竴涓脊鍑虹獥鍙d腑鏄劇ず璇ュ紓甯革紝榪欓」鎿嶄綔鏄湪鐗規畩 Handler
鐨勫府鍔╀笅浣跨敤 Java Logging API 鏉ュ畬鎴愮殑銆?
娓呭崟 4. LoggingThreadGroup 鐨勫畾涔?/strong>
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);
}
}
Handler
鐨勭被鍨嬩負 LoggingWindowHandler
錛岃綾誨瀷鐨勫畾涔夊湪娓呭崟 5 涓傚鐞嗙▼搴忎嬌鐢ㄤ簡涓涓敮鎸佺被 LoggingWindow
錛岃綾誨皢寮傚父鏄劇ず鍦ㄥ睆騫曚笂銆?娓呭崟 6 涓樉紺轟簡璇ョ被鐨勫畾涔夈?Handler
鐨?public void publish(LogRecord record)
鏂規硶瀹炵幇浜嗕竴浜涢噸瑕佹搷浣溿傚叾浣欐搷浣滃ぇ閮ㄥ垎鍙笌閰嶇疆鏈夊叧銆?
娓呭崟 5. LoggingWindowHandler 鐨勫畾涔?/strong>
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);
}
}
}
}
娓呭崟 6. LoggingWindow 鐨勫畾涔?/strong>
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);
}
});
}
}
WindowDump
紼嬪簭灝嗗嚭鐜板浘 1 涓殑灞忓箷銆傚洜涓烘病鏈変粠 Logger
涓垹闄ゆ帶鍒跺彴澶勭悊紼嬪簭錛屾墍浠ュ爢鏍堟孩鍑轟粛灝嗗嚭鐜板湪鎺у埗鍙頒笂銆?
鍥?1. 璁板綍鐨勫爢鏍堣窡韙?/strong>
ThreadGroup
錛岄噸鍐?uncaughtException()
錛岀劧鍚庡湪璇ョ嚎紼嬬粍涓墽琛屾偍鐨勭嚎紼嬨備笉榪囷紝璁╂垜浠氳繃鍙畨瑁?Thread.UncaughtExceptionHandler
錛屾潵鐪嬩竴鐪?Tiger 鐨勫鐞嗘柟寮忋?
鍥為〉棣?/strong>
Thread
綾誨畾涔変腑娣誨姞浜嗕竴涓柊鐨勫叕鍏卞唴閮ㄧ被 UncaughtExceptionHandler
錛屾洿瀹屾暣鐨勫悕縐頒負 Thread.UncaughtExceptionHandler
錛堝叾浠栫被璁塊棶鍐呴儴綾繪椂闇瑕佷嬌鐢ㄥ畬鏁村悕縐幫級銆傛帴鍙g殑瀹氫箟鏄竴涓柟娉曪紝濡傚浘 7 涓墍紺猴細
娓呭崟 7. UncaughtExceptionHandler 鐨勫畾涔?/strong>
public interface Thread.UncaughtExceptionHandler {
public void uncaughtException(Thread, Throwable);
}
ThreadGroup
鐨勬柟娉曠浉鍚屻傚疄闄呬笂錛岀幇鍦ㄧ敱 ThreadGroup
綾誨疄鐜拌鎺ュ彛銆?Thread
涓嬌鐢ㄥ畠浠細
getUncaughtExceptionHandler()
鍜?setUncaughtExceptionHandler()
銆?
getDefaultUncaughtExceptionHandler()
鍜?setDefaultUncaughtExceptionHandler()
銆?getUncaughtExceptionHandler()
鍜?setUncaughtExceptionHandler()
錛屽畠浠厑璁告偍涓哄綋鍓嶇嚎紼嬪強鍏跺悗浠e畾鍒惰涓猴紝浠庤屽厑璁鎬簩鍗佹垨鏇村鐨勭嚎紼嬫嫢鏈夎嚜宸辯殑瀹氬埗琛屼負銆備笉榪囷紝鎮ㄦ洿鍙兘浣跨敤絎簩瀵規柟娉?getDefaultUncaughtExceptionHandler()
鍜?setDefaultUncaughtExceptionHandler()
銆傚鏋滀嬌鐢ㄧ浜屽鏂規硶璁劇疆榛樿澶勭悊紼嬪簭錛岄偅涔堟病鏈夎嚜宸辯殑寮傚父澶勭悊紼嬪簭鐨勬墍鏈夌嚎紼嬮兘灝嗕嬌鐢ㄩ粯璁ゅ鐞嗙▼搴忋?ThreadGroup
鍙嬪ソ鐨勭▼搴忥紝浣跨敤鏂扮殑 UncaughtExceptionHandler
鎺ュ彛錛?
娓呭崟 8. UncaughtExceptionHandler 紺轟緥
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);
}
}
LoggingThreadGroup
閲嶇敤涓?UncaughtExceptionHandler
錛屽茍娌℃湁鍒涘緩鏂扮殑澶勭悊紼嬪簭瀹炵幇銆傝娉ㄦ剰錛屼笌鍘熸潵鐨勪唬鐮佺浉姣旓紝鏂頒唬鐮佽綆媧佸緱澶氥?
鍥為〉棣?/strong>
Thread
綾諱笉浠呮敮鎸佷嬌鐢?Tiger 娣誨姞鐨勬湭鎹曡幏寮傚父澶勭悊紼嬪簭錛屽畠榪樻敮鎸佷嬌鐢?getAllStackTraces()
鑾峰緱鎵鏈夋湁鏁堢嚎紼嬬殑鍫嗘爤璺熻釜錛屾垨鑰呮敮鎸佷嬌鐢?getStackTrace()
鏉ュ彧鑾峰緱褰撳墠綰跨▼鐨勫爢鏍堣窡韙傝繖涓ょ鍫嗘爤璺熻釜閮借繑鍥炵被鍨嬩負 java.lang.StackTraceElement
鐨勫璞★紝 java.lang.StackTraceElement
鏄?Java 1.4 騫沖彴涓坊鍔犵殑涓涓被錛屽畠鍙互璁╂偍鐢熸垚鑷繁鐨勫爢鏍堣窡韙傚悓鏃訛紝Java 5 騫沖彴鏂版坊鍔犵殑鍔熻兘鏄竴涓儫涓綰跨▼鏍囪瘑絎︼紙鍙互浣跨敤 getId()
鑾峰緱璇ユ爣璇嗙錛夊拰涓涓柊鐨?Thread.State
綾伙紝浠ュ強涓庤綾葷浉鍏崇殑 getThreadState()
鏂規硶銆傛渶鍚庝竴涓嚎紼嬫洿鏀規槸涓涓姸鎬佹灇涓捐〃錛岃琛ㄦ槸鐢ㄦ潵鐩戣緋葷粺鐘舵侊紝鑰屼笉鏄敤鏉ュ悓姝ョ姸鎬佺殑銆?
鍥為〉棣?/strong>
public void run();
>>
鑰屾墍鏈夌殑鍏蜂綋綰跨▼閮藉疄鐜拌繖涓柟娉曪紝鎵浠ヨ繖閲屽氨鏄庣‘浜嗕竴鐐癸紝綰跨▼浠g爜涓嶈兘鎶涘嚭浠諱綍checked寮傚父銆傛墍鏈夌殑綰跨▼涓殑checked寮傚父閮藉彧鑳借綰跨▼鏈韓娑堝寲鎺夈?) 榪欐牱鏈韓涔熸槸絎﹀悎綰跨▼鐨勮璁$悊蹇電殑錛岀嚎紼嬫湰韜氨鏄鐪嬩綔鐙珛鐨勬墽琛岀墖鏂紝瀹冨簲璇ュ鑷繁璐熻矗錛屾墍浠ョ敱瀹冩潵娑堝寲鎵鏈夌殑checked寮傚父鏄緢姝e父鐨勩?
榪欐牱灝卞洖絳斾簡妤間富鐨勭涓涓棶棰橈細checked寮傚父涓瀹氳鍦ㄧ嚎紼嬪唴閮ㄦ秷鍖栥?
浣嗘槸錛岀嚎紼嬩唬鐮佷腑鏄彲浠ユ姏鍑洪敊璇?Error)鍜岃繍琛岀駭鍒紓甯?RuntimeException)鐨勩侲rror淇轟滑鍙互蹇界暐錛屽洜涓洪氬父Error鏄簲璇ョ暀緇檝m鐨勶紝鑰孯untimeException紜槸姣旇緝姝e父鐨勶紝濡傛灉鍦ㄨ繍琛岃繃紼嬩腑婊¤凍浜嗘煇縐嶆潯浠跺鑷寸嚎紼嬪繀欏諱腑鏂紝鍙互閫夋嫨浣跨敤鎶涘嚭榪愯綰у埆寮傚父鏉ュ鐞嗭紝濡備笅錛?
<<
public void run() {
if (...) throw new RuntimeException();
}
>>
褰撶嚎紼嬩唬鐮佹姏鍑鴻繍琛岀駭鍒紓甯鎬箣鍚庯紝綰跨▼浼氫腑鏂?)榪欑偣java涓В閲婂緱寰堟竻妤氾細
<< @see Thread
All threads that are not daemon threads have died, either by returning from the call to the run method or "by throwing an exception that propagates beyond the run method".
>>
浣嗘槸瀵逛簬invoke姝ょ嚎紼嬬殑涓葷嚎紼嬩細浜х敓浠涔堝獎鍝嶅憿錛熶富綰跨▼涓嶅彈榪欎釜褰卞搷錛屼笉浼氬鐞嗚繖涓猂untimeException錛岃屼笖鏍規湰涓嶈兘catch鍒拌繖涓紓甯搞備細緇х畫鎵ц鑷繁鐨勪唬鐮? :)
鎵浠ュ緱鍒扮粨璁猴細綰跨▼鏂規硶鐨勫紓甯稿彧鑳借嚜宸辨潵澶勭悊銆?
鍏充簬鏈鍚庝竴鐐癸紝涓嶇浉淇$殑璇濆ぇ瀹跺彲浠ュ仛榪欎箞涓涓瘯楠岋細
<<
public class TestThreadException extends Thread {
public void run() {
throw new RuntimeException();
}
public static void main(String[] args) throws InterruptedException {
try {
new TestThreadException().start();
} catch(RuntimeException ex) {
// 鐪嬬湅鑳戒笉鑳藉埌杈捐繖閲岋紵 :)
}
Thread.sleep(1000);
// 鐪嬬湅鑳戒笉鑳藉埌杈捐繖閲岋紵 :)
}
}
>>
璁頒笉寰楀湪鍝噷鐪嬪埌鐨勪唬鐮侊紝鍙互澶勭悊鍒扮嚎紼嬩腑鎶涘嚭鐨凴untimeException錛?
public class ApplicationLoader extends ThreadGroup
{
private ApplicationLoader()
{
super("ApplicationLoader");
}
public static void main(String[] args)
{
Runnable appStarter = new Runnable()
{
public void run()
{
//invoke your application (i.e.MySystem.main(args)
throw new NullPointerException(); //example, throw a runtime exception
}
};
new Thread(new ApplicationLoader(), appStarter).start();
}
//We overload this method from our parent
//ThreadGroup , which will make sure that it
//gets called when it needs to be. This is
//where the magic occurs.
public void uncaughtException(Thread thread, Throwable exception)
{
//Handle the error/exception.
//Typical operations might be displaying a
//useful dialog, writing to an event log, etc.
exception.printStackTrace();//example, print stack trace
}
}
鍛靛懙錛寀ncaughtException濂藉儚鏄敮涓鑳藉澶勭悊綰跨▼鎶涘嚭鐨剈ncaught寮傚父鐨勫叆鍙c傜湅鏉ヨ繕鏄湁緇嗗績浜哄晩銆傜‘瀹炲姝わ紝閫氳繃ThreadGroup鐨剈ncaughtException鏂規硶榪樻槸鏈夊鐞嗙殑鏈轟細銆傚綋綰跨▼鎶涘嚭uncaughtException鐨勬椂鍊欙紝JVM浼氳皟鐢═hreadGroup鐨勬鏂規硶銆傞粯璁ょ殑澶勭悊濡備笅錛?
<<
public void uncaughtException(Thread t, Throwable e) {
if (parent != null) {
parent.uncaughtException(t, e);
} else if (!(e instanceof ThreadDeath)) {
e.printStackTrace(System.err);
}
}
>>
姣忎釜Thread閮戒細鏈変竴涓猅hreadGroup瀵硅薄錛屽彲浠ラ氳繃Thread.getThreadGroup()鏂規硶寰楀埌錛屾彁渚涗簡涓婅堪榛樿鐨剈ncaught寮傚父澶勭悊鏂規硶銆?
涓婇潰娌℃湁鎻愯繖鐐癸紝鍥犱負淇鴻涓哄湪姝e父鐨勬儏鍐典笅錛岃繖涓柟娉曠殑澶勭悊鎯呭喌灝卞凡緇忚凍澶熶簡銆傝繕鏄偅涓嚎紼嬭璁$殑鐞嗗康錛?#8220;綰跨▼鐨勯棶棰樺簲璇ョ嚎紼嬭嚜宸辨湰韜潵瑙e喅錛岃屼笉瑕佸鎵樺埌澶栭儴銆?#8221;閫氬父鎯呭喌涓嬶紝澶栭儴涓嶉渶瑕佸鐞嗙嚎紼嬬殑寮傚父銆傚綋鐒朵篃鏈変緥澶栥?)
Java 鎻愪緵浜嗕袱縐岴xception 鐨勬ā寮忥紝涓縐嶆槸鎵ц鐨勬椂鍊欐墍浜х敓鐨凟xception (Runtime Exception)錛屽彟澶栦竴縐嶅垯鏄彈鎺у埗鐨凟xception (Checked Exception)銆?/span>
鎵鏈夌殑Checked Exception 鍧囦粠java.lang.Exception 緇ф壙鑰屾潵錛岃孯untime Exception 鍒欑戶鎵縥ava.lang.RuntimeException 鎴杍ava.lang.Error (瀹為檯涓妀ava.lang.RuntimeException 鐨勪笂涓灞備篃鏄痡ava.lang.Exception錛岃繖璇存槑浣滀負exception涓よ呭茍娌℃湁鏈川鐨勫尯鍒紝鍙槸java璇█鏈韓浠庡姛鑳借冭檻鏈夋墍鍖哄垎錛岃繖鎵嶅鑷翠笅闈㈡彁鍒扮殑涓嶅悓鐐?銆?/span>
涓涓嚱鏁板鏋滀細鎶涘嚭Checked Exception 錛岋紙榪欓噷鍖呭惈涓ょ鎯呭喌錛屼竴涓槸鍑芥暟鏈韓鎶涘嚭錛屽彟澶栦竴縐嶆槸瀹冭皟鐢ㄧ殑鍑芥暟浼氭姏鍑篊hecked Exception 浣嗘槸瀹冨茍娌℃湁鍘籧atch榪欎釜exception錛夛紝閭e湪澹版槑姝ゅ嚱鏁扮殑鏃跺欏繀欏繪爣鏄巘hrows XXXException()銆傝孯untime Exception涓嶉渶瑕佸姝ゅ0鏄庛?/span>
閫昏緫涓婄湅錛孯untime Exception 涓嶤hecked Exception 浣跨敤鐩殑涓嶄竴鏍楓備竴鑸岃█錛孋hecked Exception 琛ㄧず榪欎釜Exception 蹇呴』瑕佽澶勭悊錛屼篃灝辨槸璇寸▼搴忚璁¤呭簲璇ュ凡緇忕煡閬撳彲鑳戒細鏀跺埌鏌愪釜Exception(鍥犱負瑕乼ry catch浣? 錛屾墍浠ョ▼搴忚璁¤呭簲璇ヨ兘涔熷繀欏伙紙鎴栬呮爣鏄巘hrows XXXException()緇х畫鎶涘嚭鍘伙紝鎴栬卼ry catch澶勭悊錛屼笉鐒舵槸緙栬瘧涓嶈繃鐨勶級閽堝榪欎簺涓嶅悓鐨凜hecked Exception 鍋氬嚭涓嶅悓鐨勫鐞嗐傝孯untime Exception 閫氬父浼氭殫紺虹潃紼嬪簭涓婄殑閿欒錛岃繖縐嶉敊璇細瀵艱嚧紼嬪簭璁捐鑰呮棤娉曞鐞嗭紝鑰岄犳垚紼嬪簭鏃犳硶緇х畫鎵ц涓嬪幓錛堝彲浠ry catch澶勭悊鑰岄伩鍏嶇▼搴忔寕鎺夛紝浣嗘槸榪欏父甯鎬細鎺╃洊闂鎵鍦級銆?/span>
checked exception鐢變簬蹇呴』琚鐞嗭紝浼氱粰紼嬪簭鍛樺甫鏉ラ澶栫殑楹葷儲錛岃瘯鎯充竴涓嚱鏁癮錛屽畠浼氳皟鐢ㄥ埌b1錛宐2...錛宐9涓鍏?涓嚱鏁幫紝榪欎簺鍑芥暟姣忎釜閮戒細鎶涘嚭checked exception錛岃宎鍑芥暟閲岄潰鍙堟病鏈夊姙娉曞鐞嗚繖浜沞xception錛岄偅鍦ㄥ0鏄巃鍑芥暟鐨勬椂鍊欏氨蹇呴』榪炲啓9涓猼hrow xxxException錛屽绱殑錛侊紒鐒惰岃繖浠呬粎鏄棶棰樼殑涓涓柟闈紝鎵浠ヤ笅闈㈣繖綃囨枃绔犺瘯鍥捐鏈嶆垜浠敖閲忎嬌鐢╮untime exception鏇夸唬checked exception(鍓嶉潰鎻愬埌鍙互try catch澶勭悊runtime exception錛岃岄伩鍏嶇▼搴忔寕鎺夛紝榪欎篃鏄繖鏍峰仛鐨勪竴涓墠鎻?銆?/span>
榪欑瘒鏂囩珷鎸囧嚭浜咼ava涓璫hecked Exception鐨勪竴浜涚己鐐癸紝鎻愬嚭搴旇鍦ㄧ▼搴忚璁′腑閬垮厤浣跨敤checked Exception,瀵逛簬闇瑕佸鐞哻hecked Exception鐨勪唬鐮侊紝鍙互浣跨敤ExceptionAdapter榪欎釜綾誨checked Exception榪涜鍖呰銆傝繖綃囨枃绔犵殑姒傚康鍜孍xceptionAdapter榪欎釜綾誨潎婧愯嚜Bruce Eckel鐨凞oes Java need Checked Exception銆?br />
Java鐨?font face="Arial">Exception鍒嗕負涓ょ被錛屼竴綾繪槸RuntimeException鍙婂叾瀛愮被錛屽彟澶栦竴綾誨氨鏄?font face="Arial">checked Exception銆?font face="Arial">Java瑕佹眰鍑芥暟瀵規病鏈夎catch澶勭悊鎺夌殑checked Exception錛岄渶瑕佸皢鍏跺啓鍦ㄥ嚱鏁扮殑澹版槑閮ㄥ垎銆傜劧鑰岋紝榪欎竴瑕佹眰甯稿父緇欑▼搴忓憳甯︽潵涓浜涗笉蹇呰鐨勮礋鎷呫?/font>
涓轟簡閬垮厤鍦ㄥ嚱鏁板0鏄庝腑鍐?font face="Arial">throws閮ㄥ垎錛屽湪Java欏圭洰閲岄潰甯稿父鍙互鐪嬪埌浠ヤ笅浠g爜鐢ㄦ潵‘鍚炴帀’Exception錛?br />
榪欐樉鐒朵笉鏄竴涓ソ鐨勫鐞?font face="Arial">Exception鍔炴硶錛屼簨瀹炰笂錛?font face="Arial">catch騫跺鐞嗕竴涓?font face="Arial">Exception鎰忓懗鐫璁╃▼搴忎粠鍙戠敓鐨勯敊璇?font face="Arial">(Exception)涓仮澶嶈繃鏉ャ備粠榪欑鎰忎箟涓婅錛屽凡涓婄殑浠g爜鍙彲鑳藉湪涓浜涘緢綆鍗曠殑鎯呭喌涓嬪伐浣滆屼笉甯︽潵闂銆?/font>
瀵逛簬寰堝Exception錛屽線寰娌℃湁鍘誨鐞嗗畠騫惰紼嬪簭浠庨敊璇腑鎭㈠鍑烘潵鐨勫姙娉曪紝榪欐椂鍞竴鑳藉仛鐨勪簨鎯呭彲鑳藉氨鏄湪鐣岄潰涓婃樉紺轟竴浜涙彁紺轟俊鎭粰鐢ㄦ埛銆傝繖縐嶆儏鍐典笅璁╃▼搴忔姏鍑洪亣鍒扮殑Exception鏄洿涓哄悎鐞嗙殑鍋氭硶銆傜劧鑰岋紝榪欐牱鍋氫細浣垮緱涓浜涘嚱鏁扮殑澹版槑鎬ュ墽鑶ㄨ儉銆備竴涓嚱鏁板彲鑳介渶瑕佸0鏄庝細鎶涘嚭鐨?font face="Arial">7銆?font face="Arial">8涓?font face="Arial">checked Exception錛岃屼笖姣忎釜璋冪敤瀹冪殑鍑芥暟涔熼渶瑕佸悓鏍風殑澹版槑銆?/font>
姣旇繖鏇寸碂緋曠殑鏄紝榪欐湁鍙兘鐮村潖綾昏璁$殑open-close鍘熷垯銆傜畝鍗曟潵璇達紝open-close鍘熷垯鏄寚褰撴墿灞曚竴涓ā鍧楃殑鏃跺欙紝鍙互涓嶅獎鍝嶅叾鐜版湁鐨?font face="Arial">client銆?font face="Arial">open-close鍘熷垯鏄氳繃緇ф壙鏉ュ疄鐜扮殑錛屽綋緇ф壙涓涓被鐨勬椂鍊欙紝鎴戜滑鏃㈡墿灞曚簡榪欎釜綾伙紝涔熶笉浼氬獎鍝嶅師鏈夌殑client錛堝洜涓哄榪欎釜綾繪病鏈夋敼鍔級銆?/font>
鐜板湪鑰冭檻涓嬮潰榪欑鎯呭喌錛屾湁涓涓埗綾?font face="Arial">Base錛?/font>
鐜板湪闇瑕佺戶鎵?font face="Arial">Base榪欎釜綾誨茍閲嶈澆foo榪欎釜鏂規硶錛屽湪鏂扮殑瀹炵幇涓紝foo鍙兘鎶涘嚭ExceptionB錛?br />
鐒惰岋紝榪欐牱鍐欏湪Java閲岄潰鏄笉鍚堟硶鐨勶紝灝界Java涓嶄細鎶涘嚭鐨?font face="Arial">Exception鐪嬩綔鍑芥暟鐗瑰緛鐨勪竴閮ㄥ垎錛屼絾瀛愮被澹版槑鎶涘嚭鐨?font face="Arial">Exception蹇呴』鏄埗綾葷殑瀛愰泦銆?br /> 鍙互鍦?font face="Arial">Base綾葷殑foo鏂規硶涓姞鍏ユ姏鍑?font face="Arial">ExceptionB鐨勫0鏄庯紝鐒惰岋紝榪欐牱灝辯牬鍧忎簡open-close鍘熷垯銆傝屼笖錛屾湁鏃舵垜浠病鏈夊姙娉曞幓淇敼鐖剁被錛屾瘮濡傚綋閲嶈澆涓涓?font face="Arial">Jdk閲岀殑綾葷殑鏃跺欍?/font>
鍙︿竴涓彲鑳界殑鍋氭硶鏄湪Extend鐨?font face="Arial">foo鏂規硶涓?font face="Arial">catch浣?font face="Arial">ExceptionB錛岀劧鍚庢瀯閫犱竴涓?font face="Arial">ExceptionA騫舵姏鍑恒傝繖鏄釜鍙鐨勫姙娉曚絾涔熷彧鏄竴涓潈瀹滀箣璁°?/font>
濡傛灉浣跨敤RuntimeException錛岃繖浜涢棶棰橀兘涓嶄細瀛樺湪銆傝繖璇存槑checked Exception騫朵笉鏄竴涓緢瀹炵敤鐨勬蹇碉紝涔熸剰鍛崇潃鍦ㄧ▼搴忚璁$殑鏃跺欙紝鎴戜滑搴旇璁╄嚜宸辯殑Exception綾葷戶鎵?font face="Arial">RuntimeException鑰屼笉鏄?font face="Arial">Exception銆傦紙榪欏拰JDK鐨勫緩璁濂界浉鍙嶏紝浣嗗疄璺佃瘉鏄庤繖鏍峰仛浠g爜鐨勮川閲忔洿濂姐傦級
瀵逛簬閭d簺闇瑕佸鐞?font face="Arial">checked Exception鐨勪唬鐮侊紝鍙互鍒╃敤涓涓?font face="Arial">ExceptionAdapter鐨勭被鎶?font face="Arial">checked Exception鍖呰鎴愪竴涓?font face="Arial">RuntimeException鎶涘嚭銆?font face="Arial">ExceptionAdapter鏉ヨ嚜Bruce Eckel鐨?font face="Arial">Does Java need Checked Exception榪欑瘒鏂囩珷錛?br />
DBUtil鏄竴涓伐鍏風被鏉ュ叧闂瑿onnection.鏈夊繀瑕佺殑璇寸殑浣跨敤鐨刦inally鐨勯噸瑕佹ф槸涓嶇紼嬪簭鏄惁紕板埌寮傚父錛屽畠閮戒細琚墽琛屻傚湪涓婅竟鐨勪緥瀛愪腑錛宖inally涓叧闂繛鎺ワ紝濡傛灉鍦ㄥ叧闂繛鎺ョ殑鏃跺欏嚭鐜伴敊璇氨鎶涘嚭RuntimeException.
2錛?涓嶈浣跨敤寮傚父鏉ユ帶鍒舵祦紼嬶紙Never use exceptions for flow control錛?br />
涓嬭竟浠g爜涓紝MaximumCountReachedException琚敤浜庢帶鍒舵祦紼嬶細
涓婅竟鐨剈seExceptionsForFlowControl()鐢ㄤ竴涓棤闄愬驚鐜潵澧炲姞count鐩村埌鎶涘嚭寮傚父錛岃繖縐嶅仛娉曞茍娌℃湁璇磋浠g爜涓嶆槗璇伙紝浣嗘槸瀹冩槸紼嬪簭鎵ц鏁堢巼闄嶄綆銆?br />
璁頒綇錛屽彧鍦ㄨ浼氭姏鍑哄紓甯哥殑鍦版柟榪涜寮傚父澶勭悊銆?br />
3錛?涓嶈蹇界暐寮傚父
褰撴湁寮傚父琚姏鍑虹殑鏃跺欙紝濡傛灉浣犱笉鎯蟲仮澶嶅畠錛岄偅涔堜綘瑕佹涓嶇姽璞殑灝嗗叾杞崲涓簎nchecked exception錛岃屼笉鏄敤涓涓┖鐨刢atch鍧楁垨鑰呬粈涔堜篃涓嶅仛鏉ュ拷鐣ュ畠錛屼互鑷充簬浠庤〃闈㈡潵鐪嬭薄鏄粈涔堜篃娌℃湁鍙戠敓涓鏍楓?br />
4錛?涓嶈鎹曡幏欏跺眰鐨凟xception
unchecked exception閮芥槸RuntimeException鐨勫瓙綾伙紝RuntimeException鍙堢戶鎵縀xception,鍥犳錛屽鏋滃崟綰殑鎹曡幏Exception,閭d箞浣犲悓鏍蜂篃鎹曡幏浜哛untimeException,濡備笅浠g爜錛?br />
try{
..
}catch(Exception ex){
}
涓鏃︿綘鍐欏嚭浜嗕笂杈圭殑浠g爜錛堟敞鎰廲atch鍧楁槸絀虹殑錛夛紝瀹冨皢蹇界暐鎵鏈夌殑寮傚父錛屽寘鎷瑄nchecked exception.
5錛?Log exceptions just once
Logging the same exception stack trace more than once can confuse the programmer examining the stack trace about the original source of exception. So just log it once.
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://imarine.blog.163.com/blog/static/5138018320071119110889/錛堟湰浣撴煡璇級
http://bbs.w3china.org/dispbbs.asp?boardID=2&ID=74918/ (鏈綋鏌ヨ錛?br />
-------------------------------------------------------
rdfs:subClassOf 鎻忚堪
<owl:Class rdf:ID="Wine">
<rdfs:subClassOf rdf:resource="&food;PotableLiquid"/>
<rdfs:label xml:lang="en">wine</rdfs:label>
<rdfs:label xml:lang="fr">vin</rdfs:label>
</owl:Class>
Wine PotableLiquid
--------------------------------------------------------
ObjectProperty 鎻忚堪 wine hasWinDescriptor WineDescriptor
<owl:ObjectProperty rdf:ID="hasWineDescriptor">
<rdfs:domain rdf:resource="#Wine" />
<rdfs:range rdf:resource="#WineDescriptor" />
</owl:ObjectProperty>
-------------------------------------------------------
DatatypeProperty 鎻忚堪 VintageYear is 1998
<owl:DatatypeProperty rdf:ID="yearValue">
<rdfs:domain rdf:resource="#VintageYear" />
<rdfs:range rdf:resource="&xsd;positiveInteger" />
</owl:DatatypeProperty>
<VintageYear rdf:ID="Year1998">
<yearValue rdf:datatype="&xsd;positiveInteger">1998</yearValue>
</VintageYear>
<owl:ObjectProperty rdf:ID="hasVintageYear">
<rdf:type rdf:resource="&owl;FunctionalProperty" />
<rdfs:domain rdf:resource="#Vintage" />
<rdfs:range rdf:resource="#VintageYear" />
</owl:ObjectProperty>
Vintage has VintageYear that is 1998 ------ 钁¤悇閰掔殑騫翠喚鏄?998 鎴?1998鐨勮憽钀勯厭
--------------------------------------------------------
涓綋(individual) 鎻忚堪
<owl:Class rdf:ID="WineGrape">
<rdfs:subClassOf rdf:resource="&food;Grape" />
</owl:Class>
<WineGrape rdf:ID="CabernetSauvignonGrape" />
CabernetSauvignonGrape is WineGrape ---- 璧ら湠鐝犺憽钀勬爲
----------------------灞炴х壒鎬?-----------------------
TransitiveProperty 鎻忚堪
SymmetricProperty 鎻忚堪
<owl:Class rdf:ID="Region" />
<owl:ObjectProperty rdf:ID="locatedIn">
<rdf:type rdf:resource="&owl;TransitiveProperty" />
<rdfs:domain rdf:resource="
<rdfs:range rdf:resource="#Region" />
</owl:ObjectProperty>
<owl:ObjectProperty rdf:ID="adjacentRegion">
<rdf:type rdf:resource="&owl;SymmetricProperty" />
<rdfs:domain rdf:resource="#Region" />
<rdfs:range rdf:resource="#Region" />
</owl:ObjectProperty>
--------------------------------------------
FunctionalProperty 鎻忚堪 涓涓粰瀹氱殑 Vintage涓綋鍙兘浣跨敤hasVintageYear灞炴т笌鍗曠嫭涓涓勾浠界浉鍏寵仈
<owl:Class rdf:ID="VintageYear" />
<owl:ObjectProperty rdf:ID="hasVintageYear">
<rdf:type rdf:resource="&owl;FunctionalProperty" />
<rdfs:domain rdf:resource="#Vintage" />
<rdfs:range rdf:resource="#VintageYear" />
</owl:ObjectProperty>
---------------------------------------------
inverseOf 鎻忚堪 鍚勭钁¤悇閰掗兘鏈夊埗閫犲晢
<owl:ObjectProperty rdf:ID="hasMaker">
<rdf:type rdf:resource="&owl;FunctionalProperty" />
</owl:ObjectProperty>
<owl:ObjectProperty rdf:ID="producesWine">
<owl:inverseOf rdf:resource="#hasMaker" />
</owl:ObjectProperty>
---------------------------------------------
InverseFunctionalProperty
<owl:ObjectProperty rdf:ID="hasMaker" />
<owl:ObjectProperty rdf:ID="producesWine">
<rdf:type rdf:resource="&owl;InverseFunctionalProperty" />
<owl:inverseOf rdf:resource="#hasMaker" />
</owl:ObjectProperty>
owl:InverseFunctional鎰忓懗鐫灞炴х殑鍊煎煙涓殑鍏冪礌涓哄畾涔夊煙涓殑姣忎釜鍏冪礌鎻愪緵浜嗕竴涓敮涓鐨勬爣璇?/p>
---灞炴ч檺鍒?-----
-------------------------
allValuesFrom 鎻忚堪 Wine鐨勫埗閫犲晢蹇呴』鏄疻inery銆?br />
owl:someValuesFrom鏇挎崲owl:allValuesFrom錛岄偅灝辨剰鍛崇潃鑷沖皯鏈変竴涓猈ine綾誨疄渚嬬殑hasMaker灞炴ф槸鎸囧悜涓涓猈inery綾葷殑涓綋鐨勩?/p>
<owl:Class rdf:ID="Wine">
<rdfs:subClassOf rdf:resource="&food;PotableLiquid" />
...
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#hasMaker" />
<owl:allValuesFrom rdf:resource="#Winery" />
</owl:Restriction>
</rdfs:subClassOf>
...
</owl:Class>
-------------------------------------------------------
owl:cardinality 鎻忚堪 鍏佽瀵逛竴涓叧緋諱腑鐨勫厓绱犳暟鐩綔鍑虹簿紜殑闄愬埗
<owl:Class rdf:ID="Vintage">
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#hasVintageYear"/>
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>
姣忕摱钁¤悇閰掑彧鏈変竴涓勾搴?/p>
-------------------------------------------------------
hasValue 鎻忚堪 涓涓釜浣撳彧瑕佽嚦灝戞湁“涓涓?#8221;灞炴у肩瓑浜巋asValue鐨勮祫婧愶紝榪欎竴涓綋灝辨槸璇ョ被鐨勬垚鍛樸?/p>
<owl:Class rdf:ID="Burgundy">
...
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#hasSugar" />
<owl:hasValue rdf:resource="#Dry" />
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>
鎵鏈夌殑Burgundy閰掗兘鏄共(dry)鐨勯厭銆備篃鍗籌紝瀹冧滑鐨刪asSugar灞炴у繀欏昏嚦灝戞湁涓涓槸鍊肩瓑浜嶥ry錛堝共鐨勶級
------------------------------------------------------
鏈綋鏄犲皠
綾誨拰灞炴т箣闂寸殑絳変環鍏崇郴錛嶏紞equivalentClass, equivalentProperty
<owl:Class rdf:ID="TexasThings">
<owl:equivalentClass>
<owl:Restriction>
<owl:onProperty rdf:resource="#locatedIn" />
<owl:someValuesFrom rdf:resource="#TexasRegion" />
</owl:Restriction>
</owl:equivalentClass>
</owl:Class>
TexasThings鎸囩殑鏄偅浜涙伆濂戒綅浜嶵exasRegion鐨勪簨鐗┿備嬌鐢╫wl:equivalentClass 鍜屼嬌鐢╮dfs:subClassOf 鐨勪笉鍚屽氨鍍忓繀瑕佹潯浠跺拰鍏呰鏉′歡鐨勪笉鍚屼竴鏍楓傚鏋滄槸浣跨敤subClassOf鐨勮瘽錛屼綅浜嶵exasRegion鐨勪簨鐗╀笉涓瀹氭槸TexasThings銆備絾鏄紝濡傛灉浣跨敤owl:equivalentClass錛屼綅浜嶵exasRegion鐨勪簨鐗╀竴瀹氬睘浜嶵exasThings綾匯?/p>
------------------------------------------------------
涓綋闂寸殑鍚屼竴鎬?錛峴ameAs
<Wine rdf:ID="MikesFavoriteWine>
<owl:sameAs rdf:resource="#StGenevieveTexasWhite" />
</Wine>
淇グ錛堟垨寮曠敤錛変袱涓被鐢╯ameAs榪樻槸鐢╡quivalentClass鏁堟灉鏄笉鍚岀殑銆傜敤sameAs鐨勬椂鍊欙紝鎶婁竴涓被瑙i噴涓轟竴涓釜浣擄紝灝卞儚鍦∣WL Full涓竴鏍鳳紝榪欐湁鍒╀簬瀵規湰浣撹繘琛屽垎綾匯?/p>
-----------------------------------------------------
涓嶅悓鐨勪釜浣?br />
------------------------------------------------------
differentFrom
<WineSugar rdf:ID="Dry" />
<WineSugar rdf:ID="Sweet">
<owl:differentFrom rdf:resource="#Dry"/>
</WineSugar>
<WineSugar rdf:ID="OffDry">
<owl:differentFrom rdf:resource="#Dry"/>
<owl:differentFrom rdf:resource="#Sweet"/>
</WineSugar>
---------------------------------------------------
AllDifferent
<owl:AllDifferent>
<owl:distinctMembers rdf:parseType="Collection">
<vin:WineColor rdf:about="#Red" />
<vin:WineColor rdf:about="#White" />
<vin:WineColor rdf:about="#Rose" />
</owl:distinctMembers>
</owl:AllDifferent>
owl:distinctMembers灞炴у0鏄庡彧鑳藉拰owl:AllDifferent灞炴у0鏄庝竴璧風粨鍚堜嬌鐢ㄣ?/p>
-----------------------------------------------------
intersectionOf
<owl:Class rdf:ID="WhiteWine">
<owl:intersectionOf rdf:parseType="Collection">
<owl:Class rdf:about="#Wine" />
<owl:Restriction>
<owl:onProperty rdf:resource="#hasColor" />
<owl:hasValue rdf:resource="#White" />
</owl:Restriction>
</owl:intersectionOf>
</owl:Class>
WhiteWine鎭板ソ鏄被Wine涓庢墍鏈夐鑹叉槸鐧借壊鐨勪簨鐗╃殑闆嗗悎鐨勪氦闆?/p>
-----------------------------------------------------
unionOf
<owl:Class rdf:ID="Fruit">
<owl:unionOf rdf:parseType="Collection">
<owl:Class rdf:about="#SweetFruit" />
<owl:Class rdf:about="#NonSweetFruit" />
</owl:unionOf>
</owl:Class>
------------------------------------------------------
complementOf 浠庢煇涓鍩?domain of discourse)閫夊嚭涓嶅睘浜庢煇涓被鐨勬墍鏈変釜浣?/p>
<owl:Class rdf:ID="NonFrenchWine">
<owl:intersectionOf rdf:parseType="Collection">
<owl:Class rdf:about="#Wine"/>
<owl:Class>
<owl:complementOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#locatedIn" />
<owl:hasValue rdf:resource="#FrenchRegion" />
</owl:Restriction>
</owl:complementOf>
</owl:Class>
</owl:intersectionOf>
</owl:Class>
-----------------------------------------------------------
oneOf 鏋氫婦
<owl:Class rdf:ID="WineColor">
<rdfs:subClassOf rdf:resource="#WineDescriptor"/>
<owl:oneOf rdf:parseType="Collection">
<owl:Thing rdf:about="#White"/>
<owl:Thing rdf:about="#Rose"/>
<owl:Thing rdf:about="#Red"/>
</owl:oneOf>
</owl:Class>
鏈夋晥鐨勪釜浣撳0鏄?/p>
-----------------------------------------------------------
disjointWith 涓嶇浉浜ょ被 淇濊瘉浜嗗睘浜庢煇涓涓被鐨勪釜浣撲笉鑳藉悓鏃跺張鏄彟涓涓寚瀹氱被鐨勫疄渚?/p>
<owl:Class rdf:ID="Pasta">
<rdfs:subClassOf rdf:resource="#EdibleThing"/>
<owl:disjointWith rdf:resource="#Meat"/>
<owl:disjointWith rdf:resource="#Fowl"/>
<owl:disjointWith rdf:resource="#Seafood"/>
<owl:disjointWith rdf:resource="#Dessert"/>
<owl:disjointWith rdf:resource="#Fruit"/>
</owl:Class>
Pasta涓庡叾瀹冩墍鏈夌被鏄笉鐩鎬氦鐨勩備緥濡傦紝瀹冨茍娌℃湁淇濊瘉Meat鍜孎ruit鏄笉鐩鎬氦鐨?/p>
Person.java
class Person
{
public String name = "not know";//4
public int age = -1 ;//5
public Person()
{
}
public Person(String name , int age)//3
{
this.name = name ;//6
this.age = age;//7
}
public void showInfo()
{
System.out.println("Name is :"+name+" Age is :"+age);
}
}
class Student extends Person
{
public String school = "not konwn";//8
public Student()
{
super();
}
public Student (String name ,int age, String school) //1
{
super(name,age); //2
this.school = school;//9
}
public void showInfo()
{
super.showInfo();
System.out.println("School is :"+school);
}
}
AllTest.java
class AllTest
{
public static void main(String[]args)
{
Student stA = new Student("wanghao",20,"qinghuadaxue"); //0
}
}
鍏惰鍙ョ殑鎵ц欏哄簭鏄庢牱鐨勫憿錛?/span>
java涓紝鍦ㄤ嬌鐢?/span>new鎿嶄綔絎﹀垱寤轟竴涓被鐨勫疄渚嬪璞$殑鏃跺欙紝寮濮嬪垎閰嶇┖闂村茍灝嗘垚鍛樺彉閲忓垵濮嬪寲涓?/span>榛樿鐨?/span>鏁板?/span>錛屾敞鎰忚繖閲屽茍涓嶆槸鎸囧皢鍙橀噺鍒濆鍖栦負鍦ㄥ彉閲忓畾涔夊鐨勫垵濮嬪鹼紝鑰?strong>鏄粰鏁村艦璧嬪?/span>0錛岀粰瀛楃涓茶祴鍊?/span>null 榪欎竴鐐逛簬C++涓嶅悓錛岋紙student.name = null , student.age = 0 錛?/span>
鐒跺悗鍦ㄨ繘鍏ョ被鐨勬瀯閫犲嚱鏁般?/span>
鍦ㄦ瀯閫犲嚱鏁伴噷闈紝棣栧厛瑕佹鏌ユ槸鍚︽湁this鎴栬?/span>super璋冪敤錛?/span>this璋冪敤鏄畬鎴愭湰綾繪湰韜殑鏋勯犲嚱鏁頒箣闂寸殑璋冪敤錛?/span>super璋冪敤鏄畬鎴愬鐖剁被鐨勮皟鐢ㄣ?strong>浜岃呭彧鑳藉嚭鐜頒竴涓紝騫朵笖鍙兘浣滀負鏋勯犲嚱鏁扮殑絎竴鍙ュ嚭鐜般?/span>鍦ㄨ皟鐢?/span>this鍜?/span>super鐨勬椂鍊欏疄鐜扮▼搴忕殑璺寵漿錛岃漿鑰屾墽琛岃璋冪敤鐨?/span>this鏋勯犲嚱鏁版垨鑰?/span>super鏋勯犲嚱鏁般?/span>
鍦?/span>this鍜?/span>super鎵ц瀹屾瘯錛?strong>紼嬪簭杞屾墽琛屽湪綾誨畾涔夌殑鏃跺欒繘琛岀殑鍙橀噺鍒濆鍖栧伐浣?/span>銆?/span>
榪欎釜鎵ц瀹屾瘯錛屾墠鏄瀯閫犲嚱鏁頒腑鍓╀笅鐨勪唬鐮佺殑鎵ц銆?/span>
鎵ц欏哄簭宸茬粡鐢ㄧ豢鑹叉爣鍑恒?/span>
Order of initialization
Within a class, the order of initialization is determined by the order that the variables are defined within the class. The variable definitions may be scattered throughout and in between method definitions, but the variables are initialized before any methods can be called鈥攅ven the constructor. For example: Feedback
//: c04:OrderOfInitialization.java
// Demonstrates initialization order.
import com.bruceeckel.simpletest.*;
// When the constructor is called to create a
// Tag object, you'll see a message:
class Tag {
Tag(int marker) {
System.out.println("Tag(" + marker + ")");
}
}
class Card {
Tag t1 = new Tag(1); // Before constructor
Card() {
// Indicate we're in the constructor:
System.out.println("Card()");
t3 = new Tag(33); // Reinitialize t3
}
Tag t2 = new Tag(2); // After constructor
void f() {
System.out.println("f()");
}
Tag t3 = new Tag(3); // At end
}
public class OrderOfInitialization {
static Test monitor = new Test();
public static void main(String[] args) {
Card t = new Card();
t.f(); // Shows that construction is done
monitor.expect(new String[] {
"Tag(1)",
"Tag(2)",
"Tag(3)",
"Card()",
"Tag(33)",
"f()"
});
}
} ///:~
//: c04:StaticInitialization.java
// Specifying initial values in a class definition.
class Bowl {
Bowl(int marker) {
System.out.println("Bowl(" + marker + ")");
}
void f(int marker) {
System.out.println("f(" + marker + ")");
}
}
class Table {
static Bowl b1 = new Bowl(1);
Table() {
System.out.println("Table()");
b2.f(1);
}
void f2(int marker) {
System.out.println("f2(" + marker + ")");
}
static Bowl b2 = new Bowl(2);
}
class Cupboard {
Bowl b3 = new Bowl(3);
static Bowl b4 = new Bowl(4);
Cupboard() {
System.out.println("Cupboard()");
b4.f(2);
}
void f3(int marker) {
System.out.println("f3(" + marker + ")");
}
static Bowl b5 = new Bowl(5);
}
public class StaticInitialization {
static Test monitor = new Test();
public static void main(String[] args) {
System.out.println("Creating new Cupboard() in main");
new Cupboard();
System.out.println("Creating new Cupboard() in main");
new Cupboard();
t2.f2(1);
t3.f3(1);
monitor.expect(new String[] {
"Bowl(1)",
"Bowl(2)",
"Table()",
"f(1)",
"Bowl(4)",
"Bowl(5)",
"Bowl(3)",
"Cupboard()",
"f(2)",
"Creating new Cupboard() in main",
"Bowl(3)",
"Cupboard()",
"f(2)",
"Creating new Cupboard() in main",
"Bowl(3)",
"Cupboard()",
"f(2)",
"f2(1)",
"f3(1)"
});
}
static Table t2 = new Table();
static Cupboard t3 = new Cupboard();
} ///:~
緇ф壙鎯呭喌涓嬬殑鍒濆鍖?br />
浜嗚В涓涓嬪寘鎷戶鎵垮湪鍐呯殑鍒濆鍖栫殑榪囩▼灝嗘槸闈炲父鏈夌泭鐨勶紝榪欐牱灝辮兘鏈変釜鎬?br />
浣撶殑浜嗚В銆傜湅鐪嬩笅闈㈣繖孌典唬鐮侊細
//: c06:Beetle.java
// The full process of initialization.
class Insect {
protected static Test monitor = new Test();
private int i = 9;
protected int j;
Insect() {
System.out.println("i = " + i + ", j = " + j);
j = 39;
}
private static int x1 = print("static Insect.x1 initialized");
static int print(String s) {
System.out.println(s);
return 47;
}
}
public class Beetle extends Insect {
private int k = print("Beetle.k initialized");
public Beetle() {
System.out.println("k = " + k);
System.out.println("j = " + j);
}
private static int x2 = print("static Beetle.x2 initialized");
public static void main(String[] args) {
System.out.println("Beetle constructor");
Beetle b = new Beetle();
monitor.expect(new String[] {
"static Insect.x1 initialized",
"static Beetle.x2 initialized",
"Beetle constructor",
"i = 9, j = 0",
"Beetle.k initialized",
"k = 47",
"j = 39"
});
}
} ///:~
浣犲鎵劇粡緙栬瘧鐨?/span>Beetle 綾葷殑浠g爜(涔熷氨鏄?/span>Beetle.class 鏂囦歡)銆傚湪瑁呰澆鐨勮繃紼嬩腑錛岃杞藉櫒娉ㄦ剰鍒板畠鏈変竴涓熀綾?/span>(涔熷氨鏄?/span>extends 鎵瑕佽〃紺虹殑鎰忔?/span>)錛屼簬鏄畠鍐嶈杞藉熀綾匯備笉綆′綘鍒涗笉鍒涘緩鍩虹被瀵硅薄錛岃繖涓繃紼嬫諱細鍙戠敓銆?/span>(璇曡瘯鐪嬶紝鎶婂垱寤哄璞$殑閭e彞娉ㄩ噴鎺夛紝鐪嬬湅浼氭湁浠涔堢粨鏋溿?/span>)濡傛灉鍩虹被榪樻湁鍩虹被錛岄偅涔堣繖絎簩涓熀綾諱篃浼氳瑁呰澆錛屼互姝ょ被鎺?span style="color: blue">銆?strong>涓嬩竴姝ワ紝瀹冧細鎵ц“鏍瑰熀綾?/strong>(root bas e class)”(榪欓噷灝辨槸Insect)鐨?/span>static 鍒濆鍖栵紝鐒跺悗鏄笅涓涓淳鐢熺被鐨?/span>static 鍒濆鍖栵紝浠ユ綾繪帹銆傝繖涓『搴忛潪甯擱噸瑕侊紝鍥犱負媧劇敓綾葷殑“闈欐佸垵濮嬪寲(鍗沖墠闈㈣鐨?/span>static 鍒濆鍖?/span>)”鏈夊彲鑳借渚濊禆鍩虹被鎴愬憳鐨勬紜垵濮嬪寲銆?/span>
鐜板湪鎵鏈夊繀瑕佺殑綾婚兘宸茬粡瑁呰澆緇撴潫錛屽彲浠ュ垱寤哄璞′簡銆?/span>棣栧厛錛屽璞¢噷鐨勬墍鏈夌殑primitive 閮戒細琚鎴愬畠浠殑緙虹渷鍊鹼紝鑰?/span>reference 涔熶細琚鎴?/span>null鈥斺旇繖涓繃紼嬫槸涓鐬棿瀹屾垚鐨勶紝瀵硅薄鐨勫唴瀛樹細琚粺涓鍦拌緗垚“涓よ繘鍒剁殑闆?/span>(binary zero)”銆?strong>濡傛灉鏈夊鎴愬憳鍙橀噺璧嬪垵鍊鹼紝鍒欏鎴愬憳鍙橀噺榪涜璧嬪鹼紝鐒跺悗璋冪敤鍩虹被鐨勬瀯閫犲嚱鏁般傝皟鐢ㄦ槸鑷姩鍙戠敓鐨勶紝浣嗘槸浣犲彲浠ヤ嬌鐢?/span>super 鏉ユ寚瀹氳皟鐢ㄥ摢涓瀯閫犲嚱鏁?/span>(涔熷氨Beetle( )鏋勯犲嚱鏁版墍鍋氱殑絎竴浠朵簨)銆傚熀綾葷殑鏋勯犺繃紼嬩互鍙婃瀯閫犻『搴忥紝鍚屾淳鐢熺被鐨勭浉鍚屻傚熀綾繪瀯閫犲嚱鏁拌繍琛屽畬姣曚箣鍚庯紝浼氭寜鐓у悇涓彉閲忕殑瀛楅潰欏哄簭榪涜鍒濆鍖栥傛渶鍚庝細鎵ц鏋勯犲嚱鏁扮殑鍏朵綑閮ㄥ垎銆?/span>
榪斿洖錛?
涓涓瓧絎︿覆錛屽唴瀹逛笌姝ゅ瓧絎︿覆鐩稿悓錛屼絾瀹冧繚璇佹潵鑷瓧絎︿覆姹犱腑銆?
=======================================================================
瀛楃涓插瓧闈㈡睜鎸囩殑鏄父閲忔睜.
瀛楃涓插璞$殑鍒涘緩鏂瑰紡鏈変袱縐?/p>
濡備笅:
String s1 = new String(""); //絎竴縐?/p>
String s2 = ""; //絎簩縐?/p>
絎竴縐嶅緇堜笉浼氬叆姹犵殑.
絎簩縐嶈鐪嬫儏鍐佃屽畾(絳夊彿鍙寵竟濡傛灉鏄父閲忓垯鍏ユ睜,闈炲父閲忓垯涓嶅叆姹?
渚?
String s3 = "a" + "b"; //"a"鏄父閲?"b"鏄父閲?甯擱噺+甯擱噺=甯擱噺,鎵浠ヤ細鍏ユ睜.
String s4 = s1 + "b"; //s1鏄彉閲?"b"鏄父閲?鍙橀噺+甯擱噺!=甯擱噺,鎵浠ヤ笉浼氬叆姹?
銆銆銆銆銆銆銆銆銆//閭e紩鐢╯4鎵鎸囩殑瀵硅薄鍦ㄥ摢閲屽垱寤??????
涓鏃﹀叆姹犵殑璇?灝變細鍏堟煡鎵炬睜涓湁鏃犳瀵硅薄.濡傛灉鏈夋瀵硅薄,鍒欒瀵硅薄寮曠敤鎸囧悜姝ゅ璞?濡傛灉鏃犳瀵硅薄,鍒欏厛鍒涘緩姝ゅ璞?鍐嶈瀵硅薄寮曠敤鎸囧悜姝ゅ璞?
渚?
String s5 = "abc"; //鍏堝湪姹犱腑鏌ユ壘鏈夋棤"abc"瀵硅薄,濡傛灉鏈?鍒欒s5鎸囧悜姝ゅ璞?濡傛灉姹犱腑鏃?abc"瀵硅薄,鍒欏湪姹犱腑鍒涘緩涓涓?abc"瀵硅薄,鐒跺悗璁﹕5鎸囧悜璇ュ璞?琛ュ厖涓涓嬶細
鐪嬩簡瀛楄妭鐮佸悗錛屽彂鐜?br />
String str ="a"+"b";
瀹屽叏絳夊悓浜?br />
String str="ab";
-----------------------------------------------------------------------------------------------------------------------------
Java铏氭嫙鏈烘湁涓涓瓧絎︿覆姹狅紝淇濆瓨鐫鍑犱箮鎵鏈夌殑瀛楃涓插父閲忋傚瓧絎︿覆琛ㄨ揪寮忔繪槸鎸囧悜瀛楃涓叉睜涓殑涓涓璞°?br />
public class Test...{
public static void main(String[] args)...{
String s1=new String("abc");
String s2="abc";//鏀懼叆String姹犻噷
String s3=new String("abc");
System.out.println(s1==s2);//false
System.out.println(s1==s3);//false
System.out.println(s3==s2);//false
System.out.println(s1==s1.intern());//s1.intern()鍒癝tring姹犻噷鎵撅紝鑰宻1鏄湪鍫嗕腑鎵浠ヨ繑鍥瀎alse
System.out.println(s2==s2.intern());//true
System.out.println(s1.intern()==s3.intern());//涓や釜瀛楃涓插悓鏃跺埌String姹犻噷鏌ユ壘錛岃繑鍥瀟rue
//浠ヤ笅涓変釜閮芥斁鍒癝tring姹?br />
String hello="hello";
String hel="hel";
String lo="lo";
System.out.println(hello=="hel"+"lo");//瀛楃涓茬浉鍔犱互鍚庯紝浼氬埌String姹犻噷鎵撅紝鏈変笉浜х敓錛屾墍浠ヨ繑鍥瀟rue
System.out.println(hello=="hello");//鐩存帴鍒癝tring姹犻噷鎵撅紝榪斿洖true
System.out.println(hello=="hel"+lo);//瀛楃涓插姞涓涓紩鐢紝灝嗕駭鐢熶竴涓柊鐨勫璞★紝鎵浠ヨ繑鍥瀎alse
System.out.println(hello==(hel+lo));//綾諱技涓婇潰錛岃繑鍥瀎alse
System.out.println(hello==(hel+lo).intern());//浜х敓鏂扮殑瀵硅薄錛屼絾鏄湁intern()鏂規硶錛屽皢鍒癝tring姹犱腑鎵撅紝榪斿洖true
}
}