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

Java菜单式月度租金发票程序调用showInvoice函数无输出问题求助

问题排查与修复方案

我来帮你定位这个问题,你遇到的showInvoice()无输出的核心原因和优化建议如下:

1. 最直接的问题:没有打印showInvoice()的返回结果

看你的Tester类的main方法,你只是调用了myInvoice.showInvoice();,但这个方法是返回一个字符串,并没有主动输出内容到控制台。程序执行到这里只是计算出了结果但没有打印,所以看起来像没有输出直接终止了。

修复方法很简单,把调用改成打印语句:

public static void main(String[] args) {
    InvoicerHub myInvoice = new InvoicerHub();
    myInvoice.generateInvoice(myInvoice);
    // 打印showInvoice返回的结果
    System.out.println(myInvoice.showInvoice());
}

2. 不必要的类继承,可能导致潜在问题

你的InvoicerHub继承了BudgetInvoice,但实际上InvoicerHub是用来管理多个BudgetInvoice的容器类,它本身并不是一个发票对象,这种继承不符合面向对象的设计原则,还会继承到BudgetInvoice里不必要的成员(比如那个myScan Scanner对象)。

建议去掉继承关系,修改InvoicerHub的定义:

import java.util.ArrayList;
import java.util.Scanner; // 自己导入Scanner

public class InvoicerHub { // 去掉extends BudgetInvoice
    protected ArrayList<BudgetInvoice> InvoiceHub ;
    private Scanner myScan = new Scanner(System.in); // 把Scanner放在这里,或者在方法里创建

    public InvoicerHub() {
        InvoiceHub = new ArrayList<BudgetInvoice>();
    }

    // ... 其他方法保持不变,除了不再依赖父类的myScan
}

3. 类成员级别的Scanner可能引发的问题

你的BudgetInvoice类里定义了Scanner myScan = new Scanner(System.in);作为成员变量,这是不合理的:一个发票对象不需要关联一个输入流,而且多个对象共享(或重复创建)Scanner可能导致输入异常、资源无法释放等问题。

建议把Scanner的创建移到需要输入的方法内部,比如generateInvoice方法里:

public void generateInvoice () { // 这里参数也不需要,因为你没有用到传入的BudgetInvoice b
    Scanner myScan = new Scanner(System.in); // 方法内部创建Scanner
    System.out.println("Enter your Monthly Rent");
    double rent = myScan.nextDouble();
    // ... 后续输入逻辑不变
    myScan.close(); // 方法结束后关闭Scanner,避免资源泄漏
}

另外注意你的generateInvoice方法的参数BudgetInvoice b其实没有被使用,可以直接去掉这个参数,让方法更简洁。

4. 优化toString()方法(可选)

BudgetInvoice的toString()里把myScan也输出了,这会打印出Scanner的内存地址,没有实际意义,建议修改toString()方法去掉这个部分:

@Override // 加上@Override注解,明确是重写父类方法
public String toString() {
    return "BudgetInvoice [monthlyRent=" + monthlyRent + ", waterBill=" + waterBill + 
           ", energyBill=" + energyBill + ", carRent=" + carRent + ", internetRent=" + internetRent + 
           ", invoiceID=" + invoiceID + "]";
}

按照以上步骤修改后,你就能正常看到发票的输出内容了。

内容的提问来源于stack exchange,提问作者user16118696

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 20:57:29