简介:这份《Java程序设计实验指导书》面向高校Java课程学生与自学者,针对上机实验环节目标不清、动手练习缺乏系统引导的问题,提供从环境搭建到综合应用的完整实验方案。压缩包内为1个doc文档,约530KB,按实验模块编排,便于直接打印或课堂分发。内容覆盖Java运行环境安装与配置、基本语法练习、面向对象编程、包与接口及异常处理、数组向量与字符串、常用系统类等基础实验,并延伸至图形用户界面、图形与多媒体处理、流与文件、多线程、网络编程等进阶主题,另附JDBC数据库连接与JSP/Servlet选学内容,同时给出68学时的课时分配建议。每个实验均列明实验目的、要求与具体内容,读者可据此按部就班完成编码练习,理解Java程序结构与设计方法,逐步提升分析与解决问题的能力。已有240人学习下载,适合需要配套实验任务与课时安排参考的Java初学者及任课教师使用。
1. 从一台干净机器开始:Java 实验环境到底要装什么
上周帮一个学弟看他的实验一,代码没错,javac就是报「找不到或无法加载主类」。折腾半小时才发现,他装完 JDK 后把CLASSPATH设成了.;%JAVA_HOME%\lib,少了tools.jar那一截,编译能过、运行就翻车。这类问题在 Java 实验里太常见了——实验指导书写了 8 到 14 个实验,从环境安装一路做到多线程、网络编程、JDBC,但真正卡住人的往往不是后面的面向对象和异常处理,而是第一步环境没配对。这份实验指导书覆盖 Java 基础、Java 核心、企业级应用选学三块,合计 66 学时上下,适合刚接触 Java、需要照着实验序号一步步做下来的同学,也适合带实验课、想统一环境口径的助教。下面按「装什么版本 → 怎么配 → 怎么验证 → 坏了怎么救」走一遍,把实验 1 到实验 12 的环境底座先打牢。
2. 版本与目录规划:JDK 选型、安装路径和实验工程结构
2.1 JDK 版本怎么选:实验指导书年代与当前环境的折中
这份指导书的实验内容里出现了 Applet、JCreator、Graphics类绘图、Vector类这些偏早期的写法,说明它成文时面向的是 JDK 1.x 到 JDK 8 这一代教学环境。直接照书装一个很老的 JDK 不是不行,但会遇到两个现实问题:一是新系统上老安装包经常签名或兼容性报错,二是后面实验 13、14 的 JDBC 和 JSP/Servlet 选学内容,老版本驱动和容器不好找。
我一般的做法是:教学实验统一用 JDK 8(jdk1.8.0_xxx)或 JDK 11 这两个 LTS 版本,优先 JDK 8,因为指导书里的 Applet、JFrame、Vector在 JDK 8 上行为最接近教材描述,javac对老语法的容忍度也高。JDK 17 之后 Applet 相关 API 已被移除,实验 3、6、9 里那些Applet生命周期、init/start/stop/destroy的练习会直接编译不过,这一点要提前知道。
| 版本 | 适配情况 | 建议 |
|---|---|---|
| JDK 8 | 与指导书实验 1–12 基本吻合,Applet 可用 | 首选,教学统一口径 |
| JDK 11 | 大部分语法实验可用,Applet 已废弃 | 可用,实验 3/6/9 需改写成JFrame |
| JDK 17+ | Applet 移除,部分老 API 行为变化 | 不建议直接照书做 |
安装路径上,Windows 我习惯放C:\Java\jdk1.8.0_xxx,不要带空格、不要放Program Files下面。带空格的路径在JAVA_HOME拼接、某些老版本JCreator识别时容易出玄学问题,这是血泪经验。Linux 或 macOS 放/usr/local/java/jdk1.8.0_xxx,后面配PATH时路径短、好排查。
2.2 实验工程目录:一个实验一个文件夹,别全堆在桌面
指导书按实验 1 到实验 14 编排,每个实验下面又有若干小题(比如实验 2 有声明变量、运算符、选择语句、循环语句六七个小节)。如果所有.java文件都扔在桌面,javac编译出来的.class会和源文件混在一起,实验 4 的自定义包、实验 10 的文件流读写马上就会因为路径问题翻车。
我建议一开始就建好这样的结构:
# 实验根目录,路径不要带中文和空格 mkdir -p ~/java-lab/lab01 ~/java-lab/lab02 ~/java-lab/lab03 # 每个实验一个目录,源文件放 src,编译产物放 out mkdir -p ~/java-lab/lab01/src ~/java-lab/lab01/out这样做的逻辑是:src只放.java,out接.class,编译时用-d out指定输出目录,源目录永远干净。实验 4 要建自定义包时,包名对应子目录(比如package mypack;就放src/mypack/),javac -d out src/mypack/*.java会自动在out下生成mypack/层级,运行时java -cp out mypack.主类名就能找到。这个习惯从实验 1 就养成,后面实验 10 的流与文件、实验 12 的网络编程都不会因为「类找不到」浪费时间。
提示:目录名、文件名、包名三者大小写要一致。Windows 文件系统不区分大小写,
MyClass.java写成myclass.java本地能编译,换到 Linux 或提交到实验平台就报错,这是实验课最常见的扣分点之一。
3. 安装与环境变量:JAVA_HOME、PATH、CLASSPATH 三件套
3.1 Windows 下安装 JDK 8 并配置三个变量
下载对应平台的 JDK 8 安装包后,双击安装,安装路径改成C:\Java\jdk1.8.0_xxx。安装程序会顺带问要不要装公共 JRE,教学环境装不装都行,但JAVA_HOME一定指向 JDK 目录而不是 JRE 目录,否则javac找不到。
装完后打开「系统属性 → 高级 → 环境变量」,在系统变量里新建和修改:
# 新建系统变量 JAVA_HOME = C:\Java\jdk1.8.0_xxx # 编辑 Path,在最前面追加(不要删掉原有内容) %JAVA_HOME%\bin # 新建 CLASSPATH(可选,但实验 4 之后建议设) .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar三个变量的作用要分清:JAVA_HOME是给其他工具(比如后面的 Tomcat、Maven、JCreator)引用 JDK 根目录用的,本身不参与命令查找;PATH里加%JAVA_HOME%\bin是为了让系统能找到java、javac、javadoc这几个可执行文件;CLASSPATH告诉 JVM 去哪里找用户类和系统类,开头的.表示当前目录,少了它,你在实验目录下java 主类名就会报「找不到或无法加载主类」。
tools.jar那一截是很多人漏掉的。JDK 8 里tools.jar包含编译器相关类,虽然普通实验不直接调用,但某些 IDE 和构建工具会依赖它。如果只写.;%JAVA_HOME%\lib,编译能过、运行偶尔出问题,就是开头那个学弟踩的坑。
3.2 Linux / macOS 下的等价配置
Linux 或 macOS 上把 JDK 解压到/usr/local/java/后,编辑~/.bashrc或~/.zshrc:
export JAVA_HOME=/usr/local/java/jdk1.8.0_xxx export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar改完执行source ~/.bashrc让配置生效。这里PATH把$JAVA_HOME/bin放最前面,是为了避免系统自带的旧版java抢先被找到——有些发行版预装了 OpenJDK,which java一看指向/usr/bin/java,版本对不上,实验里javac和java版本不一致的怪问题多半出在这。
macOS 从较新版本开始默认 shell 是 zsh,改的是~/.zshrc而不是~/.bash_profile,改错文件等于没改,source完还是老版本,这个坑我见过不止一次。
3.3 验证安装:三条命令确认版本和路径
配置完先别急着写代码,用三条命令确认环境真的生效:
java -version javac -version echo $JAVA_HOME # Windows 用 echo %JAVA_HOME%预期输出里java和javac的版本号要一致,JAVA_HOME要指向你刚装的 JDK 目录。如果java -version有输出但javac -version报「不是内部或外部命令」,说明PATH只配了 JRE 的bin或者根本没配%JAVA_HOME%\bin;如果两个版本号不一致,说明系统里还有另一套 JDK 在PATH更前面,用where java(Windows)或which -a java(Linux/macOS)把所有java路径列出来,把不需要的从PATH里挪走。
注意:改完环境变量后,已经打开的终端或命令行窗口不会自动刷新,必须关掉重开,否则读到的还是旧值。这一点在 Windows 上尤其容易忽略。
4. 第一个实验跑通:编写、编译、运行与 JCreator 取舍
4.1 手写第一个 Java 程序并编译运行
实验 1 要求编写、编译、运行一个 Java 源程序。在lab01/src下新建HelloLab.java:
// 实验 1 第一个程序:输出一行文字,验证编译运行链路 public class HelloLab { public static void main(String[] args) { System.out.println("Java lab environment is ready."); } }编译和运行分两步,注意-d和-cp的配合:
# 进入实验目录 cd ~/java-lab/lab01 # 编译:-d 指定 class 输出到 out 目录 javac -d out src/HelloLab.java # 运行:-cp 指定类路径为 out,后面跟主类名(不带 .class) java -cp out HelloLabjavac -d out的含义是把编译产物按包结构输出到out,源文件没有包声明时就直接落在out/HelloLab.class。java -cp out HelloLab里的-cp是-classpath的缩写,告诉 JVM 从out目录找类,HelloLab是主类名,不能写成HelloLab.class或带路径。如果运行时报「找不到或无法加载主类」,九成是-cp没写、写错,或者当前目录不在类路径里。
4.2 JCreator 还要不要装:教学工具与现实取舍
指导书实验 1 的第(六)步要求安装、使用JCreator。这是个老牌轻量 Java IDE,界面简单、对初学者友好,但它对 JDK 版本的识别比较挑,装在新系统上经常出现「配置了 JDK 路径仍提示找不到编译器」的情况。
我的建议是:如果实验课明确要求交 JCreator 截图,就装;否则直接用命令行或换成 IntelliJ IDEA 社区版、VS Code 加 Java 扩展。JCreator 安装时要在「Configure → Options → JDK Profiles」里手动指向JAVA_HOME的bin目录,指向 JRE 目录会编译失败。装完后新建一个空工程,把HelloLab.java加进去,点编译按钮,看输出窗口有没有Process completed,有就说明工具链通了。
命令行跑通再上 IDE,这个顺序不要反。命令行能让你看清javac和java到底做了什么,IDE 只是把这些命令包了一层;反过来先上 IDE,一旦报错你连是哪一步出的问题都分不清。
4.3 实验 2 到实验 6 的编译方式差异
实验 2 基本语法、实验 3 面向对象、实验 5 数组向量字符串,都是单文件或少量文件,javac -d out src/*.java一把编译即可。实验 4 开始出现包和接口,编译方式要变:
# 实验 4:自定义包 mypack,源文件在 src/mypack/ 下 javac -d out src/mypack/*.java # 运行时用全限定类名 java -cp out mypack.PackageDemo这里的关键是包名和目录结构必须对应。package mypack;写在源文件第一行,源文件就必须在src/mypack/目录下,编译后out/mypack/PackageDemo.class,运行时类名写全限定名mypack.PackageDemo。实验 4 的异常处理部分还会用到try-catch-finally,编译本身没区别,但运行时如果异常没捕获,堆栈信息会指向具体行号,对照源文件看就行。
实验 6 常用系统类里涉及Applet生命周期,如果用的是 JDK 8 以上且没有 Applet 查看器,appletviewer命令可能不可用。常见做法是把 Applet 练习改写成JFrame窗口程序,或者用 JDK 8 自带的appletviewer跑.html嵌入页面。这一步不是环境问题,是 API 时代差异,提前知道能少折腾。
5. 避坑与排查:五条实验环境常见翻车记录
5.1 现象:javac能用,java报找不到主类
原因通常是CLASSPATH被设成了固定值且没有包含当前目录.,或者运行时没加-cp。解决:把CLASSPATH改成.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar(Linux 用.:),或者运行时显式java -cp out 主类名。我一般倾向后者,显式指定比依赖全局变量可控。
5.2 现象:中文输出乱码
Windows 命令行默认代码页是 GBK,源文件如果是 UTF-8 保存,System.out.println("中文")输出就是乱码。原因在编码不一致。解决:编译时加-encoding UTF-8,即javac -encoding UTF-8 -d out src/HelloLab.java;或者把源文件另存为 ANSI/GBK。教学环境统一用-encoding UTF-8更稳,换机器不会反复。
5.3 现象:实验 4 自定义包编译过了,运行提示「找不到或无法加载主类 mypack.xxx」
原因是运行时类路径没指到out的上级,或者包名和目录大小写不一致。检查out/mypack/下有没有.class文件,有的话确认java -cp out mypack.类名里out是包含mypack目录的那一层,不是out/mypack本身。包名MyPack和目录mypack大小写不一致也会出这个问题,Linux 上直接报错,Windows 上时好时坏,属于玄学范畴,统一小写最省心。
5.4 现象:装了新 JDK,旧项目编译报「不支持发行版本」
原因是 IDE 或构建工具里项目 SDK 还指向旧版本,或者javac用了-source/-target限制了版本。解决:确认java -version和javac -version一致,IDE 里把 Project SDK 改成同一个 JDK,命令行编译时不要随手加-source 1.5这类老参数。实验指导书年代久,网上抄来的编译命令常带老参数,照抄就翻车。
5.5 现象:JCreator提示找不到编译器
原因是 JDK Profiles 指向了 JRE 目录,或者JAVA_HOME没配。解决:在 JCreator 的 JDK Profiles 里把路径改到 JDK 根目录(含bin/javac的那一层),确认JAVA_HOME环境变量存在,重启 JCreator。如果还不行,直接用命令行编译,别在工具上耗时间,实验内容本身不依赖 IDE。
6. 装完怎么验证:用实验 1 到实验 3 做一次端到端自检
环境装完、变量配好,别急着往下做实验 4。先用实验 1 到实验 3 的内容做一次端到端自检,确认「编译 → 运行 → 面向对象多文件 → 包结构」整条链路都通。这一步花十分钟,能省掉后面几小时的排查。
自检分三层。第一层是单文件:HelloLab.java编译运行输出一行文字,确认javac、java、PATH都对。第二层是多文件面向对象:建两个类,一个Student带字段和方法,一个StudentDemo在main里创建对象调用方法,两个文件放同一目录,javac -d out src/*.java一起编译,java -cp out StudentDemo运行。这一层验证的是多文件编译和类之间的引用。第三层是包结构:把Student放进package model;,源文件移到src/model/,StudentDemo用import model.Student;引用,重新编译运行。这一层验证的是实验 4 之前的包路径基础。
# 三层自检的编译运行命令汇总 cd ~/java-lab/lab03 javac -encoding UTF-8 -d out src/*.java src/model/*.java java -cp out StudentDemo如果三层都过,说明 JDK 安装、环境变量、目录结构、编码设置四件事都没问题,可以放心进入实验 4 的接口与异常处理。如果第三层报「程序包 model 不存在」,回头检查src/model/Student.java第一行有没有package model;,以及编译命令有没有把src/model/*.java带上——只编译src/*.java会漏掉子目录里的包文件,这是实验 4 前后最高频的翻车点。
我自己的习惯是,每换一台机器、每重装一次 JDK,都强制走一遍这三层自检,不跳步。因为环境问题最怕「看起来装好了」,等到实验 10 读写文件、实验 12 建 Socket 连接时才暴露,排查成本翻好几倍。这份实验指导书的实验序号是递进的,环境底座稳了,后面 8 到 14 个实验就是按部就班填代码的事。希望帮到你。
本文还有配套的精品资源,点击获取