Topic: 异常处理时发现的一个小问题 (try-catch)

  Print this page

1.异常处理时发现的一个小问题 (try-catch) Copy to clipboard
Posted by: babyone
Posted on: 2004-09-11 16:22

望大侠们莱讨论一下?
菜讨论是啥玩意?:-|

原来不是菜,而是莱,来:$



我在运行这个程序的时候,有一点让我百思不得其解:
//==============================================
// 程序名称:Zero.java
// 程序目的:判断一个浮点数是否等于0
//==============================================
import java.io.*;
  
public class Zero {
  public static void main(String[] args)
  {
  float x;
  String sInput=new String();
  
  System.out.println("请输入一个浮点数x=");
  InputStreamReader i=new InputStreamReader(System.in);
  BufferedReader b=new BufferedReader(i);
  
  try{
   sInput = b.readLine();
  }/*catch(IOException re)*/
  catch(NumberFormatException e){
    System.err.println(" 错误 ");
  }
  catch(IOException re){
    System.err.println(" errors ");
  }
  
x=Float.parseFloat(sInput);
  
  if (x==0f)
    System.out.println("浮点数x="+x+"等于0");

  else
    System.out.println("浮点数x="+x+"不等于0");
}
}

起先,我没有加入异常处理机制,编译器显示我出现一个IOException 异常,然后,我捕获了这个异常,可是,我自己原本的输出“错误”这两字根本没出现 ,编译器显示这样:
java.lang.NumberFormatException: empty String
  at java.lang.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:986)
  at java.lang.Float.parseFloat(Float.java:204)
  at Zero.main(Zero.java:28)
Exception in thread "main"
Interactive Session Ended
于是,我又把编译器显示的这个异常捕获了,但是,还是没反应,请问,大侠们,这到底是属于怎么一回事啊 ?

2.Re:异常处理时发现的一个小问题,望大侠们莱讨论一下! [Re: babyone] Copy to clipboard
Posted by: 不懂不要乱说话
Posted on: 2004-09-11 18:02

楼上的NumberFormatException捕捉的不是地方,当你直接回车的时候在x=Float.parseFloat(sInput);会出现该异常……,所以异常要在此处捕捉……

java.lang.Object
java.lang.Throwable
java.lang.Exception
java.lang.RuntimeException
java.lang.IllegalArgumentException
java.lang.NumberFormatException

java.lang.Object
java.lang.Throwable
java.lang.Exception
java.io.IOException

NumberFormatException是一个Runtime Exception,而IOException是一个checked Exception;事实上,checked exception用来指示一种调用方能够直接处理的异常情况。而runtime exception则用来指示一种调用方本身无法处理或恢复的程序错误。也就是说我们捕捉checked exception对我们的程序有益,而对于runtime exception 我们一般是直接在控制台上打印出来,供找出错误。如果你要捕获它的话,你就会冒这样一个风险:程序代码的错误(bug)被掩盖在运行当中无法被察觉。

楼上就是一个很好的例子哦……

3.Re:异常处理时发现的一个小问题,望大侠们莱讨论一下! [Re: babyone] Copy to clipboard
Posted by: why
Posted on: 2004-09-11 19:06

try{
sInput = b.readLine();
x=Float.parseFloat(sInput); // 不放在 try block 之内怎 catch? 好好读一读书吧
} catch(NumberFormatException e){
System.err.println(" 错误 ");
} catch(IOException re){
System.err.println(" errors ");
}

4.Re:异常处理时发现的一个小问题,望大侠们莱讨论一下!(try-catch) [Re: babyone] Copy to clipboard
Posted by: babyone
Posted on: 2004-09-11 20:24

照一楼大侠的说法,以我的程序为例,这个NumberFormatException 不用,也不该去捕获了 ?
另外一个问题,但是,我不捕获这个异常,则显示有个IOException,这样,捕获前,出现的异常属于checked Exception ,按道理说,需要捕获,但是,捕获后则出现了IOException异常,那我该怎么做呢 ?
(另外谢谢二楼大侠的建议,程序是按我原先设想的那样,调试成功了 ! )

5.Re:异常处理时发现的一个小问题,望大侠们莱讨论一下!(try-catch) [Re: babyone] Copy to clipboard
Posted by: 不懂不要乱说话
Posted on: 2004-09-11 21:41

我的意思搂主没有读懂,之所以在x=Float.parseFloat(sInput);处出现异常,是因为sInput这个String变量为空,在调用Float.parseFloat(sInput)的时候就表现为:所给的参数并不能转化为一个浮点数,所以runtime抛出了一个NumberFormatException异常;而作为我们编写程序来说,这个runtime Exception是完全可以为我们自己控制的,即事先对这个String变量进行规范,比如说他是否为空……;
有时候出现runtime 异常是为了让程序员更好的对代码作出优化……

// 不放在 try block 之内怎 catch? 好好读一读书吧
why 也一针见血的指出了搂主代码的错误之处:搞清楚为什么会抛出NumberFormatException异常。

runtime类型的异常一旦发生就立即被抛出。

6.Re:异常处理时发现的一个小问题,望大侠们莱讨论一下!(try-catch) [Re: babyone] Copy to clipboard
Posted by: babyone
Posted on: 2004-09-11 21:55

谢谢一楼大侠细心的解释,下面说的为什么会抛出NumbeFormatException这个异常我知道了 ,可是 ,我还是没弄懂我再上面提的问题 ,就是
===================================
另外一个问题,但是,我不捕获这个异常,则显示有个IOException,这样,捕获前,出现的异常属于checked Exception ,按道理说,需要捕获,但是,捕获后则出现了IOException异常,那我该怎么做呢 ?
===================================
这个我还是没弄懂,你能再给我解释一下吗 ?

另外:
===================================
望大侠们莱讨论一下?
菜讨论是啥玩意?What are you talking about?
===================================
这个是我的笔误,本来是“来讨论一下”,在此对两位大侠说声道歉!


   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