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

BlueJ中如何让Scanner.next()返回任意类型?及字符串调用对象方法问题

解决Scanner字符串转自定义对象调用方法的问题

这个坑我之前踩过!你遇到的错误本质很简单:Scanner.next()返回的是字符串类型,而你直接把它赋值给testClass类型的变量,Java是强类型语言,这俩完全不是一回事,肯定会报类型不兼容的错。

要实现“输入对象名就调用对应对象方法”的需求,核心是建立字符串和已实例化对象之间的映射关系,下面给你两种实用的解决方案:

方案1:用HashMap做对象映射(推荐,扩展性好)

这种方式相当于给每个对象起个“别名”,把别名和对象存在一个字典里,输入别名后直接从字典里拿对象就行:

import java.util.HashMap;
import java.util.Scanner;

public class TestRunner {
    public static void main(String[] args) {
        // 先实例化你的三个testClass对象
        testClass object1 = new testClass();
        testClass object2 = new testClass();
        testClass object3 = new testClass();
        
        // 创建映射表:字符串(对象名) -> testClass实例
        HashMap<String, testClass> objectLookup = new HashMap<>();
        objectLookup.put("Object1", object1);
        objectLookup.put("Object2", object2);
        objectLookup.put("Object3", object3);
        
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入要调用的对象名:");
        String inputName = scanner.next();
        
        // 从映射表中获取对应的对象
        testClass targetObj = objectLookup.get(inputName);
        if (targetObj != null) {
            // 成功找到对象,调用方法
            targetObj.testMethod();
        } else {
            System.out.println("错误:不存在名为" + inputName + "的对象!");
        }
        
        scanner.close();
    }
}

要点说明:

  • 注意输入的字符串要和put时的键完全一致(Java大小写敏感,比如输入object1和Object1是两个不同的键)
  • 一定要加非空判断,不然输入不存在的名字时会抛出NullPointerException

方案2:用switch-case匹配(适合对象数量少的场景)

如果你的对象数量固定且很少,用switch-case也能实现,代码更直观:

import java.util.Scanner;

public class TestRunner {
    public static void main(String[] args) {
        testClass object1 = new testClass();
        testClass object2 = new testClass();
        testClass object3 = new testClass();
        
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入要调用的对象名:");
        String inputName = scanner.next();
        
        testClass targetObj = null;
        // 根据输入匹配对应的对象
        switch(inputName) {
            case "Object1":
                targetObj = object1;
                break;
            case "Object2":
                targetObj = object2;
                break;
            case "Object3":
                targetObj = object3;
                break;
            default:
                System.out.println("错误:无效的对象名!");
        }
        
        if (targetObj != null) {
            targetObj.testMethod();
        }
        
        scanner.close();
    }
}

核心逻辑总结

你不能让Java直接把字符串“变”成对象,必须自己提前把已有的对象和对应的字符串标签绑定好,输入字符串后通过绑定关系找到真实的对象,再调用方法——这是强类型语言里处理这类需求的通用思路。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:32:05