Break和Continue 问题 谢谢了~~

yuppy 2009-03-05 12:47:08

package xubin;

import java.io.IOException;
import java.io.InputStreamReader;

public class TestSystemIn {


public static void main(String[] args) {
TestSystemIn.test();
}
public static void test(){
int i = 0;
InputStreamReader in = new InputStreamReader(System.in);
while(true){
System.out.println("Testing is on..."+i++);
try {
if(in.read() == 'c'){
System.out.println("Testing break....");
break;
}
if(in.read() == 'd'){
System.out.println("Testing is continue...");
continue;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}



为什么这个运行之后,只是输出一个"Testing is on...0"?
而在我输入了"d"之后,"Testing is continue..."却是有时候输出有时候又不输出呢?

有大哥帮解释下不?谢谢了
...全文
196 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
starscc 2009-03-06
  • 打赏
  • 举报
回复
楼主,首先说下,read()这个方法返回的类型是int
我更正了下你的代码如下:

import java.io.IOException;
import java.io.InputStreamReader;
public class A {

public static void main(String[] args) {
A.test();
}
public static void test(){
int i = 0;
InputStreamReader in = new InputStreamReader(System.in);
while(true){
System.out.println("Testing is on..."+i++);
try {
char a = (char)in.read();
if(a == 'c'){
System.out.println("Testing break....");
break;
}
if(a == 'd'){
System.out.println("Testing is continue...");
continue;//下面没了,continue放这里跟不放一样!
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}


基本能达到的要求,测试的时候当你输入C的时候程序退出。
而但你输入d的时候,如下:
Testing is on...0
d
Testing is on...1
Testing is on...2
Testing is on...3
d
Testing is on...4
Testing is on...5
Testing is on...6
....
是达到要求了,可是结果好像出我们的意料。因为多了其中的
Testing is on...2
Testing is on...3

Testing is on...5
Testing is on...6
为什么会多?

原因是因为你这个循环是死循环,每当你按回车的时候,回车符号(占两个字节)也被读进去了,而回车符号跟c或d都不相等,所以就出现了上面的结果。



yuppy 2009-03-05
  • 打赏
  • 举报
回复
自己先顶下~~谢谢了
yuppy 2009-03-05
  • 打赏
  • 举报
回复
谢谢楼上的兄弟了~~下班回去好好搞搞了~~
guoapeng 2009-03-05
  • 打赏
  • 举报
回复
首先,你输入d 然后按回车键 实际在屏幕上输入了三个字符 d ,回车,换行 ,
第二次 你在输入d 然后按回车键 ,实践上又输入了 d ,回车,换行 ,
你的程序是一个循环读两个字符,即一个循环里面两次 in.read();
所以 第二次循环,运行到的 if(in.read() == 'd'){时 刚好独到的是d 所以 就会输出Testing is continue...

其次 debug ,就是先设定断点,然后在debug模式下运行,
不了解debug 可以在百度搜一下,一句话说不清楚。




yuppy 2009-03-05
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 guoapeng 的回复:]
15 楼说得很对,很详细,就是这样的,你忽略了换行符号和回车符号,
debug 一下就知道怎么回事了!
[/Quote]
能和我具体讲讲不?怎么发现问题?
guoapeng 2009-03-05
  • 打赏
  • 举报
回复
15 楼说得很对,很详细,就是这样的,你忽略了换行符号和回车符号,
debug 一下就知道怎么回事了!
beacea 2009-03-05
  • 打赏
  • 举报
回复
这里高手如云啊,,以后多来学习学习
happy84911 2009-03-05
  • 打赏
  • 举报
回复
while(true){
System.out.println("Testing is on..."+i++);
try {
int k1 = in.read(); ---------------------------------①
if(k1 == 'c'){ ---判断1
System.out.println("Testing break....");
break;
}
int k2 = in.read(); --------------------------------②
if(k2 == 'd'){ ---判断2
System.out.println("Testing is continue...");
continue;
}
} catch (IOException e) {
e.printStackTrace();
}
}
简单的解释下:
运行时,输出Testing is on..0,然后i++后,i=1
当你输入'd',回车后,
此时输入了三个字符,一个是字符d,第二个是回车,第三个是换行
在int k1 = in.read(); ---------------------------------①处
k1的值是'd'的AISCII码100
判断1返回false
int k2 = in.read(); --------------------------------②
此处是回车的AISCII码13
判断2返回false
执行下次循环,
输出Testing is on..1,i++后i的值为2,
此时读取第三个字符,回车,判断1返回false,
此时在int k2 = in.read()处等待用户再次输入,
再输入d后,又输入三个字符,分别是d、回车,换行,
此时k2的值是d的AISCII码,
判断2返回TRUE,输入Testing is continue...
遇到continue; 跳出本次循环,执行下次循环
输出Testing is on..2,i++后i的值为3,
在①处读取到回车,判断1返回FALSE,
在②处读取换行,判断2返回FALSE,
本次循环完毕,执行下次循环,
Testing is on...3 i++后i的值为4,继续等待用户输入,后边的以此类推。
yuppy 2009-03-05
  • 打赏
  • 举报
回复
谢谢了~~~哈哈
yuppy 2009-03-05
  • 打赏
  • 举报
回复
牛逼.... 懂了~~

回车算一下~~
freelancerww 2009-03-05
  • 打赏
  • 举报
回复
最恨 CSDN 回帖后,不能编辑。。。
楼上的代码打印的东西也有点怪, 再加了一句,

public class TestSystemIn {


public static void main(String[] args) {
TestSystemIn.test();
}
public static void test(){
int i = 0;
InputStreamReader in = new InputStreamReader(System.in);
while(true){
System.out.println("Testing is on..."+i++);
try {
int c = in.read();
System.out.println("your input value is " + c);
if(c == 'c'){
System.out.println("Testing break....");
break;
}
if(c == 'd'){
System.out.println("Testing is continue...");
continue;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

获得
输入如下:
Testing is on...0
d
your input value is 100 // 这个是 d 的ascii
Testing is continue...
Testing is on...1
your input value is 13 // 大家都知道的 回车
Testing is on...2
your input value is 10 // ascii 换行
Testing is on...3
freelancerww 2009-03-05
  • 打赏
  • 举报
回复
而在我输入了"d"之后,"Testing is continue..."却是有时候输出有时候又不输出呢?


准确的现象是:每两次输入“d”后才会 打印"Testing is continue..."

其原因是, 楼主调用了两次 in.read()。


public class TestSystemIn {


public static void main(String[] args) {
TestSystemIn.test();
}
public static void test(){
int i = 0;
InputStreamReader in = new InputStreamReader(System.in);
while(true){
System.out.println("Testing is on..."+i++);
try {
int c = in.read();
if(c == 'c'){
System.out.println("Testing break....");
break;
}
if(c == 'd'){
System.out.println("Testing is continue...");
continue;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
scsidun 2009-03-05
  • 打赏
  • 举报
回复
明白了?
把i放循环里面.
gesanri 2009-03-05
  • 打赏
  • 举报
回复
啊,明白楼主的意思了,我试了下,输出:
Testing is on...0
d
Testing is on...1
d
Testing is continue...
Testing is on...2
Testing is on...3
d
Testing is on...4
d
Testing is continue...
Testing is on...5
Testing is on...6
d
Testing is on...7
d
Testing is continue...
Testing is on...8
Testing is on...9
c
Testing break....

换一种输出:
Testing is on...0
d
Testing is on...1
c
Testing is on...2
Testing is on...3
d
Testing is on...4
c
Testing is on...5
Testing is on...6
c
Testing break....

输出结果确实很奇怪,等待高手作答
shuanlarousi1 2009-03-05
  • 打赏
  • 举报
回复
要了解static的真正意义,全局变量,在程序进行编译的时候的执行顺序,你的test() 在class被加载的时候就运行过一次了。
而且你要知道 i++ ++i 是完全不同的两个概念你的i++是运行结束以后再自己增加1 ,所以在你运行的时候当然是Testing is on...0 只能帮你解释到这里了!
public class TestSystemIn {

public static void main(String[] args) {
TestSystemIn.test();
}
public static void test(){
int i = 0;
InputStreamReader in = new InputStreamReader(System.in);
while(true){
System.out.println("Testing is on..."+i++);
try {
//int k = in.read();

//System.out.println(k);
int k1 = in.read(); //a
System.out.println(k1);
if(k1 == 'c'){
System.out.println("Testing break....");
break;
}
int k2 = in.read(); //b
System.out.println(k2);
if(k2 == 'd'){
System.out.println("Testing is continue...");
continue;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
fanzhijun301 2009-03-05
  • 打赏
  • 举报
回复
public class TestSystemIn {

public static void main(String[] args) {
TestSystemIn.test();
}
public static void test(){
int i = 0;
InputStreamReader in = new InputStreamReader(System.in);
while(true){
System.out.println("Testing is on..."+i++);
try {
//int k = in.read();

//System.out.println(k);
int k1 = in.read(); //a
System.out.println(k1);
if(k1 == 'c'){
System.out.println("Testing break....");
break;
}
int k2 = in.read(); //b
System.out.println(k2);
if(k2 == 'd'){
System.out.println("Testing is continue...");
continue;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

}

其实你把这段程序运行一下就明白怎么回事了...
yuppy 2009-03-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gesanri 的回复:]
System.out.println("Testing is on..."+i++);
当然会先输出Testing is on...0
完后等着你输入,输入d就继续,输入c就停止,在我这没出现有时候输出有时候又不输出啊
[/Quote]
就是你第一次跑的时候"Testing is on.. 0"
然后输入"d",输出"Testing is on...1"
再次输入就出现"Testing is continue..." "Testing is on...2"
yuppy 2009-03-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gesanri 的回复:]
System.out.println("Testing is on..."+i++);
当然会先输出Testing is on...0
完后等着你输入,输入d就继续,输入c就停止,在我这没出现有时候输出有时候又不输出啊
[/Quote]
你多输入几次"d"再试试看!
gesanri 2009-03-05
  • 打赏
  • 举报
回复
System.out.println("Testing is on..."+i++);
当然会先输出Testing is on...0
完后等着你输入,输入d就继续,输入c就停止,在我这没出现有时候输出有时候又不输出啊
shuangbaobei 2009-03-05
  • 打赏
  • 举报
回复
因为你的i定义在循环外边了,所以每次都是0,下一个问题没太明白
加载更多回复(1)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧