Java调用Attraction类构造器提示无法解析变量相关错误如何解决
错误原因分析
- 局部变量未初始化:Java要求方法内的局部变量必须明确赋值后才能使用,你声明的
guide、rating、storedActivities仅做了声明,只有switch的对应case分支会赋值,default分支和未命中的case分支不会为这些变量赋值,编译器无法确认变量在使用前一定有值,因此会报无法解析的错误。 - 数组下标越界:当用户输入
y进入对应case分支时,循环结束后counter的值等于storedActivities数组的长度,数组下标从0开始,此时访问storedActivities[counter]会直接抛出数组越界异常。 - 实体类字段不匹配:Attraction类中不存在
activities字段,构造器中this.activities = storedActivities属于字段名写错,且如果要存储多个活动,storedActivities字段应该为String[]数组类型,而不是单个String类型。 - 输入校验逻辑不完整:switch的default分支仅重新获取了一次用户输入,没有重新走对应的处理逻辑,用户输入错误后仍无法完成参数赋值。
- 语法笔误:代码中
sc.nextLine().to Lowercase()多了空格,正确写法为toLowerCase()。
修复方案
- 局部变量声明时直接赋予初始值,避免未初始化问题。
- 调整输入校验逻辑,用循环保证用户必须输入y/n才会进入后续处理。
- 修改Attraction类的
storedActivities字段为数组类型,匹配存储多个活动的需求,同时修正构造器内的字段赋值错误。 - 实例化Attraction时直接传递整个
storedActivities数组,符合仅使用单个数组的要求。
修复后完整代码
StageA类
import java.util.Scanner; public class StageA { private static final Scanner sc = new Scanner(System.in); public static void main(String[] args) { StageA stageA = new StageA(); stageA.runMenu(); } private void runMenu() { char selection; do { displayMenu(); selection = sc.nextLine().toLowerCase().charAt(0); processSelection(selection); } while (selection != 'x'); } private static void displayMenu() { System.out.printf("\n **** Ozzey Attraction Menu ****\n"); System.out.printf("A : Add New Attraction\n"); System.out.printf("B : View Attraction\n"); System.out.printf("C : List All Attractions\n"); System.out.printf("D : Sell Ticket\n"); System.out.printf("E : Refund Ticket\n"); System.out.printf("F : Remove Attraction\n"); System.out.printf("X : Exit\n\n"); System.out.printf("Enter selection : "); } private static void createAttraction() { System.out.printf("Enter attraction description : "); String description = sc.nextLine(); System.out.printf("Enter cost of a Ticket : "); double ticketCost = Double.parseDouble(sc.nextLine()); // 循环直到用户输入合法的y/n char chosen; while (true) { System.out.printf("Is this a supervised tour ? [Y/N] :\n"); chosen = sc.nextLine().toLowerCase().charAt(0); if (chosen == 'y' || chosen == 'n') { break; } System.out.printf("Please Enter valid answer \n"); } System.out.printf("What is maximum permitted tour group size?\n"); int maxGroupSize = Integer.parseInt(sc.nextLine()); System.out.printf("Enter the agency contact details:\n "); String contactDetails = sc.nextLine(); // 变量初始化 int counter = 0; String[] storedActivities = new String[0]; String guide = "", rating = ""; if (chosen == 'y') { System.out.printf("How many activity are there?\n"); int activities = Integer.parseInt(sc.nextLine()); while (activities < 1) { System.out.printf("Please enter valid number of activities great than zero \n"); System.out.printf("How many activity are there?\n"); activities = Integer.parseInt(sc.nextLine()); } storedActivities = new String[activities]; while (activities > counter) { System.out.printf("Please enter activity #%d: ", counter+1); storedActivities[counter] = sc.nextLine(); counter++; } } else { System.out.printf("Enter the instruction guide:\n"); guide = sc.nextLine(); System.out.printf("Enter the difficulty rating:\n"); rating = sc.nextLine(); } // 直接传整个数组,不需要取下标 Attraction attraction = new Attraction(description, ticketCost, maxGroupSize, contactDetails, chosen, guide, rating, storedActivities); // 后续可以加将attraction存入列表的逻辑 } private static void processSelection(char selection) { switch (selection) { case 'a': createAttraction(); break; case 'b': System.out.println("b"); break; case 'c': System.out.println("c"); break; case 'd': break; case 'e': System.out.println("e"); break; case 'f': System.out.println("f"); break; case 'x': System.out.println("Good Bye!"); break; default: System.out.println("Invalid input, try again\n"); } } }
Attraction类
public class Attraction { private String description, contactDetails, guide, rating; private double ticketCost; private int maxGroupSize; private char chosen; // 改为数组类型存储多个活动 private String[] storedActivities; public Attraction(String description, double ticketCost, int maxGroupSize, String contactDetails, char chosen, String guide, String rating, String[] storedActivities) { this.description = description; this.ticketCost = ticketCost; this.maxGroupSize = maxGroupSize; this.contactDetails = contactDetails; this.chosen = chosen; this.guide = guide; this.rating = rating; // 修正字段名错误 this.storedActivities = storedActivities; } // 可以按需添加getter、setter方法 }
内容的提问来源于stack exchange,提问作者Kevin Brown
相关产品推荐
相关产品推荐

