Java 知識點碎雜、工具鏈豐富,初學者極易踩坑。本文記錄從零開始的實戰避坑經驗,聚焦「網上難搜、官方文檔不明說」的邊角知識。
> cd com/example
> java Main.class
錯誤: 找不到或無法加載主類 Main.class
java 後跟的是全限定類名 (包名+類名),而非檔案路徑。# 專案根目錄下
> javac com/example/Main.java
> java com.example.Main # 無 .class 後綴,用點分隔包名
Class 文件內部儲存著包名 (如 package com.example;),JVM 類加載器按包名轉路徑 (com/example/Main.class) 尋找文件。若當前目錄不在 classpath 根,需 java -cp . com.example.Main。
Record patterns、Virtual Threads、String Templates 語法錯誤。IDE 必須同步升級到支援目標 JDK/框架版本的最新穩定版。
Help → Check for Updates,或下載最新 EAP/正式版。Java Development Tools、Maven Integration。Extension Pack for Java、Language Support for Java。將 IDE 支援問題誤判為「類庫不相容」、「JDK Bug」、「語法錯誤」,浪費大量排查時間。
專案引入 A、B 兩個 Starter,間接依賴同一庫 (如 Netty) 不同版本,運行時 NoSuchMethodError、ClassNotFoundException。
mvn dependency:tree -Dverbose 定位衝突路徑。<dependencyManagement> 統一鎖定版本:<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.100.Final</version> <!-- 強制統一 -->
</dependency>
</dependencies>
</dependencyManagement>
<exclusion> 排除傳遞依賴。| 層面 | 設定方式 | 驗證 |
|---|---|---|
| 源文件 | IDE: Settings → File Encodings → UTF-8 / maven.compiler.encoding=UTF-8 | System.out.println(new String("中文".getBytes())); |
| 控制台 | IDE Run Configuration → VM Options: -Dfile.encoding=UTF-8 / Windows Terminal 設置 UTF-8 | 同上 |
| 資料庫連接 | JDBC URL: ?characterEncoding=utf8&useUnicode=true (MySQL) / 表/庫/連接校對集 utf8mb4 | 插入 Emoji 測試 |
| JVM 預設 | JDK 18+ 預設 UTF-8,舊版需 -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 | Charset.defaultCharset() |
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:log4j-slf4j-impl-2.17.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
<exclusion><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId></exclusion>。主代碼誤用 org.junit.jupiter.api.Test 註解,打包部署到生產環境帶入測試框架 Jar。
<scope>test</scope>。<compilerArgs><arg>-Xlint:unchecked</arg></compilerArgs> 可預警。Java 坑深似海,歡迎在評論區補充你的避坑經驗,共建「Java 開發避坑知識庫」。