当前位置: 首页 > news >正文

java上机测试错题回顾(2)

坚持,坚持!(ง •_•)ง加油加油~!!!会进步的!

睡觉是最好的。。前几天有状况休息了一下,救命啊!java你怎么能6.18就考试了?!。。

救命啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!淡淡的相似。

1 我的编译器抽风了,为什么别的软件包的同名文件被运行了

你遇到的问题是不同包中的同名类被意外运行,这通常是由 Java 类路径(Classpath)的加载机制导致的。以下是可能的原因和解决方案:

可能的原因:

  1. 类路径冲突:当多个包中存在同名类时,Java 虚拟机(JVM)会按照类路径中指定的顺序查找类。如果其他包的路径排在你的包前面,JVM 会优先加载该类。
  2. 默认包问题:如果你的类没有声明包(即位于默认包中),而其他包中有同名类,可能会导致混淆。
  3. IDE 配置错误:IDE 可能错误地配置了类路径,导致加载了错误的类。
  4. 编译缓存:旧的编译文件可能被缓存,导致运行的不是最新代码。

解决方案:

  1. 明确指定包名:确保你的类正确声明了包名(如package PTA_training.Test2_2;)。
  2. 检查类路径:确认类路径中没有其他同名类的路径,或者调整顺序让你的包优先加载。
  3. 清理和重建项目:删除编译生成的.class文件,重新编译项目。
  4. 使用完整类名:在代码中使用完整的类名(包括包名)来引用类,避免歧义。
  5. 检查 IDE 设置:确保 IDE 正确配置了源路径和输出路径。

示例检查步骤:

  1. 确认你的Main类位于正确的目录结构中(例如src/PTA_training/Test2_2/Main.java)。
  2. 检查命令行编译和运行时是否指定了正确的类路径,例如:

    bash

    javac -d . Main.java  # 编译到当前目录的包结构中
    java PTA_training.Test2_2.Main  # 从根目录运行完整类名
    
  3. 如果使用 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();}
}
  1. 循环读取输入:借助 while (scanner.hasNextLine()) 循环来读取每一行输入,直至没有更多输入为止。
  2. 分割输入行:使用 line.split(" ") 把每一行输入按空格分割成字符串数组 parts
  3. 转换并检验负数:把 parts 数组里的每个字符串转换为 double 类型,存于 values 数组中。同时检查是否存在负数或零,若有则将 hasNegativeOrZero 标记设为 true
  4. 创建图形对象并计算周长:若没有负数或零,依据 parts 数组的长度创建对应的图形对象,然后调用 length() 方法计算周长。
  5. 异常处理:运用 try-catch 块捕获 NumberFormatException 异常,处理输入格式有误的情况,将周长设为 0。
  6. 输出结果:使用 System.out.printf("%.2f\n", perimeter) 输出周长,并且保留两位小数。

4 继承类之间的toString方法

当子类没有重写toString()方法时,会继承父类的实现。

当子类重写toString()方法时,可以选择完全替换父类的实现,或者通过super.toString()调用父类的实现并在此基础上进行扩展。

        //比如:return super.toString() + ", Mammal{isDomestic=" + isDomestic + "}";

这种模式使得toString()方法能够反映对象的完整状态,无论对象在继承层次结构中的位置如何。

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 替代 ScannerBufferedReader 可以更灵活地处理整行输入,并且能避免 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了,加油吧就算重修挂科也还有机会学会的....好!好!好!好!别乱想了多练。。。

http://www.xdnf.cn/news/676153.html

相关文章:

  • 万象生鲜配送系统 2025-05-23 更新日志
  • 使用新一代达梦管理工具SQLark,高效处理 JSON/XML 数据!
  • 多元一次不定方程
  • NGINX HTTP/2 全面指南开启、调优与实战
  • HTML常见事件详解:从入门到实战应用
  • OpenHarmony定制系统组合按键(一)
  • springBoot项目测试时浏览器返回406问题解决方案
  • iOS QQ抽屉式导航的实现
  • NIFI的性能调优
  • FilterAnalysis -滤波器分析
  • 用nz-tabel写一个合并表格
  • 利用机器学习优化数据中心能效
  • 深度学习实战109-智能医疗随访与健康管理系统:基于Qwen3(32B)、LangChain框架、MCP协议和RAG技术研发
  • 复杂度拆解
  • 程序环境与预处理
  • Cesium添加点、线、面
  • TF 卡 U1 和 U3 有什么区别?一文解析关键差异
  • SQL语句内容处理——给每行内容都添加单引号和逗号
  • 理解vue-cli 中进行构建优化
  • 【Elasticsearch】`_refresh`和`_flush`的区别
  • vue3+vite+amfe-flexible+postcss-pxtorem 实现全分辨率自适应
  • AI工具的选择:Dify还是传统工具?
  • 【C++】封装哈希表实现 unordered_map、unordered_set
  • 【Harmony OS】组件自定义属性、事件和状态管理
  • 【Webtrees 手册】第 9 章 - 开发指南
  • Mobaxterm 连接到 Docker 容器
  • 查询端口占用情况的命令(windows、linux)
  • Flink Table API 编程实战详解
  • IoT/HCIP实验-1/物联网开发平台实验Part2(HCIP-IoT实验手册版)
  • 数字人教师:开启教育智慧革新之旅