首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 基礎異常處理全景指南:從 HelloWorld 到 Struts 常見錯誤排查

     編輯:Java 相關知識

一、HelloWorld 階段常見錯誤與對策

1. java: command not found / 'java' is not recognized

  • 原因:未安裝 JDK 或 PATH 未包含 %JAVA_HOME%\bin。
  • 對策:安裝 JDK,配置 JAVA_HOME 並追加到 PATH。

2. NoClassDefFoundError: hello (wrong name: Hello)

  • 原因:類名大小寫不匹配(Java 區分大小寫)。
  • 對策:執行 java Hello(類名首字母大寫)。

3. 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

三大核心解決方案

  1. 當前目錄加入 CLASSPATH:export CLASSPATH=.:$CLASSPATH 或類聲明 public。
  2. 系統路徑存在殘留 java.exe:Windows C:\Windows 或 C:\WinNT 下可能有舊版 java.exe,刪除或調整 PATH 順序確保優先調用 JDK bin 目錄下的。
  3. package 聲明與目錄結構不符:若源碼有 package com.demo;,編譯後 .class 必須置於 com/demo/ 目錄,執行時需在父目錄下用全限定名 java com.demo.Hello。

三、Java 核心異常體系速查表

異常類觸發場景
ArithmeticException算術異常(如除零)
NullPointerException引用空對象調用方法/屬性
ArrayIndexOutOfBoundsException數組下標越界
ArrayStoreException數組存儲類型不匹配
FileNotFoundException文件不存在
IOExceptionI/O 操作失敗
NumberFormatException字符串轉數值失敗
OutOfMemoryError堆內存耗盡
SecurityExceptionApplet 安全限制違規
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 常見成因與對策

  • 外部資源(數據庫、Socket、文件句柄)未正確關閉導致洩漏。
  • 重複關閉資源觸發底層異常。
  • 外部資源本身異常(DB 掛掉、網絡分區)。

對策: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();

三種通用防禦模式

  1. 默認值兜底:if (userName == null) userName = "";
  2. 非空守衛:if (userName != null && userName.equals("root"))
  3. 顯式錯誤提示:if (userName == null) { response.sendError(400, "缺少用戶名"); return; }

建議:統一採用「守衛條款」風格,提前返回,減少巢狀縮進。

七、Struts 1.x 經典錯誤代碼速查

錯誤信息核心原因快速定位
No bean found under attribute key XXXActionForm type 類不存在或 name/attribute 錯誤檢查 struts-config.xml <form-bean> 及 <action> name 屬性
Cannot find bean XXX in any scopeJSP 取值但 Action 未 setAttribute對比 JSP tag name / getAttribute 參數與 Action 邏輯
Missing message for key "XXX"ApplicationResources.properties 缺少 key補全資源文件;多模塊注意 struts-config 指定資源文件
No getter method for property XXXBean 缺少對應 getter檢查 JSP property 拼寫(如 cade → code)
Cannot retrieve mapping for action XXXJSP form action 路徑未在 struts-config 定義補全 <action path="/XXX">
HTTP Status 404Forward path 指向的 JSP 不存在核對路徑、模塊前綴、contextRelative 屬性
空白頁無異常Forward 名稱與 struts-config 定義不匹配比對 Action 返回 forward 名稱
Element type "XXX" must be terminatedstruts-config.xml 格式錯誤XML 校驗工具檢查良構性
Servlet.init() threw exception (NPE at parseModuleConfigFile)struts-config.xml 文件遺失恢復配置文件(常見於 CVS/SVN 衝突誤刪)
Resources not defined for Validatorvalidation.xml 引用資源未定義檢查 form 名稱、資源 key 是否存在

總結

  • 異常處理核心:預防 > 捕獲 > 恢復。
  • 受檢異常強制業務邏輯感知錯誤;運行時異常暴露編程缺陷,應通過單元測試消除。
  • 資源管理務必使用 try-with-resources 或標準 finally 關閉模式。
  • 框架級錯誤(Struts 等)多源於配置與代碼不同步,建立「配置即代碼」的審查機制可大幅降低上線故障率。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved