这份资料不是简单地粘贴代码,而是以“实验指导”的形式,为您详细讲解每个实验的目标、知识点、实现思路、核心代码和常见问题,这样不仅能完成实验,更能真正理解Java编程的核心思想。

Java程序设计 实验指导与答案解析
Java基础语法与流程控制
实验目标:
- 掌握Java程序的基本结构(
public class,main方法)。 - 熟练使用基本数据类型、变量、常量和运算符。
- 掌握
if-else、switch、for、while、do-while等流程控制语句。 - 理解并使用
Scanner类进行控制台输入。
1:简单计算器**
任务描述: 编写一个程序,实现一个简单的控制台计算器,用户输入两个数字和一个运算符(, , , ),程序输出计算结果,如果运算符非法或除数为0,则给出错误提示。
核心知识点:

Scanner类获取用户输入switch语句处理多分支if-else语句进行条件判断(如除数为0)- 基本的算术运算
实现思路:
- 创建
Scanner对象来读取用户输入。 - 提示用户并分别读取第一个数字、运算符和第二个数字。
- 使用
switch语句根据运算符进行不同的计算。 - 在
case '/'中,需要先用if判断第二个数字是否为0,如果为0则输出错误信息并break,否则才进行除法运算。 - 使用
default处理非法运算符的情况。
参考代码:
import java.util.Scanner;
public class SimpleCalculator {
public static void main(String[] args) {
// 1. 创建Scanner对象
Scanner scanner = new Scanner(System.in);
// 2. 获取用户输入
System.out.print("请输入第一个数字: ");
double num1 = scanner.nextDouble();
System.out.print("请输入运算符 (+, -, *, /): ");
char operator = scanner.next().charAt(0); // 读取字符串的第一个字符
System.out.print("请输入第二个数字: ");
double num2 = scanner.nextDouble();
double result = 0;
// 3. 使用switch进行计算
switch (operator) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
// 4. 处理除数为0的情况
if (num2 != 0) {
result = num1 / num2;
} else {
System.out.println("错误:除数不能为0!");
return; // 结束程序
}
break;
default:
System.out.println("错误:无效的运算符!");
return; // 结束程序
}
// 5. 输出结果
System.out.println("计算结果是: " + result);
// 关闭Scanner,防止资源泄露 (Java 7+ 的try-with-resources更好,但这里用基础方式)
scanner.close();
}
}
2:判断素数**
任务描述: 编写一个程序,从控制台接收一个正整数,判断该数是否为素数(质数),素数是指只能被1和它本身整除的大于1的自然数。
核心知识点:
for循环if条件判断- 取模运算符
- 逻辑运算符
&&
实现思路:
- 获取用户输入的整数
n。 n <= 1,则直接不是素数。n == 2,则是素数。- 对于
n > 2的情况,使用一个for循环,从i = 2遍历到Math.sqrt(n)(优化点:只需判断到其平方根即可)。 - 在循环中,
n能被i整除(n % i == 0),则n不是素数,可以提前结束循环。 - 循环结束后,如果
n没有被任何数整除,则是素数。
参考代码:
import java.util.Scanner;
public class PrimeNumberChecker {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个正整数: ");
int number = scanner.nextInt();
boolean isPrime = true; // 假设是素数
// 处理小于等于1的数
if (number <= 1) {
isPrime = false;
} else {
// 从2遍历到number的平方根
for (int i = 2; i <= Math.sqrt(number); i++) {
if (number % i == 0) {
isPrime = false; // 发现一个能整除的因子,就不是素数
break; // 提前退出循环
}
}
}
// 输出结果
if (isPrime) {
System.out.println(number + " 是一个素数。");
} else {
System.out.println(number + " 不是一个素数。");
}
scanner.close();
}
}
面向对象编程基础
实验目标:
- 掌握类的定义和对象的创建。
- 理解并使用成员变量(属性)和成员方法。
- 掌握构造方法的定义和使用。
- 理解
private、public等访问修饰符的作用。 - 掌握
this关键字的使用。
1:学生信息管理**
任务描述:
创建一个Student类,用于表示学生信息,该类应包含属性:id(学号)、name(姓名)、age(年龄),要求:
- 属性为
private。 - 提供一个无参构造方法和一个全参构造方法。
- 为每个属性提供
getter和setter方法。 - 重写
toString()方法,用于方便打印学生信息。 - 在
main方法中创建Student对象,并测试其方法。
核心知识点:
- 类与对象
- 封装(
private属性,public方法) - 构造方法
getter/setter方法toString()方法重写
参考代码:
Student.java (类文件)
public class Student {
// 1. 私有属性
private String id;
private String name;
private int age;
// 2. 无参构造方法
public Student() {
}
// 3. 全参构造方法
public Student(String id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
// 4. getter 和 setter 方法
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
// 5. 重写 toString() 方法
@Override
public String toString() {
return "Student{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
StudentTest.java (测试类)
public class StudentTest {
public static void main(String[] args) {
// 使用全参构造方法创建对象
Student student1 = new Student("1001", "张三", 20);
// 使用getter方法获取属性
System.out.println("学号: " + student1.getId());
System.out.println("姓名: " + student1.getName());
System.out.println("年龄: " + student1.getAge());
System.out.println("--------------------");
// 使用setter方法修改属性
student1.setAge(21);
System.out.println("修改后的年龄: " + student1.getAge());
System.out.println("--------------------");
// 直接调用对象,会自动调用toString()方法
System.out.println("学生信息: " + student1);
}
}
数组与常用类
实验目标:
- 掌握一维数组和二维数组的声明、初始化和使用。
- 掌握
String类的常用方法(length(),substring(),indexOf()等)。 - 掌握
Arrays类的常用方法(sort(),toString()等)。
1:数组排序与查找**
任务描述:
- 创建一个包含10个随机整数的数组。
- 使用
Arrays.sort()方法对数组进行升序排序。 - 打印排序前后的数组内容。
- 实现一个简单的线性查找或二分查找(前提是数组已排序),查找用户输入的数字是否在数组中。
核心知识点:
- 数组的创建和遍历
Arrays工具类for-each循环- 查找算法
实现思路:
- 创建一个
int数组并初始化。 - 打印排序前的数组(使用
Arrays.toString())。 - 调用
Arrays.sort()进行排序。 - 打印排序后的数组。
- 获取用户要查找的数字。
- 使用
Arrays.binarySearch()进行二分查找(效率更高,但前提是数组必须有序)。 - 根据返回值判断查找结果(返回值为索引,
-1或负数表示未找到)。
参考代码:
import java.util.Arrays;
import java.util.Scanner;
public class ArraySortAndSearch {
public static void main(String[] args) {
int[] numbers = {34, 12, 89, 5, 67, 42, 29, 58, 99, 41};
System.out.println("排序前的数组: " + Arrays.toString(numbers));
// 对数组进行排序
Arrays.sort(numbers);
System.out.println("排序后的数组: " + Arrays.toString(numbers));
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个要查找的数字: ");
int target = scanner.nextInt();
// 使用二分查找
int index = Arrays.binarySearch(numbers, target);
if (index >= 0) {
System.out.println("数字 " + target + " 在数组中,索引位置是: " + index);
} else {
System.out.println("数字 " + target + " 不在数组中。");
}
scanner.close();
}
}
异常处理
实验目标:
- 理解异常的概念和分类。
- 掌握
try-catch-finally语句块的使用。 - 能够自定义异常。
1:文件读取异常处理**
任务描述:
编写一个程序,尝试读取一个不存在的文件test.txt,使用try-catch块来捕获并处理可能发生的FileNotFoundException异常,并给出友好的提示信息。
核心知识点:
try-catch-finally结构- 常见异常类型(
FileNotFoundException,IOException等) FileReader类
实现思路:
- 在
try代码块中,创建FileReader对象来读取文件。 - 将可能抛出异常的代码(如
new FileReader("test.txt"))放在try块中。 - 使用
catch (FileNotFoundException e)来捕获特定的文件未找到异常。 - 在
catch块中,打印异常信息或自定义友好提示。 - (可选)
finally块中可以放置关闭资源的代码,确保资源被释放。
参考代码:
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.IOException;
public class ExceptionHandlingDemo {
public static void main(String[] args) {
FileReader reader = null; // 在try块外声明,以便在finally块中使用
try {
// 尝试读取一个不存在的文件
reader = new FileReader("test.txt");
System.out.println("文件打开成功!");
// ... 其他文件操作 ...
} catch (FileNotFoundException e) {
// 捕获文件未找到异常
System.out.println("错误:文件未找到!请检查文件名和路径是否正确。");
// e.printStackTrace(); // 可以打印完整的堆栈信息,用于调试
} finally {
// 无论是否发生异常,finally块中的代码都会执行
// 通常用于释放资源
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
System.out.println("关闭文件时发生错误。");
}
}
System.out.println("文件读取操作结束。");
}
}
}
集合框架
实验目标:
- 掌握
ArrayList、HashSet、HashMap等常用集合类的使用。 - 理解集合的泛型。
- 掌握集合的常用方法(
add,remove,get,put,contains等)。 - 能够遍历集合(迭代器、增强for循环)。
1:学生名单管理**
任务描述:
- 使用
ArrayList<Student>(使用实验二的Student类)来存储多个学生对象。 - 实现添加学生、删除学生(按学号)、查找学生(按学号)、打印所有学生信息的功能。
- 注意学号的唯一性。
核心知识点:
ArrayList集合- 泛型
<Student> - 迭代器
Iterator用于安全删除 - 增强for循环用于遍历
参考代码:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;
public class StudentManager {
public static void main(String[] args) {
// 创建一个Student类型的ArrayList
ArrayList<Student> studentList = new ArrayList<>();
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("\n--- 学生管理系统 ---");
System.out.println("1. 添加学生");
System.out.println("2. 删除学生");
System.out.println("3. 查找学生");
System.out.println("4. 打印所有学生");
System.out.println("5. 退出");
System.out.print("请选择操作: ");
int choice = scanner.nextInt();
scanner.nextLine(); // 消耗换行符
switch (choice) {
case 1:
addStudent(studentList, scanner);
break;
case 2:
removeStudent(studentList, scanner);
break;
case 3:
findStudent(studentList, scanner);
break;
case 4:
printAllStudents(studentList);
break;
case 5:
System.out.println("感谢使用,系统退出。");
scanner.close();
return;
default:
System.out.println("无效的选择,请重新输入!");
}
}
}
// 添加学生
private static void addStudent(ArrayList<Student> list, Scanner scanner) {
System.out.print("请输入学号: ");
String id = scanner.nextLine();
System.out.print("请输入姓名: ");
String name = scanner.nextLine();
System.out.print("请输入年龄: ");
int age = scanner.nextInt();
scanner.nextLine(); // 消耗换行符
list.add(new Student(id, name, age));
System.out.println("学生添加成功!");
}
// 删除学生 (使用迭代器安全删除)
private static void removeStudent(ArrayList<Student> list, Scanner scanner) {
System.out.print("请输入要删除学生的学号: ");
String id = scanner.nextLine();
Iterator<Student> iterator = list.iterator();
boolean found = false;
while (iterator.hasNext()) {
Student s = iterator.next();
if (s.getId().equals(id)) {
iterator.remove(); // 使用迭代器的remove方法
found = true;
System.out.println("学号为 " + id + " 的学生已删除。");
break;
}
}
if (!found) {
System.out.println("未找到学号为 " + id + " 的学生。");
}
}
// 查找学生
private static void findStudent(ArrayList<Student> list, Scanner scanner) {
System.out.print("请输入要查找学生的学号: ");
String id = scanner.nextLine();
for (Student s : list) {
if (s.getId().equals(id)) {
System.out.println("找到学生: " + s);
return;
}
}
System.out.println("未找到学号为 " + id + " 的学生。");
}
// 打印所有学生
private static void printAllStudents(ArrayList<Student> list) {
if (list.isEmpty()) {
System.out.println("当前没有学生信息。");
} else {
System.out.println("--- 所有学生信息 ---");
for (Student s : list) {
System.out.println(s);
}
}
}
}
总结与建议
- 理解而非背诵:上面的代码和思路是为了帮助你理解每个实验的核心概念,请务必自己动手敲一遍,并尝试修改、扩展功能,这样才能真正掌握。
- 调试能力:遇到错误时,学会阅读编译器错误信息,并使用
System.out.println()或IDE的调试功能来追踪代码的执行流程。 - 代码规范:养成良好的编码习惯,如类名首字母大写、方法名和变量名驼峰命名、适当的注释等。
- 面向对象思想:从实验二开始,就要时刻思考“这个实体有什么属性?能做什么行为?”,这是Java编程的精髓。
希望这份详细的实验指导能对你的Java学习有所帮助!祝你实验顺利!
