黑马程序员技术交流社区

标题: 进制转换造成内存溢出,求指点,多谢!~ [打印本页]

作者: 崔龙飞    时间: 2013-7-11 18:35
标题: 进制转换造成内存溢出,求指点,多谢!~
本帖最后由 杨兴庭 于 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)*/
复制代码

作者: 哪颗最亮的星星    时间: 2013-7-11 19:35
你的代码有死循环,我把你的代码修改了下:
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);
        }
}


作者: 崔龙飞    时间: 2013-7-12 01:53
哪颗最亮的星星 发表于 2013-7-11 19:35
你的代码有死循环,我把你的代码修改了下:
import java.io.BufferedReader;
import java.io.InputStreamRe ...

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

二进制里
  1. while (x > 0){
  2.                         sb.append(x % 2);
  3.                         x /= 2;
  4.                 }
复制代码
同理,八进制和十六进制都是,用大括号把两句包含进去,默认while只会包含离他最近的一句,代码缩进对于jvm没有用,缩进只是为了我们理解代码,jvm看不懂的
作者: 崔龙飞    时间: 2013-7-13 01:42
changweihua 发表于 2013-7-12 07:17
二进制里同理,八进制和十六进制都是,用大括号把两句包含进去,默认while只会包含离他最近的一句,代码缩 ...

。。。。我只能表示无语了,前面的while都知道用括号,后面的就不知道了,汗,多谢朋友了




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