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

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()。
修复方案
  1. 局部变量声明时直接赋予初始值,避免未初始化问题。
  2. 调整输入校验逻辑,用循环保证用户必须输入y/n才会进入后续处理。
  3. 修改Attraction类的storedActivities字段为数组类型,匹配存储多个活动的需求,同时修正构造器内的字段赋值错误。
  4. 实例化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 20:45:03