使用==操作符比较命令行参数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 ...
随机推荐
- Yii2 使用 QQ 和 Weibo 第三方登录源码
我们社区在 yii2-authclient 多次升级后,登录异常.一直想寻求一种通用的方法,尽量不重写 OAuth2, BaseOAuth 以及 OAuthToken 类, 所以本次直接在 initU ...
- C# 控件消失等问题
控件消失原因: 1.新控件的触发导致页面重载,该重载有没有达到原有控件的触发状态进而消失. 2.(目前只发现这一点,后续又发现再更...) 1.示例: ASPX: <div> <!- ...
- php在laravel中使用自定义的Common类
众所周知,laravel是一款高度集成的开发框架,框架内置非常多的操作方法,从而保证了我们的开发效率.但是在日常中为了满足我们的个性化业务,也需要自己去编写工具类,在laravel中我们完成编写后还需 ...
- 一些关于three.js的摘抄笔记
加载多个geometry的方式: (可以利用three.js自带convert_obj_three.py文件将obj文件转换成json文件) function loadModel() { loader ...
- Virtualbox扩展硬盘
动态调整 1.VBoxManage showhdinfo win10.vdi 2.VBoxManage modifyhd win10.vdi --resize 61200 3.磁盘管理器中分配空间并格 ...
- 新手必备|常见30种NLP任务的练手项目(文末福利)
1.分词 Word Segmentationchqiwang/convseg ,基于CNN做中文分词,提供数据和代码. 2.词预测 Word PredictionKyubyong/word_predi ...
- 修改Linux主机名
如果安装时没有设置,一般默认主机名为localhost.localdomain. 通过以下方式修改成自己设置的主机名: 1. vi /etc/sysconfig/network NETWORKING= ...
- Sping Cloud项目启动报A component required a bean of type 'com.tianyan.bbc.dao.SecurityUserBaseMapper' that could not be found.
项目构建正常,启动和Debug报以下错误: Error starting ApplicationContext. To display the conditions report re-run you ...
- 贝叶斯、朴素贝叶斯及调用spark官网 mllib NavieBayes示例
贝叶斯法则 机器学习的任务:在给定训练数据A时,确定假设空间B中的最佳假设. 最佳假设:一种方法是把它定义为在给定数据A以及B中不同假设的先验概率的有关知识下的最可能假设 贝叶斯理论提供了 ...
- 记录一次 “ORA-12516:TNS:监听程序找不到符合协议堆栈要求的可用处理程序” 的处理过程
一.今天同事反馈业务化运行的数据中心库发生了oracle无法连接的情况,导致所有业务系统无法正常运作的问题.报:“ORA-12516:TNS:监听程序找不到符合协议堆栈要求的可用处理程序” 二.收到这 ...