Java BusTicket金额计算异常及访问权限等测试失败问题求助
我来帮你搞定这些问题,咱们一步步拆解解决:
问题分析与修复方案
一、先解决三个测试用例失败的问题
Fail 1 - person的访问修饰符错误
在BusTicket类里,你声明的Person person是默认包级访问权限,不符合要求,直接改成private即可,这是封装的基础规范。
Fail 2 & Fail 3 - setPerson/getPerson方法签名不正确
你的BusTicket类里压根没这两个方法,得补上符合要求的版本:
setPerson:用public修饰,返回void,参数是Person对象getPerson:用public修饰,返回Person对象,无参数
二、解决TotalAmount始终为0.0的核心问题
这个问题有两个关键原因:
- 提前获取Person属性导致值无效:你在
BusTicket类初始化时就把age和gender的值存起来了,这时候Person的属性还没被设置(都是默认值:age=0,gender是空字符),后续计算逻辑完全走不对。得把属性获取移到calculateTotal方法内部,实时拿最新值。 - 未关联Person到BusTicket,也没调用计算方法:你在
main里创建了Person对象,但没把它绑定到BusTicket上,而且从头到尾没调用calculateTotal方法,总金额自然一直是默认的0.0。
修改后的完整代码
Person.java
public class Person { private String name; private char gender; private int age; public void setName(String name ){ this.name = name; } public void setGender(char gender){ this.gender = gender ; } public void setAge(int age ){ this.age = age; } public String getName(){ return this.name; } public char getGender(){ return this.gender; } public int getAge(){ return this.age; } }
BusTicket.java
public class BusTicket { private int ticketNo; private float ticketPrice; private float totalAmount; // 修正:改为private访问修饰符 private Person person = new Person(); // 添加符合要求的setPerson方法 public void setPerson(Person person) { this.person = person; } // 添加符合要求的getPerson方法 public Person getPerson() { return this.person; } public void setTicketNo(int ticketNo){ this.ticketNo = ticketNo; } public void setTicketPrice(float ticketPrice){ this.ticketPrice = ticketPrice; } public void setTotalAmount(float totalAmount){ this.totalAmount = totalAmount; } public void calculateTotal() { // 修正:在方法内实时获取Person的最新属性 int age = person.getAge(); char gender = person.getGender(); if(age < 16) { totalAmount = ticketPrice / 2; } else if(age >= 60) { totalAmount = (3 * ticketPrice) / 4; } else if(gender == 'f' || gender == 'F') { totalAmount = (9 * ticketPrice) / 10; } else { totalAmount = ticketPrice; } } public int getTicketNo(){ return this.ticketNo; } public float getTicketPrice(){ return this.ticketPrice; } public float getTotalAmount(){ return this.totalAmount; } }
TestMain.java
import java.util.Scanner; public class TestMain { public static BusTicket getTicketDetails() { Scanner sc = new Scanner(System.in); BusTicket bt = new BusTicket(); System.out.println("Enter the ticket no:"); bt.setTicketNo(sc.nextInt()); System.out.println("Enter the ticket price:"); bt.setTicketPrice(sc.nextFloat()); return bt; } public static void main (String[] args) { Scanner sc = new Scanner(System.in); Person p = new Person(); BusTicket bt; System.out.println("Enter the passenger name:"); p.setName(sc.nextLine()); System.out.println("Enter the gender(M or F/ m or f):"); p.setGender(sc.next().charAt(0)); System.out.println("Enter the age:"); p.setAge(sc.nextInt()); bt = getTicketDetails(); // 修正:将Person对象绑定到BusTicket bt.setPerson(p); // 修正:调用计算方法生成总金额 bt.calculateTotal(); System.out.println("Ticket no:" + bt.getTicketNo()); System.out.println("Passenger Name:" + bt.getPerson().getName()); System.out.println("Price of a ticket : " + bt.getTicketPrice()); System.out.println("Total Amount : " + bt.getTotalAmount()); } }
另外提个小细节:如果后续有nextInt()之后调用nextLine()的场景,记得处理遗留的换行符(比如加一句sc.nextLine()),避免读取空字符串。
内容的提问来源于stack exchange,提问作者Utkarsh Goyal
相关产品推荐
相关产品推荐

