A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 杨兴庭 于 2013-7-13 08:38 编辑

代码如下:
当我输入字母的时候提示:重新输入
可是当我输入任何一个大于〇的数字时候都出现代码内存溢出的错误,程序停止运行
但是int类型的数字范围不是-128 ~127之间吗,为什么会出现内存溢出的错误?
另外请高手给出正确的处理方式,多谢啦!
  1. import java.io.BufferedReader;
  2. import java.io.InputStreamReader;
  3. public class ExceptionDecimal {
  4.         public static void main(String[] args) throws Exception {
  5.                 System.out.println("请输入一个十进制数,程序将其转换为其它进制:");
  6.                 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  7.                 while(true) {
  8.                         String line= br.readLine();;
  9.                         try {
  10.                                 int x = Integer.parseInt(line);
  11.                                 toBinary(x);
  12.                                 toOctal(x);
  13.                                 toHex(x);
  14.                                 break;
  15.                         } catch (NumberFormatException e) {
  16.                                 System.out.println("您输入的不是数字,不能转换,请重新输入:");
  17.                         }
  18.                 }
  19.         }
  20.         
  21.         static void toBinary(int x) throws Exception {        
  22.                 StringBuffer sb = new StringBuffer();
  23.                 while(x > 0)
  24.                         sb.append(x % 2);
  25.                         x /= 2;
  26.                 sb.reverse();
  27.                 System.out.println("二进制:" + sb);
  28.         }
  29.         
  30.         static void toOctal(int x) {
  31.                 StringBuffer sb = new StringBuffer();
  32.                 while(x > 0)
  33.                         sb.append(x % 8);
  34.                         x /= 8;
  35.                 sb.reverse();
  36.                 System.out.println("八进制:" + sb);
  37.         }
  38.         
  39.         static void toHex(int x) {
  40.                 char[] ch = {'0','1','2','3','4','5','6','7','8',        //把十六进制中的元素存储进char类型的数组ch中;
  41.                                 '9','A','B','C','D','E','F'};
  42.                 StringBuffer sb = new StringBuffer();                                
  43.                 while(x > 0)
  44.                         sb.append(ch[x % 16]);
  45.                         x /= 16;
  46.                 sb.reverse();
  47.                 System.out.println("十六进制:" + sb);
  48.                 }
  49. }

  50. /*编译报错如下:                                //内存溢出:如何解决?
  51. * Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
  52. * at cn.itcast.ExceptionDecimal.toBinary(ExceptionDecimal.java:25)
  53.         at cn.itcast.ExceptionDecimal.main(ExceptionDecimal.java:13)*/
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

5 个回复

倒序浏览
你的代码有死循环,我把你的代码修改了下:
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class ExceptionDecimal
{
        public static void main(String [] args) throws Exception
        {
                System.out.println("请输入一个十进制数,程序将其转换为其它进制:");
               
                while(true)
                {
                        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
                        String line=br.readLine();
                       
                        try
                        {
                                int x=Integer.parseInt(line);
                                toBinary(x);
                                toOctal(x);
                                toHex(x);
                                break;
                        }
                        catch(NumberFormatException e)
                        {
                                System.out.println("您输入的不是数字,不能转换,请重新输入:");
                        }
                }
        }

        static void toBinary(int x) throws Exception
        {
                StringBuffer sb=new StringBuffer();
                while(x>0)
                {
                        sb.append(x%2);
                        x/=2;
                }
                       
               
                sb.reverse();
                System.out.println("二进制:"+sb);
        }

        static void toOctal(int x)
        {
                StringBuffer sb=new StringBuffer();
                while(x>0)
                {
                        sb.append(x%8);
                        x/=8;                       
                }
                       
                sb.reverse();
                System.out.println("八进制:"+sb);
        }

        static void toHex(int x)
        {
                // 把十六进制中的元素存储进char类型的数组ch中;
                char [] ch= {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
                StringBuffer sb=new StringBuffer();
                while(x>0)
                {
                        sb.append(ch[x%16]);
                        x/=16;
                }
                       
                sb.reverse();
                System.out.println("十六进制:"+sb);
        }
}

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
哪颗最亮的星星 发表于 2013-7-11 19:35
你的代码有死循环,我把你的代码修改了下:
import java.io.BufferedReader;
import java.io.InputStreamRe ...

你是说把这行代码BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
放在while循环里?我看了半天好像就这一处改动,另外我运行的结果还是和原来一样,不知道你的运行结果是什么
回复 使用道具 举报
int范围是-2的15次方~2的15次方-1
然后我试了一下,是每个部分都报错,也就是说,你把主函数里的toBinary注释掉,那么八进制部分就报错
原因分析不出来,太多没学到的了
回复 使用道具 举报
本帖最后由 changweihua 于 2013-7-12 07:19 编辑

二进制里
  1. while (x > 0){
  2.                         sb.append(x % 2);
  3.                         x /= 2;
  4.                 }
复制代码
同理,八进制和十六进制都是,用大括号把两句包含进去,默认while只会包含离他最近的一句,代码缩进对于jvm没有用,缩进只是为了我们理解代码,jvm看不懂的

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
changweihua 发表于 2013-7-12 07:17
二进制里同理,八进制和十六进制都是,用大括号把两句包含进去,默认while只会包含离他最近的一句,代码缩 ...

。。。。我只能表示无语了,前面的while都知道用括号,后面的就不知道了,汗,多谢朋友了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马