java上机测试错题回顾(2)
坚持,坚持!(ง •_•)ง加油加油~!!!会进步的!
睡觉是最好的。。前几天有状况休息了一下,救命啊!java你怎么能6.18就考试了?!。。
救命啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!淡淡的相似。
1 我的编译器抽风了,为什么别的软件包的同名文件被运行了
你遇到的问题是不同包中的同名类被意外运行,这通常是由 Java 类路径(Classpath)的加载机制导致的。以下是可能的原因和解决方案:
可能的原因:
- 类路径冲突:当多个包中存在同名类时,Java 虚拟机(JVM)会按照类路径中指定的顺序查找类。如果其他包的路径排在你的包前面,JVM 会优先加载该类。
- 默认包问题:如果你的类没有声明包(即位于默认包中),而其他包中有同名类,可能会导致混淆。
- IDE 配置错误:IDE 可能错误地配置了类路径,导致加载了错误的类。
- 编译缓存:旧的编译文件可能被缓存,导致运行的不是最新代码。
解决方案:
- 明确指定包名:确保你的类正确声明了包名(如
package PTA_training.Test2_2;
)。 - 检查类路径:确认类路径中没有其他同名类的路径,或者调整顺序让你的包优先加载。
- 清理和重建项目:删除编译生成的
.class
文件,重新编译项目。 - 使用完整类名:在代码中使用完整的类名(包括包名)来引用类,避免歧义。
- 检查 IDE 设置:确保 IDE 正确配置了源路径和输出路径。
示例检查步骤:
- 确认你的
Main
类位于正确的目录结构中(例如src/PTA_training/Test2_2/Main.java
)。 - 检查命令行编译和运行时是否指定了正确的类路径,例如:
bash
javac -d . Main.java # 编译到当前目录的包结构中 java PTA_training.Test2_2.Main # 从根目录运行完整类名
- 如果使用 IDE(如 Eclipse/IntelliJ),检查项目的构建路径(Build Path)设置。
注意事项:
- 避免在不同包中使用相同的类名,尤其是核心类(如
Main
)。 - 使用 IDE 的 "Go to Declaration" 功能确认引用的是正确的类。
- 如果问题仍然存在,尝试在新的干净项目中重新创建代码。
不知道呢,重命名以后重构就好了,然后把导包的删掉就好了。
2 注意空指针异常
toString
方法:"Circle(r:" + circle + '))'
这里直接拼接 circle
对象会调用 circle
对象的 toString
方法,不过当前实现中需要确保 circle
对象不为 null
,避免出现潜在的 NullPointerException
。
public String toString() {return "Cylinder(" +"h:" + height +", Circle(r:" + circle.toString() + ")";}
/*
原来错误的代码public String toString() {return "Cylinder(" +"h:" + height +", Circle(r:" + circle + ")";}
*/
3 处理多行输入,负数或者0的输入验证
在main函数里面需要有这样的验证,这是我原来写的:
package PTA_training.Test2_3;import java.util.Scanner;/*
7-3 sdut-oop-6 计算各种图形的周长(多态)
定义接口Shape,定义求周长的方法length()。
定义如下类,实现接口Shape的方法。
(1)三角形类Triangle (2)长方形类Rectangle (3)圆形类Circle等。
定义测试类Main,用Shape接口定义变量shape,
用其指向不同类形的对象,输出各种图形的周长。
并为其他的Shape接口实现类提供良好的扩展性。
提示: 计算圆周长时PI取3.14。
输入格式:
输入多组数值型数据(Java类型double);
一行中若有1个数,表示圆的半径;
一行中若有2个数(中间用空格间隔),表示长方形的长度、宽度。
一行中若有3个数(中间用空格间隔),表示三角形的三边的长度。
(需要判断三个边长是否能构成三角形)
若输入数据中有0或负数,则不表示任何图形,周长为0。
输出格式:
行数与输入相对应,数值为根据每行输入数据求得的图形的周长。
输入样例:
在这里给出一组输入。例如:
1
2 3
4 5 6
2
-2
-2 -3
输出样例:
在这里给出相应的输出。例如:
6.28
10.00
15.00
12.56
0.00
0.00*/
public class Main {public static void main(String[] args) {Scanner scanner =new Scanner(System.in);double radius = scanner.nextDouble();double length = scanner.nextDouble();double width = scanner.nextDouble();double side1 = scanner.nextDouble();double side2 = scanner.nextDouble();double side3 = scanner.nextDouble();Circle circle = new Circle(radius);Rectangle rectangle = new Rectangle(length, width);Triangle triangle = new Triangle(side1 , side2 ,side3);System.out.println(circle.length());System.out.println(rectangle.length());System.out.println(triangle.length());scanner.close();}
}
存在问题:只能处理固定数量的输入,不能处理多组输入;没有对输入的负数或零进行有效检验!
ai修复:
package PTA_training.Test2_3;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 循环读取每一行输入while (scanner.hasNextLine()) {String line = scanner.nextLine();// 按空格分割输入行String[] parts = line.split(" ");double perimeter = 0;try {// 将分割后的字符串转换为 double 数组double[] values = new double[parts.length];boolean hasNegativeOrZero = false;for (int i = 0; i < parts.length; i++) {values[i] = Double.parseDouble(parts[i]);// 检查是否有负数或零if (values[i] <= 0) {hasNegativeOrZero = true;break;}}// 如果没有负数或零,根据输入数量创建相应图形对象if (!hasNegativeOrZero) {Shape shape = null;if (parts.length == 1) {// 一个数表示圆的半径shape = new Circle(values[0]);} else if (parts.length == 2) {// 两个数表示长方形的长和宽shape = new Rectangle(values[0], values[1]);} else if (parts.length == 3) {// 三个数表示三角形的三边shape = new Triangle(values[0], values[1], values[2]);}if (shape != null) {perimeter = shape.length();}}} catch (NumberFormatException e) {// 输入格式错误,周长设为 0perimeter = 0;}// 输出周长,保留两位小数System.out.printf("%.2f\n", perimeter);}scanner.close();}
}
- 循环读取输入:借助
while (scanner.hasNextLine())
循环来读取每一行输入,直至没有更多输入为止。 - 分割输入行:使用
line.split(" ")
把每一行输入按空格分割成字符串数组parts
。 - 转换并检验负数:把
parts
数组里的每个字符串转换为double
类型,存于values
数组中。同时检查是否存在负数或零,若有则将hasNegativeOrZero
标记设为true
。 - 创建图形对象并计算周长:若没有负数或零,依据
parts
数组的长度创建对应的图形对象,然后调用length()
方法计算周长。 - 异常处理:运用
try-catch
块捕获NumberFormatException
异常,处理输入格式有误的情况,将周长设为 0。 - 输出结果:使用
System.out.printf("%.2f\n", perimeter)
输出周长,并且保留两位小数。
4 继承类之间的toString方法
当子类没有重写toString()
方法时,会继承父类的实现。
当子类重写toString()
方法时,可以选择完全替换父类的实现,或者通过super.toString()
调用父类的实现并在此基础上进行扩展。
//比如:return super.toString() + ", Mammal{isDomestic=" + isDomestic + "}";
这种模式使得toString()
方法能够反映对象的完整状态,无论对象在继承层次结构中的位置如何。
5 Scanner
读取换行符问题
当使用 scanner.nextInt()
读取整数之后,Scanner
会把换行符留在缓冲区。这就可能致使后续的读取操作出现异常。
在读取整数之后,调用 scanner.nextLine()
消耗换行符。
6 如果一行一行输入是可以的,但是如果把数据整段复制过去输出就不对了
谢谢ai老师~
当你整段复制输入数据时出现输出不对的问题,可能是由于不同操作系统的换行符差异以及 Java Scanner
类处理输入缓冲区的方式导致的。以下是详细分析与解决方案:
问题分析
- 换行符差异:不同操作系统(如 Windows、Linux、Mac OS)使用的换行符不同,Windows 使用
\r\n
,Linux 和 Mac OS 使用\n
。当你整段复制数据时,可能会引入不同的换行符,从而影响Scanner
对输入的解析。 - 输入缓冲区问题:整段复制输入时,输入缓冲区可能会有多余的换行符或空白字符,导致
Scanner
读取的数据不符合预期。
解决方案(BufferedReader!!!!)
- 使用
BufferedReader
替代Scanner
:BufferedReader
可以更灵活地处理整行输入,并且能避免Scanner
可能出现的一些输入处理问题。 - 手动处理换行符:在读取输入时,确保正确处理不同操作系统的换行符。
原来的代码:
package PTA_training.Test2_4;import java.util.Scanner;
/*
7-4 定义抽象类Person、派生类Student和类Teacher
设计抽象类Person,派生出具体类:学生类Student和教师类Teacher,
创建若干不同类对象后并在主方法中测试。
数据成员定义:
Person [ID,姓名,生日]
Student [专业,成绩]
Teacher [职称,工资]
带参构造方法分别为:
Person(int id,String name, int bir)
Student(int id,String name, int bir, String major,double score)
Teacher(int id,String name, int bir, String title, double salary)
toString方法
输入格式:
第一行整数n表示有n个对象,每个对象占2行,第一行为数字0(表示学生)或1(表示教师),第二行为生成对象的参数。
输出格式:
按行输出具体对象的信息。
输入样例:
在这里给出一组输入。例如:
5
0
10101 Peter 20010121 Computer 87.5
1
20110014 Crystal 19900103 AI 7000
0
10102 Rose 20010715 E-Commerce 90
1
20120019 David 19781218 Prof 12000
0
10103 Semon 20000405 Computer 88
输出样例:
在这里给出相应的输出。例如:
Student [id=10101, name=Peter, bir=20010121, major=Computer, score=87.5]
Teacher [id=20110014, name=Crystal, bir=19900103, title=AI, salary=7000.0]
Student [id=10102, name=Rose, bir=20010715, major=E-Commerce, score=90.0]
Teacher [id=20120019, name=David, bir=19781218, title=Prof, salary=12000.0]
Student [id=10103, name=Semon, bir=20000405, major=Computer, score=88.0]*/
public class Main {public static void main(String[] args) {Scanner scanner =new Scanner(System.in);int n = scanner.nextInt();scanner.nextLine();for (int i = 0; i < n ; i++) {int num = scanner.nextInt();scanner.nextLine();if(num == 0){String[]stuInfo = scanner.nextLine().split(" ");int id = Integer.parseInt(stuInfo[0]);String name = stuInfo[1];int bir = Integer.parseInt(stuInfo[2]);String major = stuInfo[3];double score = Double.parseDouble(stuInfo[4]);Student st = new Student(id,name,bir,major,score);System.out.println(st);}else if (num == 1){String[] teacherInfo = scanner.nextLine().split(" ");int id = Integer.parseInt(teacherInfo[0]);String name = teacherInfo[1];int bir = Integer.parseInt(teacherInfo[2]);String title = teacherInfo[3];double salary = Double.parseDouble(teacherInfo[4]);Teacher te = new Teacher(id, name, bir, title, salary);System.out.println(te);}}scanner.close();}
}
修改后:
package PTA_training.Test2_4;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class Main {public static void main(String[] args) {try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {// 读取对象的数量int n = Integer.parseInt(reader.readLine());for (int i = 0; i < n; i++) {// 读取表示对象类型的数字(0 表示学生,1 表示教师)int num = Integer.parseInt(reader.readLine());if (num == 0) {// 读取学生信息行String studentLine = reader.readLine();// 按空格分割学生信息行String[] studentInfo = studentLine.split(" ");try {// 解析学生信息int id = Integer.parseInt(studentInfo[0]);String name = studentInfo[1];int bir = Integer.parseInt(studentInfo[2]);String major = studentInfo[3];double score = Double.parseDouble(studentInfo[4]);// 创建学生对象Student st = new Student(id, name, bir, major, score);System.out.println(st);} catch (Exception e) {System.err.println("学生信息解析出错: " + studentLine);e.printStackTrace();}} else if (num == 1) {// 读取教师信息行String teacherLine = reader.readLine();// 按空格分割教师信息行String[] teacherInfo = teacherLine.split(" ");try {// 解析教师信息int id = Integer.parseInt(teacherInfo[0]);String name = teacherInfo[1];int bir = Integer.parseInt(teacherInfo[2]);String title = teacherInfo[3];double salary = Double.parseDouble(teacherInfo[4]);// 创建教师对象Teacher te = new Teacher(id, name, bir, title, salary);System.out.println(te);} catch (Exception e) {System.err.println("教师信息解析出错: " + teacherLine);e.printStackTrace();}}}} catch (IOException e) {e.printStackTrace();}}
}
笔试会成功吗,平时写代码是能自己写了,但是有点太依赖ide了,加油吧就算重修挂科也还有机会学会的....好!好!好!好!别乱想了多练。。。