Java程序读取文件异常,打印String数组出现[Ljava.lang.String;@xxxx问题求助
问题分析与解决
1. 打印数组出现[Ljava.lang.String;@2f7a2457的原因
直接打印数组对象时,Java会调用Object类的toString()方法,输出格式为[L类型;@哈希码——其中[L代表一维数组,java.lang.String是元素类型,后面的是对象哈希值。要正确打印数组内容,有两种可行方式:
- 导入
java.util.Arrays类,使用Arrays.toString(数组名)方法 - 遍历数组,逐个打印每个元素
2. 代码中的其他逻辑错误
你的代码还存在多处逻辑问题,导致文件读取和数组存储混乱:
- 字符串比较错误:
while((name == "string"))用==比较字符串是错误的,Java中==比较的是对象引用,应该用equals()方法,即while("string".equals(name)) - 循环结构嵌套错误:
while循环内部直接嵌套两个for循环,会导致第一次进入while就执行for循环,逻辑完全混乱,应将for循环移到while循环外,重新梳理读取逻辑 - 初始值冗余:初始化
name = "string"后,第一次while循环会把这个无关字符串存入数组,并非文件内容 - 元素重复覆盖:第一个
for循环会覆盖friendslist中已存入的元素,属于重复逻辑
修复后的代码示例
import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; import java.util.Arrays; public class Friends { // 类名首字母大写,符合Java编码规范 public static void main(String[] args) throws FileNotFoundException { String[] friendslist = new String[50]; String[] birthdates = new String[50]; Scanner input = new Scanner(new File("friends1.txt")); int friendsamount = 0; // 直接读取文件内容,直到无下一行可读取 while (input.hasNextLine()) { friendslist[friendsamount] = input.nextLine(); // 若文件中是姓名、生日交替存储,可在此读取生日 // birthdates[friendsamount] = input.nextLine(); friendsamount++; // 防止数组越界 if (friendsamount >= friendslist.length) { break; } } input.close(); // 关闭Scanner资源,避免资源泄漏 // 方式1:用Arrays.toString打印有效元素(截取数组有值部分) System.out.println(Arrays.toString(Arrays.copyOf(friendslist, friendsamount))); // 方式2:遍历打印每个元素 for (int k = 0; k < friendsamount; k++) { System.out.println(friendslist[k]); } } }
关键修复说明
- 替换
==为equals()进行字符串比较(修复后代码改用hasNextLine()判断文件内容,逻辑更简洁) - 调整循环结构,通过
Scanner.hasNextLine()判断文件是否还有内容,逐个读取存入数组 - 使用
Arrays.toString()或循环遍历打印数组内容,解决原打印异常问题 - 添加资源关闭和数组越界判断,避免潜在运行时问题
内容的提问来源于stack exchange,提问作者Osprey
相关产品推荐
相关产品推荐

