黑马程序员技术交流社区

标题: 怎么判断输入的被除数是一个非数值型,并抛出NumberFormatEx... [打印本页]

作者: 菠萝包丶    时间: 2014-5-16 22:28
标题: 怎么判断输入的被除数是一个非数值型,并抛出NumberFormatEx...
本帖最后由 菠萝包丶 于 2014-5-17 08:40 编辑

需求:编写一个除法程序,要求除数和被除数都从键盘中输入。如果输入的被除数是一个非数值型,如6y,
则不需要输入除数程序就自动中断并抛出NumberFormatException异常,如果输入的除数为0
则抛出ArithmeticException异常。并用finally处理最终结果。


做了很久,头疼,现在setnum函数中,怎么解决判断输入是否是非数值型,并抛出NumberFormatException异常,求大神在我的代码继续补充,修改完善,
  1. /**
  2. * 需求:编写一个除法程序,要求除数和被除数都从键盘中输入。如果输入的被除数是一个非数值型,如6y,
  3. * 则不需要输入除数程序就自动中断并抛出NumberFormatException异常,如果输入的除数为0
  4. * 则抛出ArithmeticException异常。并用finally处理最终结果。*/
  5. import java.util.*;
  6. class Chufa
  7. {
  8.         double b, a;
  9.         public void setnum()throws NumberFormatException,ArithmeticException
  10.         {
  11.                 try
  12.                 {
  13.                         Scanner reader=new Scanner(System.in);
  14.                         System.out.println("请输入被除数:");
  15.                         a=reader.nextDouble();
  16.                         Scanner reader2=new Scanner(System.in);
  17.                         System.out.println("请输入除数");
  18.                         b=reader2.nextDouble();
  19.                         if(a==0)
  20.                                 throw new ArithmeticException();
  21.                 }
  22.                 catch(NumberFormatException e)
  23.                 {
  24.                         System.out.println(e.toString());
  25.                 }
  26.                
  27.         }
  28.         public void fangfa()
  29.         {
  30.                 double end;
  31.                 end=b/a;
  32.                 System.out.println("结果为:"+end);
  33.         }
  34. }
  35. public class NumberExceptionDemo
  36. {
  37.         public static void main(String[] args) throws NumberFormatException
  38.         {
  39.                 Chufa cc=new Chufa();
  40.                 try
  41.                 {
  42.                         cc.setnum();
  43.                         cc.fangfa();
  44.                 }
  45.                 catch(ArithmeticException e)
  46.                 {
  47.                         System.out.println(e.toString());
  48.                 }
  49.                 finally
  50.                 {
  51.                         System.out.println("Over");
  52.                 }
  53.         }
  54. }
复制代码

                                                                求大神帮忙了

作者: caijunsong    时间: 2014-5-17 01:04
  1. /**
  2. * 为了实现楼主需要的需求,我将代码进行了补充修改  我给你定义了一个新方法这个方法
  3. * 用于检查输入输入的数据是否每个字符都是数字形式
  4. * 如果一个异常没有被try-catch那么只要出现这个异常就直接导致程序中断 如代码中的 NumberFormatException
  5. * 如异常被显示的处理 那么程序会从异常的下行代码开始继续运行
  6. * */
  7. import java.util.*;
  8. class Chufa
  9. {
  10.         String a;
  11.                 double b;
  12.         public void setnum()throws NumberFormatException,ArithmeticException
  13.         {
  14.                
  15.                   Scanner reader=new Scanner(System.in);
  16.             System.out.println("请输入被除数:");
  17.              //这里得到是将输入的数据以String的形式返回给a
  18.                           a=reader.next();
  19.                         //把输入的数据用字符串表示 并检查被除数是否格式正确
  20.                         if(Check(a))
  21.                         {     
  22.                                 //如果格式正确 就继续输入除数
  23.                                 try
  24.                 {   
  25.                       Scanner reader2=new Scanner(System.in);
  26.                       System.out.println("请输入除数");
  27.                       b=reader2.nextDouble();
  28.                       if(b==0)
  29.                           throw new ArithmeticException();
  30.                 }
  31.                 catch(NumberFormatException e)
  32.                 {
  33.                         e.printStackTrace();
  34.                 }
  35.                         }
  36.                         else
  37.                                 //如果判断发现 被除数格式不对则  不进行除数输入同时抛出异常 中断程序
  38.                                 throw new  NumberFormatException("被除数的格式不正确");
  39.                
  40.         }
  41.         public void fangfa()
  42.         {
  43.                 double end,s;
  44.                 s=Double.valueOf(a);
  45.                 end=s/b;
  46.                 System.out.println("结果为:"+end);
  47.         }
  48.                 //检查字符串中是否只存在数字  只存在数字 返回true  除数字外还有其它的则返回false
  49.                 public boolean Check(String str)
  50.             {  
  51.                         char c;
  52.                         for(int i=0;i<str.length();i++)
  53.                         {
  54.                             //只要检查到其中一个字符不是数字 就直接返回false
  55.                                 c=str.charAt(i);
  56.                                 if(!(c>='0'&&c<='9'))
  57.                                         return false;
  58.                         }
  59.                         //如果检查完每个字符 都是数字 则返回true
  60.                         return true;
  61.                 }
  62. }
  63. public class NumberExceptionDemo
  64. {
  65.         public static void main(String[] args) throws NumberFormatException
  66.         {
  67.                 Chufa cc=new Chufa();
  68.                 try
  69.                 {
  70.                         cc.setnum();
  71.                         cc.fangfa();
  72.                 }
  73.                 catch(ArithmeticException e)
  74.                 {
  75.                         System.out.println(e.toString());
  76.                 }
  77.                 finally
  78.                 {
  79.                         System.out.println("Over");
  80.                 }
  81.         }
  82. }
复制代码

作者: 菠萝包丶    时间: 2014-5-17 08:36
本帖最后由 菠萝包丶 于 2014-5-17 09:31 编辑
caijunsong 发表于 2014-5-17 01:04

非常感谢你的解答,原来是这么判断非数值型,遍历字符串,对每个字符限制1~9,然后再对输入的字符串转成double来计算。没想到。经验不够.我用DOS编译,运行没问题,但是用Eclipse就会出现那个Double valueOf 那里跟double的问题,结果跟DOS的不一样。你去试试,看看是不是也这样.
找到问题了,Double.valueOf是返回一个Double对象,你还要再调用doubleValue()方法得到基本double类型,或调用floatValue()得到基本float类型。
应该是   s=Double.valueOf(a).doubleValue();

作者: caijunsong    时间: 2014-5-17 09:43
本帖最后由 caijunsong 于 2014-5-17 09:50 编辑
菠萝包丶 发表于 2014-5-17 08:36
非常感谢你的解答,原来是这么判断非数值型,遍历字符串,对每个字符限制1~9,然后再对输入的字符串转成do ...


s=Double.valueOf(a).doubleValue();
不用那么麻烦   基本类型和包装类型是支持 自动装箱拆箱功能的   你这个调用的方法它是自动隐式调用的
作者: 247033993@qq.co    时间: 2014-5-17 09:53
可以直接使用正则表达式也可以啊
作者: 菠萝包丶    时间: 2014-5-17 10:19
caijunsong 发表于 2014-5-17 09:43
s=Double.valueOf(a).doubleValue();
不用那么麻烦   基本类型和包装类型是支持 自动装箱拆箱功能的    ...

不加的话,在Eclipse中会出现错误的,虽然能运行。但是不能进行正常的运算,及正常的异常抛出,在DOS不加就没问题。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2