使用==操作符比较命令行参数args[0]和字符串返回“Invalid type"
运行程序接收一个来自命令行的字符串参数(取值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"的更多相关文章
- golang-flag - 命令行参数解析
flag - 命令行参数解析 在写命令行程序(工具.server)时,对命令参数进行解析是常见的需求.各种语言一般都会提供解析命令行参数的方法或库,以方便程序员使用.如果命令行参数纯粹自己写代码解析, ...
- Python 处理脚本的命令行参数(二):使用click
安装click pip install click 使用步骤 使用@click.command() 装饰一个函数,使之成为命令行接口 使用@click.option() 等装饰函数,为其添加命令行选项 ...
- [C#学习笔记3]关于Main(string[ ] args)中args命令行参数
Main(string[] args)方法是C#程序的入口,程序从这里开始执行,在这里结束.C#代码逻辑要包含在一个类型(Type)中,游离的.全局的变量或函数是不存在的,这里的类型包括类(class ...
- C# 动态生成word文档 [C#学习笔记3]关于Main(string[ ] args)中args命令行参数 实现DataTables搜索框查询结果高亮显示 二维码神器QRCoder Asp.net MVC 中 CodeFirst 开发模式实例
C# 动态生成word文档 本文以一个简单的小例子,简述利用C#语言开发word表格相关的知识,仅供学习分享使用,如有不足之处,还请指正. 在工程中引用word的动态库 在项目中,点击项目名称右键-- ...
- Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数
特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数是$1,第二个参数是$2. $# 传递给脚本或函数的参数个数. $* 传 ...
- 【Shell脚本学习8】Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数
前面已经讲到,变量名只能包含数字.字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量. 例如,$ 表示当前Shell进程的ID,即pid,看下面的代码: $echo $$ 运 ...
- 【转】shell 教程——07 Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数
前面已经讲到,变量名只能包含数字.字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量. 例如,$ 表示当前Shell进程的ID,即pid,看下面的代码: $echo $$ 运 ...
- Shell特殊变量:$0 $# $* $@ $? $$和命令行参数
一.特殊变量表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数是$1,第二个参数是$2. $# 传递给脚本或函数的参数个数. $* ...
- linux bash Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数
在linux下配置shell参数说明 前面已经讲到,变量名只能包含数字.字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量. 例如,$ 表示当前Shell进程的ID,即pid ...
随机推荐
- MySQL更改命令行默认分隔符
MySQL命令行默认语句分隔符为分号 ; 使用DELIMITER命令可以更改默认分隔符 mysql> DELIMITER // 将默认分割符改为 //
- ningx.conf location
server { listen ; server_name localhost; location /dirName { alias "C:/Users/VALEB/Downloads/in ...
- C语言堆栈入门——堆和栈的区别(转)
一.预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其 操 ...
- 黄聪:C#中CefSharp的简单使用
C#中CefSharp的简单使用 https://blog.csdn.net/qq_26712977/article/details/78282995
- 用matalb、python画聚类结果图
用matlab %读入聚类后的数据, 已经分好级别了,例如前4行是亚洲一流, %-13是亚洲二流,-24是亚洲三流 a=xlsread('C:\Users\Liugengxin\Desktop\1.x ...
- listener.starting()源码探究
容器启动时,监听器调用starting方法,本质是找到匹配的监听器,广播事件,开始监听 上节对寻找匹配监听器做了分析,其是这个过程比较重要的部分,本文开始监听,反而不是那么复杂,如下: 找匹配监听器就 ...
- 【dbdiff】数据库比对工具安装
安装git 忽略 安装visual c++组件(和mysql workbench需要的一样) https://www.microsoft.com/en-us/download/details.aspx ...
- Spfa求最短路径
spfa求最短路径,其思想就是遍历每一个点,将没有入队的点入队,从这个点开始不断修改能够修改的最小路径,直到队空.不过这里一个点可以重复入队. 这个需要有存图的基础--------->前向星存图 ...
- Java Web组件Servlet、Filter、Listener
一.Servlet 类javax.servlet.http.HttpServlet; 1.是单例模式,一个web容器中只有一个实例.服务器调用它的service方法进行请求处理, service方法又 ...
- 2018-2019-2 20175328李欣颖实验二《Java面向对象程序设计》实验报告
2018-2019-2 20175328李欣颖实验二<Java面向对象程序设计>实验报告 面向对象程序设计-1 用程序解决问题时,要会写三种码: 1.伪代码 此处百分制转五分制: 如果成绩 ...