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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 来自沙沙的我 于 2014-6-1 22:13 编辑
  1. import java.io.*;
  2. public class Test3 {
  3.         public static void main(String[] args) throws IOException
  4.         {
  5.                 BufferedReader dq=null;//引用变量  
  6.         BufferedWriter sx=null;//引用变量  
  7.         try   
  8.         {  
  9.             //创建输入流  
  10.             dq=new BufferedReader(new InputStreamReader(System.in));  
  11.             //创建输出流  
  12.             sx=new BufferedWriter(new OutputStreamWriter(System.out));
  13.             char[] zw={'零','一','二','三','四','五','六','七','八','九'};
  14.                
  15.                
  16.                         
  17.                         
  18.                         
  19.                         int i=0;
  20.                     char[] sz=new char[200];
  21.                         i=dq.read(sz);
  22.                         int j=sz[0];
  23.                         sx.write(j);//这个地方能够编写出J的数字
  24.                         //sx.write(zw[j]); 那么为什么这个地方会报错?
  25.                         
  26.                         
  27.                         
  28.                         
  29.                 }
  30.                 catch(IOException e)
  31.                 {
  32.                         
  33.                 }
  34.         dq.close();
  35.         sx.close();
  36.                
  37.         }
  38. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

6 个回复

倒序浏览
int j=sz[0]这句中得到的是阿拉伯数字对应的ascii码,这样0对应的就是48,依次类推。因此在执行sx.write(zw[j])会发生角标越界的异常,正确的做法是:int j=sz[0]-'0';这样取得的j角标就和阿拉伯数字对应起来了。
回复 使用道具 举报 2 0
Lin0411 发表于 2014-6-1 19:10
int j=sz[0]这句中得到的是阿拉伯数字对应的ascii码,这样0对应的就是48,依次类推。因此在执行sx.write(zw ...

谢谢回复。
再问下,这个知识点在毕老师视频哪个章节里才会说到啊?
回复 使用道具 举报
char[i]   不应该等于一个int 的值,你弄错了,eclipse没有提示你package filetest;

import java.io.*;

public class Test3 {
        public static void main(String[] args) throws IOException {
                BufferedReader dq = null;// 读字符流
                BufferedWriter sx = null;// 写字符流
                try {
                        // 创建输入流
                        dq = new BufferedReader(new InputStreamReader(System.in));
                        // 创建输出流
                        sx = new BufferedWriter(new OutputStreamWriter(System.out));
                        //创建一个char类型的数组
                        char[] zw = { '零', '一', '二', '三', '四', '五', '六', '七', '八', '九' };
                       
                       
                        int i = 0;
                        char[] sz = new char[200];//一个200的缓冲区
                        i = dq.read(sz);//读到缓冲区 ,返回世纪读到的字符数,这里读到的是一个
                        char c = sz[0];
//                        sx.write(c);// 这个地方能够编写出J的数字
                         sx.write(c);// 那么为什么这个地方会报错?

                } catch (IOException e) {

                }
                dq.close();
                sx.close();

        }
}

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
你改成这样就好了,没有问题了,你得到的是阿斯卡码,阿斯卡码的话,嗯,你传给你的40多呢,而你世纪只读到了一个,写也只写一个,所以就会发生没有40多个的情况,就角标越界,其实这里你没有必要搞阿斯卡码的,你改成我这样就好了
回复 使用道具 举报
这个是毕老师讲基础,编码的时候,具体我也记得不清楚了
回复 使用道具 举报
错误有点多。
首先,int j=sz[0];这里目的应该是要得到char[] zw的角标,但你传的是字符,不是数字,那么它就会强转成字符对应编码表的数字。
还有就算得到正确的角标,还是注意下编码表的问题,因为是要输出汉字,java默认的编码表示gbk,如果是utf-8的话,有些汉字是3个字符表示的,有时候会得到乱码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马