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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 武剑峰 于 2012-5-30 18:22 编辑

今天在论坛里面,看到“关于IO程序出错的问题”,一时手痒将其编写如下。当然这结合了我大一时老师要求的输入一串字符,然后倒序输出。虽然编译运行都成功了,可是突然想起以前在编写C程序是,定义数组变量必须同时要指定数组的长度(lenth)。再看下边的程序发现在java里面数组定义貌似不用指定长度,可以随时改变长度,大家说是这样的吗????
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ioError {
        public static void main(String[] args) {
                String readString, Uperchar = "", Lowerchar = "";
                InputStreamReader isr = new InputStreamReader(System.in);
                BufferedReader br = new BufferedReader(isr);
                try {
                        System.out.print("请输入一行字母或字母数字组合:");
                        readString = br.readLine(); // 将输入作为字符串保存
                        while (!readString.equals("")) {

                                System.out.println("你输入的是:" + readString);

                                char[] ch = readString.toCharArray();// 将输入的字符串转换为字符数组??????????????????????????????
                                System.out.print("输入倒序后:");
                                for (int i = ch.length - 1; i >= 0; i--) {
                                        System.out.print(ch);
                                }

                                for (int i = 0; i < ch.length; i++) {
                                        if (ch > 'A' && ch < 'Z') {
                                                Uperchar = Uperchar + ch;

                                        } else if (ch > 'a' && ch < 'z') {
                                                Lowerchar = Lowerchar + ch;
                                        }
                                }
                                if (Uperchar.length() > 0) {
                                        System.out.print("\n其中大写字母有:" + Uperchar);
                                }
                                if (Lowerchar.length() > 0) {
                                        System.out.println("\n其中小写字母有:" + Lowerchar);
                                }
                                System.out.print("\n请输入一行字母或字母数字组合:");
                                Uperchar = ""; // 清空变量
                                Lowerchar = "";
                                readString = br.readLine();
                        }
                        br.close();
                } catch (IOException e) {
                        e.printStackTrace();
                }

        }
}

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

4 个回复

正序浏览
不是这样,数组长度是不可改变的

平时我们这样定义数组:
int[] arr1 = new int[3];
int[] arr2 = {1,2,3,4};
int[] arr3 = new int[]{1,2,3,4,5};

注意,数组是一种引用变量,在定义时堆内存中生成数组对象, 数组变量指向这个对象,
我们所说的数组长度不可改变就是指这个对象的长度在生成时就确定了,不可变
比如上面3个数组长度分别是3,4,5

如果非说数组长度可变,那只能是数组引用变量指向了别的数组了
比如arr1 = arr2,
arr1.length就变成4了,但这其实是因为指向不同对象的原因

你的代码里,char[] ch = readString.toCharArray();
先是readString.toCharArray()生成一个确定长度的数组对象,
然后数组引用ch 指向了这个数组对象
而数组引用ch 还是一个局部变量,每次都不一样的

个人总结,如有不妥,欢迎指正
回复 使用道具 举报
张亭 发表于 2012-5-30 14:57
不明白你说的检测是要检测什么,我觉得char[] ch = readString.toCharArray();
没语法没逻辑错误,这些编译 ...

我说的检测是指方法体里面的局部变量,javac时只做语法检测
回复 使用道具 举报
武剑峰 发表于 2012-5-30 14:37
哦。如果这样说的话就明白了。局部变量在编译时不会被检测。所以不会报错,而使用时才被定义并创建,所以 ...

不明白你说的检测是要检测什么,我觉得char[] ch = readString.toCharArray();
没语法没逻辑错误,这些编译时肯定会检测的,不管局部不局部的
至于运行时,对象确实是运行时创建的,但这跟报不报错有什么关系呢
难道是想说创建失败什么的?:dizzy:
回复 使用道具 举报
张亭 发表于 2012-5-30 14:22
不是这样,数组长度是不可改变的

平时我们这样定义数组:

哦。如果这样说的话就明白了。局部变量在编译时不会被检测。所以不会报错,而使用时才被定义并创建,所以更不会报错。这样理解对吗?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马