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

