
1. 先理清楚第一个Java程序为什么值得认真跑一遍IDEA运行第一个Java简单程序这句话看着像新手教程的标题但我带过几个转行的朋友之后发现从新建项目到运行类这半小时其实是整个Java学习路径里信息密度最高的一段。你在这半小时里会同时撞上JDK、SDK、模块、源码根目录、字节码输出目录、运行配置这一整套概念任何一环理解偏了后面写几百行代码都会在同一个坑里反复摔。所以这篇不打算给你一份点下一步就完事的流水账而是把每一步背后的东西讲透让你第一次按下运行键的时候心里是明白的。这篇文章适合三类人完全没碰过Java的纯新手、从记事本加javac或者Eclipse迁移过来的朋友、以及那种能跑但说不清为什么能跑的补课党。整套流程我按 IntelliJ IDEA 2023 之后的新版界面来写遇到老版本菜单位置不同的地方我会标一句。JDK 用 17 或 21 这两个长期支持版本做示范其他版本差异我会点出来。先说一个很多人忽略的事实你的第一个程序能不能跑起来跟代码写得对不对关系不大九成的失败都发生在代码之外的三个地方——SDK有没有认到、源码目录有没有被标记、运行配置指向的模块对不对。代码本身只有一行输出写错的可能性极低。所以下面我会把大量篇幅放在环境和项目结构上这才是真正的战场。2. 环境准备IDEA与JDK的安装与校验2.1 IDEA版本怎么选装的时候注意什么IntelliJ IDEA 分两个版本社区版Community和旗舰版Ultimate。跑第一个Java程序社区版完全够用它对Java SE的支持和旗舰版没有区别缺的是Spring、数据库工具、JavaScript那一大堆企业级功能。旗舰版有30天试用学生和教师可以用教育邮箱申请免费授权如果你打算长期做Web后端走官方渠道拿正版授权是最省心的路径别去折腾来路不明的版本装完不稳定、自动关闭、插件市场连不上排查起来比装一次费劲十倍。安装过程本身没什么技术含量但有两个细节值得说。第一是安装路径别放中文和空格目录比如D:\软件\idea这种路径在某些插件和构建工具上会出莫名其妙的编码问题老老实实用D:\dev\IntelliJ IDEA这种纯英文路径。第二是安装向导里那几个勾选项Create Desktop Shortcut按需Update PATH variable建议勾上它会把IDEA的命令行启动器加进PathAdd bin folder to the PATH同理。至于Update context menu右键菜单加Open Folder as Project和文件关联看你习惯我一般勾上前者后者不勾因为我很少双击.java文件。如果你是刚开始用界面是英文的也别急着找中文包。JetBrains官方在插件市场提供了一个简体中文语言包路径是Settings Plugins Marketplace搜索Chinese就能看到官方那个装完重启生效。不过我的建议是先别装原因很实际你以后查资料、看报错、搜Stack Overflow看到的全是英文界面下的菜单名中文界面会让你对不上号。等你能凭肌肉记忆找到各个设置了再装中文包当辅助也不迟。2.2 JDK到底装哪个环境变量怎么配JDK的发行版现在多得让人眼花我给你列一下常见的几个和它们的定位发行版谁在维护适合谁Oracle JDKOracle需要商业支持、用Oracle生态的团队Eclipse TemurinAdoptium社区最通用的免费选择推荐新手Amazon Corretto亚马逊要部署到云上、想要长期免费更新Microsoft Build of OpenJDK微软Windows环境、Azure生态各Linux发行版自带发行版维护者服务器上不想额外装版本上JDK 17 和 JDK 21 都是长期支持版LTS选哪个都行。JDK 8 虽然老项目里到处都是但新学的话没必要从8开始17的语法和工具链都更现代。下载时注意选对系统架构现在大部分机器是x64苹果M系列芯片要选aarch64。装完之后必须验证别装完就当成了。打开终端Windows用cmd或PowerShellmacOS和Linux用终端敲两条命令java -version javac -version两条都要有输出而且版本号要一致。如果java有输出但javac提示不是内部或外部命令说明你装的是JRE不是JDK或者Path没配全——这是个高频问题很多人下的是JRE包能跑别人的class但编译不了自己的代码。环境变量的配置逻辑是这样的先建一个JAVA_HOME值指向JDK的根目录而不是bin目录比如D:\dev\jdk-17然后把%JAVA_HOME%\bin追加到Path里macOS和Linux是$JAVA_HOME/bin。为什么要多此一举用JAVA_HOME而不是直接把bin路径写进Path因为Maven、Gradle、Tomcat这些工具都会去读JAVA_HOME来定位JDK你要是只配了Path后面接构建工具的时候还得回来补。这一步提前做后面省事。注意改完环境变量一定要重开终端再验证已经打开的终端窗口读的是旧的环境变量很多人在这里怀疑人生。2.3 在IDEA里把SDK认进来装好JDK不等于IDEA就认识它。IDEA管理JDK的方式是通过SDK这个概念一个SDK就是一份JDK的引用。你可以在File Project Structure Platform Settings SDKs里看到当前注册的所有JDK点左上角的加号选Add JDK然后定位到你的JDK根目录。新版IDEA还有个更省事的路子在新建项目向导里JDK那一栏下拉如果有Download JDK选项可以直接让IDEA帮你下。它默认走的是Eclipse Temurin版本可以自己挑。这个功能对新手特别友好因为省掉了环境变量那一整套操作。但我要提醒一句IDEA下载的JDK不一定会自动配好系统环境变量如果你后面要在终端里用javac还是得自己配一遍。这里有个概念要澄清Project SDK项目级和Module SDK模块级是两个层级。一个项目可以包含多个模块每个模块理论上可以挂不同的JDK虽然实际开发中很少这么干。当你遇到明明配了JDK但代码还是全红的情况八成是模块级的SDK空着去Project Structure Modules Dependencies看一眼Module SDK是不是显示No SDK是的话改成Project SDK就行。另外还有个Language Level语言级别它和SDK是两个独立的东西。SDK决定你用哪个JDK编译运行Language Level决定IDE允许你写哪个版本的语法。假设你的SDK是JDK 21但Language Level设成了8那你写var局部变量推断可能没事但写文本块、record这些新语法就会报红。这两个配置建议保持一致或者Language Level略低于SDK别反过来。3. 新建项目从向导到可编译的工程结构3.1 新建项目向导里每个字段到底填什么点File New Project打开向导。新版向导的界面比老版本干净很多主要就几栏Name项目名会用来做文件夹名也会成为运行配置里模块名的默认值。用英文别用中文和特殊字符。Location项目存放路径同样避开中文路径。Language选 Java。这个下拉里还有Kotlin、Groovy什么的别选错。Build system这是最关键的一栏有三个选项——IntelliJ、Maven、Gradle。JDK选你注册好的SDK或者点Download JDK现下。Add sample code勾上会给你自动生成一个Main.java里面带一个main方法。关于Build system怎么选我给个明确建议第一个程序选 IntelliJ。理由很实在Maven和Gradle会引入额外的目录结构和配置文件pom.xml、build.gradle、.mvn这些东西在你还没搞懂什么是源码根目录的时候只会增加噪音。等你把Java基础语法过完了再单独学构建工具那时候你才有能力分辨哪些报错是代码问题、哪些是构建配置问题。选Maven的话项目结构会变成src/main/java、src/main/resources、src/test/java这套标准布局而且第一次创建时IDEA会去下载依赖、建立索引网慢的话要等一两分钟。这段时间里如果你急着点运行很可能看到一堆红字这不是你代码的问题是Maven还在后台忙。新区向导右下角会有进度条等它转完再动手。3.2 项目结构解剖src、out、.idea、iml都是什么项目建好之后左边的Project面板里你会看到这么几个东西src源码根目录Sources Root你的.java文件放这儿。IDEA会把它标记成蓝色蓝色意味着这里面是源码编译时要处理。这个标记不是装饰它直接决定IDEA去哪些目录找类。out编译输出目录你按运行之后class文件就生成在这里。默认路径是out/production/项目名/。这个目录不需要你手动管但知道它在哪很有用——排查主类找不到这类问题时第一件事就是去out里看看class文件到底生成了没有。.ideaIDEA的项目配置目录里面是xml格式的配置文件包括编码设置、模块定义、运行配置等等。这个目录不应该提交到版本控制IDEA默认会自动生成.gitignore。项目名.iml模块文件记录这个模块的SDK、依赖、源码目录等。新版IDEA把它藏在.idea里了老版本是放在项目根目录的。理解这几个目录的层级关系很重要一个Project可以包含多个Module每个Module有自己的源码目录和输出目录。你现在建的是单模块项目所以看起来简单但IDEA内部依然是项目—模块—源码根—输出这个链条。后面遇到运行配置找不到模块这类问题就是因为这条链断了。还有一点src目录本身不一定直接是源码根。在IntelliJ类型的项目里src通常被直接标记为Sources Root在Maven项目里被标记的是src/main/java而src只是个普通目录。这两个情况在界面上看起来都是蓝色的但层级不同。混淆这两个是新建项目没有src问题的根源之一。3.3 新建项目没有src的三种成因和修复路径这是搜索量极高的一个问题我把它拆成三种情况对号入座就行。情况一你建的是Empty Project。向导里如果选择了空项目类型IDEA只会创建一个.idea目录什么源码目录都不会给。修复方式是手动建右键项目根目录New Directory名字填src然后右键这个src目录Mark Directory as Sources Root。做完之后目录会变蓝这时候你才能在里面新建Java类。情况二你选了Maven或Gradle但依赖还没加载完。这种情况下目录其实存在只是IDEA还没把它识别成源码根所以显示成普通文件夹颜色。等一下或者看右侧有没有弹出一个Maven projects need to be imported的提示条点它。实在不行就右键pom.xml选Add as Maven Project。情况三你建了IntelliJ项目但没勾Add sample code同时向导也没给你建src。某些版本在特定配置下确实会这样。按情况一的方法手动补一个src即可。还有一种容易被误判的情况你的src其实在只是Project面板的视图模式不对。点面板左上角那个齿轮或者下拉菜单看看是不是选成了Project Files以外的模式。切回Project视图目录层级就正常了。提示手动建的目录一定记得做Mark Directory as Sources Root这一步。很多人建完src就直接在里面写类结果IDEA不认代码全红然后开始怀疑JDK装错了。其实只是少点了一次右键菜单。4. 编写并运行第一个类完整实操4.1 新建Java类与包声明在src上右键New Java Class。弹窗里让你填名字这里有两个选择直接填HelloWorld这样类会位于默认包default package也就是没有package声明或者先在src下建一个包比如com.demo.hello再在里面建类。我强烈建议从第一次就用包。默认包在Java里是个能用但不该用的东西它有几个实际麻烦一是默认包里的类不能被其他包import二是很多框架和工具对默认包支持不好三是你早晚要改。步骤是这样的右键srcNew Package填com.demo.hello包名全小写习惯上用域名倒置回车IDEA会自动建出com/demo/hello三层目录。然后在这个包上右键新建Java类填HelloWorld。建好之后IDEA会给你一个骨架你在里面补上main方法。完整代码长这样package com.demo.hello; public class HelloWorld { public static void main(String[] args) { System.out.println(Hello, Java); } }注意类名HelloWorld必须和文件名HelloWorld.java完全一致包括大小写。这条规则只对public类强制但养成习惯永远保持一致。4.2 main方法签名里每个关键字是干什么的public static void main(String[] args)这一行是新手背得最熟、理解得最浅的一行。拆开看publicJVM在启动时要调用这个方法它得能从类外部访问所以必须公开。staticJVM调用它的时候还没有创建任何对象因为没有对象可以创建程序才刚刚启动所以必须是静态方法靠类名直接调。voidmain方法没有返回值JVM也不接收返回值。main方法名固定写法JVM按这个名字找入口。String[] args命令行参数数组。你用java HelloWorld a b c运行args里就有三个元素。写成String... args也行效果一样。这四个要素里改任何一个JVM都找不到入口。常见的翻车写法有把static忘了、把String[] args写成String args、把void写成int。IDEA对这些会直接飘红或者给提示但有些比如漏掉static语法上完全合法编译也能过只是运行时报找不到主方法。所以报错信息里看到 Main method not found in class 这类字样先回去核对这一行的五个部分。4.3 四种运行方式以及它们背后的区别写完之后准备跑。IDEA给了你好几种跑法行为不完全一样第一种编辑器左侧行号旁边的绿色三角。点一下选Run HelloWorld.main()。这是最直观的IDEA会自动为你创建一个运行配置。第二种快捷键。CtrlShiftF10运行光标当前所在的类ShiftF10重新运行上一次的配置。前者适合你手上有多个main方法的时候后者适合反复调试同一个类。第三种右键文件 Run。和第一种等价。第四种自己建运行配置。Run Edit Configurations点加号选Application然后手动填Name配置名随便取Main class点右边的省略号搜你的类名选com.demo.hello.HelloWorldUse classpath of module选你的模块一般默认就是对的Working directory程序的工作目录影响相对路径文件的读写。默认是项目根目录一般不用改JVM options虚拟机参数比如-Xmx512m限制堆内存。第一个程序用不上但后面跑大数据量程序时这里是必改项Program arguments传给main方法的args多个参数用空格分隔Environment variables环境变量读取配置的时候会用到第五种终端里手敲。这个方式我建议你也试一次因为能帮你理解IDE到底做了什么javac -d out src/com/demo/hello/HelloWorld.java java -cp out com.demo.hello.HelloWorld第一条命令把源码编译到out目录-d指定输出根目录javac会自动按包结构建子目录。第二条运行-cp指定类路径注意后面跟的是全限定类名带包名不加.class后缀。跑通这两条命令你就明白IDE的绿三角本质上就是帮你做了这两件事只不过它把类路径、输出目录、编码参数都自动配好了。4.4 运行结果与class文件去哪了运行成功后下方的Run工具窗口会输出Hello, Java Process finished with exit code 0exit code 0表示程序正常结束非0就是异常退出。这个数字在写脚本、做自动化的时候会用到现在你知道它是什么意思就行。同时去左边的out目录看一眼路径应该是out/production/项目名/com/demo/hello/HelloWorld.class。你会发现目录结构和src完全对应包名被翻译成了目录层级。这个.class文件就是字节码JVM真正执行的东西。你可以把它拷到另一台装了同版本或更高版本JDK的机器上直接java com.demo.hello.HelloWorld运行——前提是目录结构别打乱包结构就是类路径的一部分。有个细节值得注意如果你改了源码但没重新编译运行的还是旧的class文件。IDEA在你点运行时会自动编译有改动的文件但有时候增量编译会出问题尤其是改了包名或者删了类之后。这时候用Build Rebuild Project全量重建一遍比在那儿猜半天强。5. 常见报错与排查速查5.1 编译期的报错编译期错误的特点是代码下面有红波浪线Run按钮可能变灰或者点了之后弹窗提示编译失败。Cannot resolve symbol println或者类似的符号找不到九成是System的首字母没大写Java严格区分大小写system是不存在的。class HelloWorld is public, should be declared in a file named HelloWorld.java这是类名和文件名不一致。检查一下是不是建类的时候名字打了或者在文件里手动改了类名。IDEA有重构功能改类名用ShiftF6它会自动同步文件名手动改文本就容易出这个问题。package com.demo.hello does not exist说明包声明和实际目录结构对不上。要么是你在文件头部手写了package但目录没对应要么是移动文件的时候没走重构。修复方式是把文件拖到正确的目录让IDEA自动更新package声明。Source option 8 is no longer supported或类似的版本号报错这是Language Level和SDK版本冲突。去File Project Structure Project把Language level和SDK调成一致同时检查Modules里模块的语言级别。5.2 运行期的报错Error: Could not find or load main class com.demo.hello.HelloWorld这个报错出现频率极高原因通常是class文件根本不存在编译失败但你没注意、类路径设错了、或者包名和实际目录不一致。排查顺序先看out目录里有没有对应的class文件有的话再看运行配置里的Main class是不是选错了。Main method not found in class...类加载了但里面没有合法的main方法。回去核对那五个要素特别是static有没有漏。控制台输出中文变成问号或者乱码。这是编码问题。先检查Settings Editor File Encodings把三个下拉都设成UTF-8勾上底部的Transparent native-to-ascii conversion这个主要影响properties文件。如果源码编码没问题但控制台还是乱码那就是运行环境的问题。JDK 18开始标准Java API的默认字符集已经是UTF-8了所以如果你用JDK 17或更早可以在运行配置的VM options里加-Dfile.encodingUTF-8试试。5.3 IDE自身的异常项目全红但代码明明没问题。先试File Invalidate Caches / Restart选Invalidate and Restart。这个操作会清掉IDEA的索引缓存然后重启能解决相当一部分玄学问题。索引重建需要几分钟耐心等。IDEA用着突然自己关闭了。常见原因是内存不够。Help Change Memory Settings把堆内存上限从默认的2048调大比如4096重启生效。如果你的机器内存只有8G别调到4096以上容易把系统拖垮。另外如果你装了来路不明的插件也可能导致崩溃去插件列表里把最近装的一个个禁用看看。模块SDK显示为空代码全面报红。File Project Structure Modules Dependencies看Module SDK那一栏如果是No SDK改成Project SDK。改完点Apply。5.4 常见问题速查表现象最可能的原因处理方式新建项目后没有src建了Empty Project或Maven未加载手动建src并标记为Sources Root运行按钮灰色当前类没有main方法或未编译通过检查main签名看编译错误找不到主类运行配置的Main class选错/class文件不存在核对全限定类名Rebuild一下中文乱码文件编码或控制台编码不是UTF-8统一设UTF-8VM options加encoding参数IDEA莫名退出堆内存不足或插件冲突调大内存禁用可疑插件代码全红但内容正确索引损坏Invalidate Caches / Restartjavac命令找不到装的是JRE或Path没配装JDK配JAVA_HOME和Path6. 能省时间的细节与后续延伸6.1 几个必须记住的快捷键和模板IDEA的价值有相当一部分在代码模板上。你在类体里敲psvm然后按Tabmain方法的完整签名就出来了敲sout按TabSystem.out.println()就出来了。这两个是使用频率最高的建议第一天就形成肌肉记忆。其他几个我常用的CtrlAltL格式化代码不管你的缩进多乱一下就对CtrlD复制当前行到下一行注意不是删除IDEA里删除行是CtrlYAltInsert生成getter、setter、构造方法CtrlAltV把表达式抽成变量CtrlB跳到定义ShiftF6重命名并自动同步所有引用。这些快捷键不用一次全记遇到重复劳动的时候去查一下有没有对应的快捷键慢慢就攒起来了。还有一个隐藏得很好的功能AltEnter也就是Show Context Actions。代码下面有黄线或红线的时候把光标放上去按这个键IDEA会给你一堆修复建议很多时候直接选第一个就把问题解决了。新手排查报错先按AltEnter再说。6.2 从单文件到工程化往后怎么走第一个程序跑通之后别急着把项目删了。这个项目其实是个很好的实验台你可以试着在里面做几件事来巩固理解。一是加第二个类在这个类里调用刚才那个类的静态方法观察import是怎么出现的包与包之间怎么访问。二是改包名用ShiftF6重构注意观察目录结构和文件头部的package声明是怎么同步变化的。三是把项目改造成Maven项目右键pom.xml如果一开始选的是IntelliJ类型可以新建一个Maven项目做对比对比两套目录结构的差异理解为什么Maven要用src/main/java这种更深的层级——它把源码、资源、测试代码分了家编译时各走各的路径。再往后就是模块化。多模块项目里每个模块有自己的src、自己的iml、自己的输出目录模块之间通过依赖互相引用。你以后遇到的那些为什么这个类在这个模块里能用、在另一个模块里就不能用的问题根源都在模块依赖上。现在这个单模块项目就是理解那套东西的起点。最后说一句我的实际体会。我见过太多人在第一个程序跑不起来这一步卡住然后去装各种教程里提到的工具、换各种JDK版本、甚至重装系统折腾一整天其实问题就出在少勾了一个 Add sample code或者忘了把src标记成Sources Root。遇到报错的时候先把报错原文完整读一遍再去Run窗口和out目录里确认状态八成能自己解决。IDEA的报错信息写得其实挺明白的只是新手习惯性地跳过它去看百度。我这个习惯改过来之后解决问题的速度至少快了三倍。