运行程序接收一个来自命令行的字符串参数(取值1,2,3,4),根据参数执行对应语句块。

由于未能判断字符串内容是否相同导致代码if语句块代码失效,怎么也看不到schedule方法的效果,

以下是错误代码:

/*
* DemoTimer.java -- JDK 1.8
*/ package timer; import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask; /**
* Description:
* <p>
* <p>
* @author unascribed
* @date 2019-04-01 Mon PM 13:55:59
*/ public class DemoTimer {
public static void main(String[] args) {
// 1.创建一个Timer实例,关联线程不能是daemon(守护/后台)线程
Timer timer = new Timer();
// 2.创建一个MyTimerTask实例
DemoTimerTask myTimerTask = new DemoTimerTask("No.1");
// 3.通过Timer定时定频率调用myTimerTask的业务代码
// 如第一次执行是在当前的两秒之后,之后每个一秒执行一次
// timer.schedule(myTimerTask, 2000L, 1000L); Calendar calendar = Calendar.getInstance(); // 通过静态工厂方法创建Calendar实例
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 定义日期格式
System.out.println("Current time is : " + sdf.format(calendar.getTime())); // 在schedule调度任务之前输出当前时间
calendar.add(Calendar.SECOND, 3); // 当前时间加3秒 String s = args[0]; if (s == "1") {
myTimerTask.setName("schedule1");
timer.schedule(myTimerTask, calendar.getTime());
} else if (s == "2")) {
myTimerTask.setName("schedule2");
timer.schedule(myTimerTask, calendar.getTime(), 2000);
} else if (s == "3")) {
myTimerTask.setName("schedule3");
timer.schedule(myTimerTask, 3000);
} else if (s == "4")) {
myTimerTask.setName("schedule4");
timer.schedule(myTimerTask, 3000, 2000);
} else { }
}
} class DemoTimerTask extends TimerTask { String name; // 任务名 public DemoTimerTask(String name) {
this.name = name;
} @Override
public void run() {
// 以yyyy-MM-dd HH:mm:ss打印执行时间
// 如 2016-11-11 00:00:00
Calendar calendar = Calendar.getInstance(); // 通过静态工厂方法创建Calendar实例
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 定义日期格式
System.out.println("Current time is : " + sdf.format(calendar.getTime()));
// 打印当前name的内容
System.out.println("Current exec name is : " + name);
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}
  • 尝试一

    • 首先想到是不是引用的问题,这里传递了一份引用:
String s = args[0];

于是删去变量s,将下面语句中原来的s变量全部替换成args[0],但是这是无效的。

  • 实际上,变量引用再一个方法的作用域内是没错,测试以下代码:
    @Test
public void test() {
String s = "1"; // L1
// String s = new String("1"); // L2
String t = s;
System.out.println(s == t);
}

L1或L2的测试返回值都为true,说明t对s的引用拿到了s的真实地址,排除变量引用使用不当的可能性。

  • 再构造一个案例:
    @Test
public void test() {
String[] arr = {"1"};
String t = arr[0];
System.out.println(t == "1");
}

测试结果为true,也排除了代码块内部数组干扰的可能性。

  • 最后mock了以下args的形式,模仿错误代码编写,传入数组String[] s = {"1"}
public class DemoTimer {
public static void main(String[] args) {
String[] s = {"1"};
DemoTimer demoTimer = new DemoTimer();
demoTimer.test1(s);
DemoTimer.test2(s);
DemoTimer.test3(s);
} public void test1(String[] arr) {
System.out.println(arr[0] == "1"); // 预期true,实际true
} public static void test2(String[] arr) {
System.out.println(arr[0] == "1"); // 预期true, 实际true
} }

至此,彻底断了使用==的念想。

  • 尝试二

    既然是比较内容是否相同,那么自然会想到用equals()方法。

注意:equals()方法是从Object类继承的,String重写了她。

        if (s.equals("1")) {
myTimerTask.setName("schedule1");
timer.schedule(myTimerTask, calendar.getTime());
} else if (s.equals("2")) {
myTimerTask.setName("schedule2");
timer.schedule(myTimerTask, calendar.getTime(), 2000);
} else if (s.equals("3")) {
myTimerTask.setName("schedule3");
timer.schedule(myTimerTask, 3000);
} else if (s.equals("4")) {
myTimerTask.setName("schedule4");
timer.schedule(myTimerTask, 3000, 2000);
}

这样写,代码不再是Dead Code了。

总结

使用==操作符比较命令行参数args[0]和字符串返回“Invalid type"的更多相关文章

  1. golang-flag - 命令行参数解析

    flag - 命令行参数解析 在写命令行程序(工具.server)时,对命令参数进行解析是常见的需求.各种语言一般都会提供解析命令行参数的方法或库,以方便程序员使用.如果命令行参数纯粹自己写代码解析, ...

  2. Python 处理脚本的命令行参数(二):使用click

    安装click pip install click 使用步骤 使用@click.command() 装饰一个函数,使之成为命令行接口 使用@click.option() 等装饰函数,为其添加命令行选项 ...

  3. [C#学习笔记3]关于Main(string[ ] args)中args命令行参数

    Main(string[] args)方法是C#程序的入口,程序从这里开始执行,在这里结束.C#代码逻辑要包含在一个类型(Type)中,游离的.全局的变量或函数是不存在的,这里的类型包括类(class ...

  4. C# 动态生成word文档 [C#学习笔记3]关于Main(string[ ] args)中args命令行参数 实现DataTables搜索框查询结果高亮显示 二维码神器QRCoder Asp.net MVC 中 CodeFirst 开发模式实例

    C# 动态生成word文档 本文以一个简单的小例子,简述利用C#语言开发word表格相关的知识,仅供学习分享使用,如有不足之处,还请指正. 在工程中引用word的动态库 在项目中,点击项目名称右键-- ...

  5. Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数

    特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数是$1,第二个参数是$2. $# 传递给脚本或函数的参数个数. $* 传 ...

  6. 【Shell脚本学习8】Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数

    前面已经讲到,变量名只能包含数字.字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量. 例如,$ 表示当前Shell进程的ID,即pid,看下面的代码: $echo $$ 运 ...

  7. 【转】shell 教程——07 Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数

    前面已经讲到,变量名只能包含数字.字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量. 例如,$ 表示当前Shell进程的ID,即pid,看下面的代码: $echo $$ 运 ...

  8. Shell特殊变量:$0 $# $* $@ $? $$和命令行参数

    一.特殊变量表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数是$1,第二个参数是$2. $# 传递给脚本或函数的参数个数. $* ...

  9. linux bash Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数

    在linux下配置shell参数说明 前面已经讲到,变量名只能包含数字.字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量. 例如,$ 表示当前Shell进程的ID,即pid ...

随机推荐

  1. re正则匹配城市名

    匹配城市名称,只要第一次出现之后的数据 import re a='巴州区白云县台公交乡公司对面区海蜃楼6楼' b=re.search(r'(^\w+?区)|(^\w+?县)|(^\w+?镇)',a). ...

  2. ASP.NET MVC中,动态处理页面静态化 【转载】

    首先解释一下什么是动态处理页面静态化 对于需要静态化的页面,第一次访问某个Action时,会先执行Action,并在页面渲染后向Response和服务器中网站的目录下都写入需要返回的html,而第二次 ...

  3. Angular2+AngularJS

    AngularJS 系列: 1.angular.module 的定义 var mapApp = angular.module("positionSalaryEditApp",[&q ...

  4. EF提示“序列化类型为XXX的对象时检测到循环引用”

    能看到这个标题 ,我就用解释原因,网上很多,我只给大家一个解决方案会: public <#=code.Escape(entity)#> ToPOCO() { return new < ...

  5. Vue+Typescript项目中使用echarts

    方案一:推荐 在typescript+Vue的项目中引用echarts,为了加强引用,引入echarts和@types/echarts两个包,一个是工程依赖,一个是声明依赖. npm install ...

  6. Windows自定义运行命令

    1 打开注册表regedit 2 找到:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths 3 新增项,自己运 ...

  7. mac下常用命令

    常用命令 ls 查看当前目录下的文件 cd 进入某目录 . cd - 跳转回前一目录 . cd ~ 进入当前用户个人目录 pwd 输出当前所在路径 mkdir 新建文件夹. touch 新建文件 fi ...

  8. quartz 使用问题,小坑

    1.quartz时区 ITrigger trigger1 = TriggerBuilder.Create() .WithIdentity(triggerName, group).StartNow()  ...

  9. Retrofit 下载网络图片 保存到本地

    private void downImage(String imagePath) { try { CommonV2Api.downloadFile(mContext, imagePath, new I ...

  10. Submine Text3格式化HTML/CSS/JS代码

    Submine Text3格式化HTML/CSS/JS代码需要安装插件,步骤如下: 1.打开菜单--->首选项---->Package Control,输入 install package ...