Java小白学习记录:java在cmd中错误: 需要class, interface或enum

本文记录了一位Java初学者遇到的问题:在创建Java源文件时,由于使用了特定的文本编辑器保存文件,导致文件头部出现了BOM(字节顺序标记),这使得Java编译器无法正确识别源代码,最终通过调整文件编码格式解决了问题。

  第一天学习java,按照书中打下了第一个Java的Helloword:

public class Helloword
{
   public static void main(String args[])
   {
    System.out.println("Welcome to Java!");
   }
}

之后想换个长句来输入,于是上网搜索了《Get Lucky——Daft Punk / Pharrell Williams / Nile Rodgers》

然后新建一个 .java文件,copy之前写好的Helloword,直接更改println后的内容,直接将歌词复制在其中

public class Get Lucky
{
   public static void main(String args[])
   {
    System.out.println("歌曲名:Get Lucky
歌手:Daft Punk&Pharrell Williams
专辑:Random Access Memories
Get Lucky
Daft Punk,Pharrell Williams
Like the legend of the phoenix
All ends with beginnings
What keeps the planet spinning (uh)
The force of love beginning
(Look)
We've come too far to give up who we are
So let's raise the bar and our cups to the stars
She's up all night 'til the sun
I'm up all night to get some
She's up all night for good fun
I'm up all night to get lucky
We're up all night 'til the sun
We're up all night to get some
We're up all night for good fun
We're up all night to get lucky
We're up all night to get lucky");
   }
}

很明显这段代码看起来都是错误的,但是抱着试一试态度,还是在cmd上面输入了 “Get Lucky.java”

直接找不到文件

那就是在cmd中,无法识别名称中带有空格的.java

改了名字后,再次输入

好吧,在("XX")中无法加入段落

之后将所有的段落都合并成一句,再次cmd javac一下

出现了错误:需要class, interface或enum

之后百度了一下,是因为在写txt文件的时候,出现了所谓的BOM(byte-order mark),然后使用Windows自带的记事本将文件保存为UTF-8编码的时候,记事本会自动在文件开头插入BOM(代码生成txt文件并且将编码格式设置为utf-8他会自动在第一个字符前面产生一个被称作bom的标识。  用来标记这个txt文档是utf-8语言。)

其实就是,原本默认的txt编码格式应该是ANSI,然而在创建GetLucky.java的编码格式成为了UTF-8,导致文本中存在BOM,java源代码中不可以有BOM,javac无法识别,会出现乱码 。

(txt文本的另存为中右下角可以选择编码格式)

之后删除原来的GetLucky.java后,重新新建一个,就没有出现了这种问题,由此写下这篇博客记录下这个学习问题。

//

BOM(byte-order mark),即字节顺序标记,它是插入到以UTF-8、UTF16或UTF-32编码Unicode文件开头的特殊标记,用来识别Unicode文件的编码类型。对于UTF-8来说,BOM并不是必须的,因为BOM用来标记多字节编码文件的编码类型和字节顺序(big-endian或little-endian)。在绝大多数编辑器中都看不到BOM字符,因为它们能理解Unicode,去掉了读取器看不到的题头信息。若要查看某个Unicode文件是否以BOM开头,可以使用十六进制编辑器。下表列出了不同编码所对应的BOM。

UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码,由Ken Thompson于1992年创建。UTF-8用1到6个字节编码Unicode字符。用在网页上可以统一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。

参考资料查询来源:https://zhidao.baidu.com/question/812758169879129972.html

                                https://zhidao.baidu.com/question/1514344679698482740.html

                                https://blog.youkuaiyun.com/white_idiot/article/details/54670243

                                https://bbs.youkuaiyun.com/topics/390110799

万分感谢!!!

<think>嗯,用户问的是Java如何通过传入值来判断执行哪条指令。首先,我需要理解用户的需求。他们可能有一个需要根据不同的输入值执行不同操作的场景,比如命令行工具中的参数解析,者状态机中的状态切换。 首先,我应该考虑基本的条件语句。比如使用if-else者switch-case结构。这是最直接的方法,适用于简单的判断逻辑。比如,当传入的值是1时执行A操作,是2时执行B操作,依此类推。这时候,我需要提醒用户注意处理默认情况,也就是当传入的值不匹配任何条件时应该怎么办,可能需要抛出异常者执行默认操作。 不过,如果传入的值有很多种可能性,者逻辑比较复杂,使用大量的if-else可能会让代码难以维护。这时候,用户可能需要更优雅的解决方案。比如,使用策略模式。策略模式允许定义一系列算法,并将每个算法封装起来,使它们可以互相替换。这样,用户可以通过传入的值选择对应的策略类来执行具体的操作。这种方法提高了代码的可扩展性和可维护性,尤其是在需要频繁添加新指令的情况下。 另外,用户可能对反射机制感兴趣。Java的反射可以在运行时根据类名方法名动态调用方法。例如,传入的值对应某个方法名,然后通过反射调用该方法。这种方法虽然灵活,但需要注意安全性和性能问题。反射调用比直接调用慢,而且可能会引发安全异常,特别是在受限制的环境下。 还有枚举类型也是一个不错的选择。Java的枚举可以关联具体的行为,每个枚举常量可以实现一个共同的接口,这样可以根据传入的枚举值直接调用相应的方法。这种方式既安全又清晰,适合预先定义好所有可能指令的情况。 接下来,用户可能需要具体的示例代码来理解这些方法。比如,使用switch-case的例子,策略模式的类结构,反射调用的步骤,以及枚举的应用。同时,要提醒用户考虑异常处理,比如无效的传入值,者反射时找不到对应的方法。 可能用户的实际应用场景是什么?比如,他们是在开发一个命令行工具,还是一个有复杂业务逻辑的应用程序?如果是前者,可能需要更简单的条件判断;如果是后者,设计模式会更合适。此外,用户可能关心性能问题,尤其是在高频调用的场景下,反射可能不是最佳选择。 另外,是否需要考虑扩展性?如果未来会频繁添加新的指令,策略模式枚举扩展起来更方便。而使用if-else者switch-case则需要每次修改判断逻辑,容易出错。 最后,总结各种方法的优缺点,帮助用户根据具体需求选择最合适的实现方式。比如,简单场景用条件语句,复杂可扩展场景用策略模式枚举,需要动态调用时用反射,但要注意权衡利弊。</think>在Java中,通过传入值判断执行指令的典型实现方式可以分为以下步骤,结合代码示例说明: 1. **基础条件判断法** 使用`if-else``switch-case`直接匹配值: ```java public void executeCommand(int commandCode) { if (commandCode == 1) { System.out.println("执行指令A:启动服务"); } else if (commandCode == 2) { System.out.println("执行指令B:停止服务"); } else { throw new IllegalArgumentException("无效指令"); } } ``` 2. **策略模式(推荐扩展场景)** 当指令逻辑复杂时,通过接口抽象行为: ```java // 1. 定义策略接口 interface Command { void execute(); } // 2. 实现具体策略类 class StartCommand implements Command { @Override public void execute() { System.out.println("执行启动逻辑"); } } // 3. 策略工厂类 class CommandFactory { public static Command getCommand(int code) { switch(code) { case 1: return new StartCommand(); case 2: return new StopCommand(); default: throw new IllegalArgumentException(); } } } // 调用示例 Command cmd = CommandFactory.getCommand(inputCode); cmd.execute(); ``` 3. **枚举映射法** 利用枚举类型绑定行为: ```java enum Command { START(1) { @Override void execute() { System.out.println("启动"); } }, STOP(2) { @Override void execute() { System.out.println("停止"); } }; private final int code; Command(int code) { this.code = code; } static Command fromCode(int code) { for (Command cmd : values()) { if (cmd.code == code) return cmd; } throw new IllegalArgumentException(); } abstract void execute(); } // 调用示例 Command.fromCode(inputCode).execute(); ``` 4. **反射机制(动态扩展)** 通过类名/方法名动态调用(慎用): ```java public void dynamicExecute(String methodName) throws Exception { Method method = this.getClass().getMethod(methodName); method.invoke(this); } // 定义具体方法 public void start() { System.out.println("反射调用启动"); } ``` **实现选择建议**: - 简单场景(指令少):优先用`switch-case`枚举 - 高频修改场景:使用策略模式解耦 - 动态指令需求:反射(需处理`NoSuchMethodException`等异常) - 线程安全要求:结合单例模式管理策略对象 **注意事项**: 1. 必须校验输入合法性,防御无效参数 2. 若涉及敏感操作,需增加权限校验层 3. 策略模式推荐通过依赖注入管理对象生命周期 4. 反射调用需注意性能损耗(可缓存`Method`对象)
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值