黑马程序员技术交流社区
标题:
IO流问题
[打印本页]
作者:
黑马罗坚
时间:
2012-5-4 23:50
标题:
IO流问题
/**
*求任意年的2月多少天
*求昨天的年月日
*/
public class CalendarDemo {
static int count;
public static void main(String[] args) {
int year=input();
sop(year+"年2月有"+countDay(year)+"天");
sop(getDay());
}
public static int input(){
sop("请输入年份");
int year=-1;
while(true){
Scanner sn=new Scanner(System.in);
try{
year=sn.nextInt();
sn.close();
break;
}catch(Exception e){
sop("输入有误,请重新输入");
// input();
}
}
return year;
}
public static String getDay(){
// String[] week={"","星期天","星期一","星期二",
// "星期三","星期四","星期五","星期六"};
// Calendar cd=Calendar.getInstance();
//
// return new StringBuilder().append(cd.get(Calendar.YEAR)+"年")
// .append(cd.get(Calendar.MONTH)+1+"月")
// .append(cd.get(Calendar.DAY_OF_MONTH)+"日")
// .append(week[cd.get(Calendar.DAY_OF_WEEK)])
// .append(cd.get(Calendar.HOUR_OF_DAY)+"点")
// .append(cd.get(Calendar.MINUTE)+"分")
// .append(cd.get(Calendar.SECOND)+"秒")
// .toString();
Calendar cd=Calendar.getInstance();
cd.add(Calendar.DAY_OF_MONTH, -1);
Date dt=cd.getTime();
DateFormat df=new SimpleDateFormat("yyyy年MM月dd日 E HH:mm:ss");
return df.format(dt);
}
复制代码
把input方法修改成以下几种地一次输入英文为什么死循环哦?
public static int input(){
sop("请输入年份");
int year=-1;
Scanner sn=new Scanner(System.in);
while(true){
try{
/*都输入整数时 下面2条语句没问题证明Scanner对象可以多次接收
* 控制台输入 为什么把Scanner对象声明放在循环外面地一次输英文后面输数字就死循环了?
*/
year=sn.nextInt();
year=sn.nextInt();
// sn.close();
break;
}catch(Exception e){
sop("输入有误,请重新输入");
// input();
}
}
return year;
}
复制代码
结果 每次执行到year=sn.nextInt();报异常
public static int input(){
int year=-1;
count++;
while(true){
try{
Scanner sn=new Scanner(System.in);
sop("请输入年份");
year=sn.nextInt();
sn.close(); //为什么不把这条语句注释会无限递归哦
break;
}catch(Exception e){
sop("输入有误,请重新输入");
input();
}
}
sop(count);
return year;
}
复制代码
结果:
请输入年份
sdf
输入有误,请重新输入
请输入年份
2
2
请输入年份
输入有误,请重新输入
请输入年份
输入有误,请重新输入
请输入年份
输入有误,请重新输入
请输入年份
输入有误,请重新输入
Exception in thread "main" java.lang.StackOverflowError
at java.util.regex.Pattern.group0(Unknown Source)
at java.util.regex.Pattern.sequence(Unknown Source)
at java.util.regex.Pattern.expr(Unknown Source)
public static int input(){
int year=-1;
count++;
Scanner sn=new Scanner(System.in);
while(true){
try{
sop("请输入年份");
year=sn.nextInt();
sn.close();
break;
}catch(Exception e){
sop("输入有误,请重新输入");
input();
}
}
sop(count);
return year;
}
复制代码
为什么注释了sn.close();老是重新接受键盘输入 不注释结果
Start
请输入年份
输入有误,请重新输入
Start
请输入年份
输入有误,请重新输入
Start
请输入年份
输入有误,请重新输入
..........
Start
请输入年份
输入有误,请重新输入
作者:
hongjiqiao
时间:
2012-5-5 02:15
坐沙发喽。。。。你比我学得那么快,。。。高人
作者:
邓飞飞
时间:
2012-5-5 07:49
/**
*求任意年的2月多少天
*求昨天的年月日
*/
public class CalendarDemo {
static int count;
public static void main(String[] args) {
int year=input();
sop(year+"年2月有"+countDay(year)+"天");
sop(getDay());
}
public static int input(){
sop("请输入年份");
int year=-1;
while(true){
Scanner sn=new Scanner(System.in);
try{
year=sn.nextInt();
sn.close();
break;
}catch(Exception e){
sop("输入有误,请重新输入");
// input();
}
}
return year;
}
public static String getDay(){
// String[] week={"","星期天","星期一","星期二",
// "星期三","星期四","星期五","星期六"};
// Calendar cd=Calendar.getInstance();
//
// return new StringBuilder().append(cd.get(Calendar.YEAR)+"年")
// .append(cd.get(Calendar.MONTH)+1+"月")
// .append(cd.get(Calendar.DAY_OF_MONTH)+"日")
// .append(week[cd.get(Calendar.DAY_OF_WEEK)])
// .append(cd.get(Calendar.HOUR_OF_DAY)+"点")
// .append(cd.get(Calendar.MINUTE)+"分")
// .append(cd.get(Calendar.SECOND)+"秒")
// .toString();
Calendar cd=Calendar.getInstance();
cd.add(Calendar.DAY_OF_MONTH, -1);
Date dt=cd.getTime();
DateFormat df=new SimpleDateFormat("yyyy年MM月dd日 E HH:mm:ss");
return df.format(dt);
}
复制代码
把input方法修改成以下几种地一次输入英文为什么死循环哦?
public static int input(){
sop("请输入年份");
int year=-1;
Scanner sn=new Scanner(System.in);
while(true){
try{
/*都输入整数时 下面2条语句没问题证明Scanner对象可以多次接收
* 控制台输入 为什么把Scanner对象声明放在循环外面地一次输英文后面输数字就死循环了?
*/
year=sn.nextInt();//nextInt 读的是基本类型的数据,一次读一个int类型的整数。更深入的我就不知道了....................
year=sn.nextInt();
// sn.close();
break;
}catch(Exception e){
sop("输入有误,请重新输入");
// input();
}
}
return year;
}
复制代码
结果 每次执行到year=sn.nextInt();报异常
public static int input(){
int year=-1;
count++;
while(true){
try{
Scanner sn=new Scanner(System.in);
sop("请输入年份");
year=sn.nextInt();
sn.close(); //为什么不把这条语句注释会无限递归哦
break;
}catch(Exception e){
sop("输入有误,请重新输入");
input(); //你在异常处理中又调用了有异常的方法,这样的话就成为了一个没结束标志的递归,你定义的year是int型的,你输入不是int时,程序就发生异常,就会去执行处理异常的代码块,你在异常处理代码块中有调用了有异常的方法,这样会一直循环下去,一直在处理异常。
}
}
sop(count);
return year;
}
复制代码
结果:
请输入年份
sdf
输入有误,请重新输入
请输入年份
2
2
请输入年份
输入有误,请重新输入
请输入年份
输入有误,请重新输入
请输入年份
输入有误,请重新输入
请输入年份
输入有误,请重新输入
Exception in thread "main" java.lang.StackOverflowError
at java.util.regex.Pattern.group0(Unknown Source)
at java.util.regex.Pattern.sequence(Unknown Source)
at java.util.regex.Pattern.expr(Unknown Source)
public static int input(){
int year=-1;
count++;
Scanner sn=new Scanner(System.in);
while(true){
try{
sop("请输入年份");
year=sn.nextInt();
sn.close();
break;
}catch(Exception e){
sop("输入有误,请重新输入");
input();//没有结束标志的递归,就是死循环。
}
}
sop(count);
return year;
}
复制代码
为什么注释了sn.close();老是重新接受键盘输入 不注释结果
Start
请输入年份
输入有误,请重新输入
Start
请输入年份
输入有误,请重新输入
Start
请输入年份
输入有误,请重新输入
..........
Start
请输入年份
输入有误,请重新输入
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2