Topic: 关于try--catch--finally和java标准输入流(急~~~)

  Print this page

1.关于try--catch--finally和java标准输入流(急~~~) Copy to clipboard
Posted by: rahoo
Posted on: 2004-12-04 15:15

希望路过的能看下去,谢谢了!

1。书上说至少要用一个catch语句,但我用了只用try编译也能通过!

2。finally语句是不管有没捕获到都要执行的语句,但默认其他语句就是可以执行的,根本不受try的约束,那finally这个关键字设了有什么用,小弟感觉无任何用处!

3。另外,关于System.in.read(buffer)这样的输入也有些不明白,因为如果程序中多次出现此语句,则会存在一个覆盖的问题,如果前面输入的字符串比前面的长,则长出的部分会遗留在后面的字符串中,而且我观察后发现,输出后面字符串的结果是实际字符后面是空格然后下面一行是前面输入的字符(从短字符串长度+2位置起截取长字符串)

为了说明方便,我且设
byte buffer[]=new byte[50];
System.in.read(buffer);
String a=new String(buffer).trim();
System.in.read(buffer);
String b=new String(buffer).trim();

如果依次输入
abcdefgh
xyz

那么system.out.print(b)的结果就是
xyz

fgh (从abcdefgh的3+2个位置开始截取)
而System.out.print(b.length())的结果是8(即a串的实际长度)
String(buffer)后面加不加.trim()的区别就是,没加是如果前面输入的比后面的长不超过2,则输出的结果是正确的,否则就有错误;而不用.trim()则.length()始终是50(即buffer数组的长度),且如果前面输入的长于后面的也会出错

4。最后还有一个问题是try-catch-finally的执行机制,因为我的一个程序明明没发生异常,但却捕获到了,真是想不通~
希望有高手能详细解释一下System.in.read(buffer)的细节和try-catch-finally的执行机制,finally{}语句真的没什么用吗,帮小弟解决困惑,不胜感激!

2.Re:关于try--catch--finally和java标准输入流(急~~~) [Re: rahoo] Copy to clipboard
Posted by: rahoo
Posted on: 2004-12-04 15:21

这是我的程序
一个非常简单的银行存取款问题,但运行起来有很多问题

import java.io.*;
import java.util.*;
public class Xiti3
{
private String zhanghao,xm,opentime,haoma;
private int num=0;
public Xiti3(String zhanghao,String xm,String opentime,String haoma,int num)
{
this.zhanghao=zhanghao;
this.xm=xm;
this.opentime=opentime;
this.haoma=haoma;
this.num=num;
}
public void withdrawal(int n)
{
if(n<=num)
{
num=num-n;
System.out.println("余额为:"+num);
}
else System.out.println("余额不足!");
}
public void saving(int n)
{
num=num+n;
System.out.println("余额为:"+num);
}
public static void main(String args[]) throws IOException
{
byte buffer[]=new byte[20];
String zh,xm,ot,hm;
int n;
System.out.print("帐号: ");
System.in.read(buffer);
zh=new String(buffer).trim();
System.out.print("姓名: ");
System.in.read(buffer);
xm=new String(buffer).trim();
System.out.print("身份证号码: ");
System.in.read(buffer);
hm=new String(buffer).trim();
//System.out.println(hm.length());
//System.out.println(hm);
System.out.print("存款金额: ");
System.in.read(buffer);
n=Integer.parseInt(new String(buffer).trim());
Date now=new Date();
ot=now.toString();
Xiti3 a=new Xiti3(zh,xm,ot,hm,n);
boolean flag=true;
while(flag)
{
System.out.println("请选择操作: 1.存款 2.取款 3.退出");
System.in.read(buffer);
try{
n=Integer.parseInt(new String(buffer).trim());
}
catch(Exception e)
{
System.out.println("捕获");
}
switch(n)
{
case 1: System.out.print("存款金额: ");
System.in.read(buffer);
n=Integer.parseInt(new String(buffer).trim());
a.saving(n);
break;
case 2: System.out.print("取款金额: ");
System.in.read(buffer);
n=Integer.parseInt(new String(buffer).trim());
a.withdrawal(n);
break;
case 3: flag=false;
break;
default: System.out.println("操作错误!");
}
}
}
}

3.Re:关于try--catch--finally和java标准输入流(急~~~) [Re: rahoo] Copy to clipboard
Posted by: rahoo
Posted on: 2004-12-04 15:25

这是运行的一种情况:

帐号: 12
姓名: qerqr
身份证号码: 2314
存款金额: 2313
请选择操作: 1.存款 2.取款 3.退出
1
捕获
操作错误!
请选择操作: 1.存款 2.取款 3.退出
2
捕获
操作错误!
请选择操作: 1.存款 2.取款 3.退出
3
捕获
操作错误!
请选择操作: 1.存款 2.取款 3.退出

4.Re:关于try--catch--finally和java标准输入流(急~~~) [Re: rahoo] Copy to clipboard
Posted by: rahoo
Posted on: 2004-12-04 15:28

这又是一种情况:

帐号: 123
姓名: werfr
身份证号码: 435634636453
存款金额: 523432223
Exception in thread "main" java.lang.NumberFormatException: For input string: "5
23432223
3"
at java.lang.NumberFormatException.forInputString(NumberFormatException.
java:48)
at java.lang.Integer.parseInt(Integer.java:477)
at java.lang.Integer.parseInt(Integer.java:518)
at Xiti3.main(Xiti3.java:47)
Press any key to continue...
(注:int型范围可达+21亿到 -21亿,buffer可容纳20个字符,所以输入的也没超范围啊~)

5.Re:关于try--catch--finally和java标准输入流(急~~~) [Re: rahoo] Copy to clipboard
Posted by: rahoo
Posted on: 2004-12-04 15:31

如果把程序中的注释去掉,则下面又是一种情况:
也说明了我的第2点问题

帐号: 123
姓名: qweqwrqw
身份证号码: 32
8
32
wrqw
存款金额:

对了,小弟用的是JCreator Pro

6.Re:关于try--catch--finally和java标准输入流(急~~~) [Re: rahoo] Copy to clipboard
Posted by: michaelyung
Posted on: 2004-12-20 15:10


System.in.read(buffer);
String a=new String(buffer).trim();

这两个语句执行一次没问题。
但每次执行完,buffer中存储的是字节数组。原有的数据还存在。
举个例子来说:

第一次输入1234567
buffer中得到的就是{49,50,51,52,53,54,55,13,10,0,……}
当调用.trim()只是截取到{13,10}即得到前面的7个字节。

若第二次调用时,此时buffer字节数组中的数据依然存在。
所以第二次如果输入的数值如果大于前一次的数值,
那么buffer原有的才会被覆盖,就不会有问题。
否则

如果第二次输入一个3
则buffer中得到的就是
{51,13,10,52,53,54,55,13,10,0……}
所以第二次的数据和第一次的部分数据都混在一起存在buffer中了。

所以才会出现你所说的异常。
将程序中读取数据的两个语句换成下面的吧:

BufferedReader is=
new BufferedReader(new InputStreamReader(System.in));
String text = is.readLine();

这样就没问题了。我已经调试过了。


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923