You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的核心问题

这个问题有两个关键原因:

  1. 提前获取Person属性导致值无效:你在BusTicket类初始化时就把age和gender的值存起来了,这时候Person的属性还没被设置(都是默认值:age=0,gender是空字符),后续计算逻辑完全走不对。得把属性获取移到calculateTotal方法内部,实时拿最新值。
  2. 未关联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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:17:47