java: command not found / 'java' is not recognizedPATH 未包含 %JAVA_HOME%\bin。JAVA_HOME 並追加到 PATH。NoClassDefFoundError: hello (wrong name: Hello)java Hello(類名首字母大寫)。NoClassDefFoundError: Hello.class.class 後綴。java Hello。NoClassDefFoundError 持續出現的根因# 典型環境變數配置
JAVA_HOME=/home/jdk
CLASSPATH=$JAVA_HOME/jre/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/jre/lib:$JAVA_HOME/lib
PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$CLASSPATH 或類聲明 public。java.exe:Windows C:\Windows 或 C:\WinNT 下可能有舊版 java.exe,刪除或調整 PATH 順序確保優先調用 JDK bin 目錄下的。package com.demo;,編譯後 .class 必須置於 com/demo/ 目錄,執行時需在父目錄下用全限定名 java com.demo.Hello。| 異常類 | 觸發場景 |
|---|---|
| ArithmeticException | 算術異常(如除零) |
| NullPointerException | 引用空對象調用方法/屬性 |
| ArrayIndexOutOfBoundsException | 數組下標越界 |
| ArrayStoreException | 數組存儲類型不匹配 |
| FileNotFoundException | 文件不存在 |
| IOException | I/O 操作失敗 |
| NumberFormatException | 字符串轉數值失敗 |
| OutOfMemoryError | 堆內存耗盡 |
| SecurityException | Applet 安全限制違規 |
| StackOverflowError | 棧溢出(遞歸過深) |
| StringIndexOutOfBoundsException | 字符串索引越界 |
Throwable
├─ Error // JVM 級嚴重錯誤,不可恢復
└─ Exception
├─ RuntimeException // 非受檢異常:邏輯錯誤,編譯器不強制捕獲
└─ 其他 Exception // 受檢異常:必須 try-catch 或 throws 聲明
try:包裹可能拋出異常的代碼塊。catch:捕獲並處理特定異常,順序從具體到通用(子類在前,父類在後)。finally:無論是否發生異常均執行,用於資源釋放(關流、鎖、連接)。throw:在方法內主動拋出異常對象。throws:在方法簽名聲明可能拋出的受檢異常。try-catch-finally 返回值陷阱boolean testEx() throws Exception {
boolean ret = true;
try {
ret = testEx1();
} catch (Exception e) {
System.out.println("catch");
ret = false;
throw e; // 重新拋出
} finally {
System.out.println("finally, ret=" + ret);
return ret; // 覆蓋前面的 return/throw!
}
}
結論:finally 中的 return 會覆蓋 try/catch 的返回值與異常,生產代碼嚴禁在 finally 中使用 return。
java.lang.Error 常見成因與對策對策:try-with-resources(JDK 7+)或 finally 確保單次關閉;連接池複用資源;訪問前健康檢查。
NullPointerException) 深度剖析與防禦編程// 1. 直接使用可能為 null 的請求參數
out.println(request.getParameter("username"));
// 2. 對可能為 null 的對象調用 equals/toString
String userName = request.getParameter("username");
if (userName.equals("root")) { ... } // NPE 風險
// 3. Session 失效後直接取值
String userName = session.getAttribute("session.username").toString();
if (userName == null) userName = "";if (userName != null && userName.equals("root"))if (userName == null) { response.sendError(400, "缺少用戶名"); return; }建議:統一採用「守衛條款」風格,提前返回,減少巢狀縮進。
| 錯誤信息 | 核心原因 | 快速定位 |
|---|---|---|
| No bean found under attribute key XXX | ActionForm type 類不存在或 name/attribute 錯誤 | 檢查 struts-config.xml <form-bean> 及 <action> name 屬性 |
| Cannot find bean XXX in any scope | JSP 取值但 Action 未 setAttribute | 對比 JSP tag name / getAttribute 參數與 Action 邏輯 |
| Missing message for key "XXX" | ApplicationResources.properties 缺少 key | 補全資源文件;多模塊注意 struts-config 指定資源文件 |
| No getter method for property XXX | Bean 缺少對應 getter | 檢查 JSP property 拼寫(如 cade → code) |
| Cannot retrieve mapping for action XXX | JSP form action 路徑未在 struts-config 定義 | 補全 <action path="/XXX"> |
| HTTP Status 404 | Forward path 指向的 JSP 不存在 | 核對路徑、模塊前綴、contextRelative 屬性 |
| 空白頁無異常 | Forward 名稱與 struts-config 定義不匹配 | 比對 Action 返回 forward 名稱 |
| Element type "XXX" must be terminated | struts-config.xml 格式錯誤 | XML 校驗工具檢查良構性 |
| Servlet.init() threw exception (NPE at parseModuleConfigFile) | struts-config.xml 文件遺失 | 恢復配置文件(常見於 CVS/SVN 衝突誤刪) |
| Resources not defined for Validator | validation.xml 引用資源未定義 | 檢查 form 名稱、資源 key 是否存在 |
try-with-resources 或標準 finally 關閉模式。