运行程序接收一个来自命令行的字符串参数(取值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. nginx ngx_http_image_filter_module 简单试用

    nginx包含了一个ngx_http_image_filter_module 模块,我们可以方便的进行图片的缩略图,平时一些简单的功能 已经够用了 环境准备 为了简单使用docker-compose ...

  2. Windows10 小闹钟

    Windows 10 自带小闹钟功能,便于我们进行时间管理,到点提醒. 尤其作为IT的工作者,首先要保证身体的健康,要定好休息的时间,哪怕5分钟,也能让人满血复活. 其次,便于我们将各种优先级的事务进 ...

  3. 我提出了一个 Lean Html 5 的 概念 和 标准

    提出 Lean Html 5 是因为 Html 可以作为 一个 应用程序 开发 的 标准 和 平台, 应用程序 包括 Web 程序 , 本地程序 , 桌面程序 , 嵌入式程序 , 串口通信 等 . L ...

  4. python ctypes库3_如何传递并返回一个数组

    可以将数组指针传递给dll,但无法返回数组指针,python中没有对应的数组指针类型. 如果需要返回数组,需借助结构体. 参考ctypes官方文档: https://docs.python.org/3 ...

  5. JavaScript 版本的 RSA加密库文件

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  6. jdk1.8源码解析(1):HashMap源码解析

    jdk1.8 HashMap数据结构 图1-HashMap类图 图2-TreeNode类图 由图1-HashMap类图可知HashMap底层数据结构是由一个Node<K,V>的数组构成.具 ...

  7. Optaplanner规划引擎的工作原理及简单示例(2)

    开篇 在前面一篇关于规划引擎Optapalnner的文章里(Optaplanner规划引擎的工作原理及简单示例(1)),老农介绍了应用Optaplanner过程中需要掌握的一些基本概念,这些概念有且于 ...

  8. 解决WCF“接收对 http://xxx.svc 的 HTTP 响应时发生错误。这可能是由于服务终结点绑定未使用 HTTP 协议造成的。这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致"

    最近在工作中新加了一个接口,本地调试的时候,直接抛出“接收对 http://xxx.svc 的 HTTP 响应时发生错误.这可能是由于服务终结点绑定未使用 HTTP 协议造成的.这还可能是由于服务器中 ...

  9. 3、redis使用场景

    现代高并发复杂系统面临的挑战 现代系统随着功能的复杂化,各种各样需求层出不穷,面对愈加复杂话的业务系统.越来越庞大的用户群体,以及用户对体验的要求越来越高,性能就变得更加重要. 抛开代码逻辑.服务器性 ...

  10. maven教程全攻略

    maven教程全攻略 我们在开发项目的过程中,会使用一些开源框架.第三方的工具等等,这些都是以jar包的方式被项目所引用,并且有些jar包还会依赖其他的jar包,我们同样需要添加到项目中,所有这些相关 ...