Android Studio致命异常求助:读取Assets文件夹TXT文件时APP崩溃
嘿,作为Java和Android Studio的新手,遇到点击按钮就崩溃的情况真的太常见啦!我刚入门的时候也踩过不少类似的坑,帮你一步步排查解决~
常见崩溃原因及修复方案
1. 没处理IO异常,直接崩溃
读取Assets里的文件属于IO操作,很容易因为文件找不到、读取失败等抛出异常,如果没加try-catch捕获,APP直接就崩了。这是新手最容易忽略的点!
给你个靠谱的读取文件示例代码:
// 把读取文件的逻辑单独抽成方法,更清晰 private List<String> loadTxtLines() { List<String> allLines = new ArrayList<>(); BufferedReader reader = null; try { // 打开assets里的"基础.txt",注意文件名要完全匹配,大小写也不能错! InputStream inputStream = getAssets().open("基础.txt"); reader = new BufferedReader(new InputStreamReader(inputStream)); String singleLine; // 逐行读取存入列表 while ((singleLine = reader.readLine()) != null) { allLines.add(singleLine); } } catch (IOException e) { // 打印异常信息方便你排查,也可以弹个Toast提示自己 e.printStackTrace(); Toast.makeText(this, "文件读取失败啦", Toast.LENGTH_SHORT).show(); } finally { // 一定要记得关闭流,避免资源泄漏 try { if (reader != null) { reader.close(); } } catch (IOException e) { e.printStackTrace(); } } return allLines; }
2. 空指针搞事情!
这也是崩溃的重灾区,常见两种情况:
- 控件没绑定对:你得确保在
onCreate里用findViewById正确找到了TextView和Button,别写错ID!比如:
TextView showResultTv; Button getRandomBtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 先加载布局,这个不能忘! // 替换成你布局文件里对应的控件ID showResultTv = findViewById(R.id.tv_result); getRandomBtn = findViewById(R.id.btn_get_random); // 给按钮加点击事件 getRandomBtn.setOnClickListener(v -> { List<String> lines = loadTxtLines(); // 先判断列表不为空,不然取随机数会崩! if (!lines.isEmpty()) { Random random = new Random(); String randomLine = lines.get(random.nextInt(lines.size())); showResultTv.setText(randomLine); } else { showResultTv.setText("文件是空的或者读失败了😢"); } }); }
- 文件读出来是空列表:如果你的
基础.txt是空的,调用random.nextInt(lines.size())会因为size()为0抛异常,所以一定要先判断列表是否为空!
3. 文件名/路径搞错了
Android对Assets里的文件名大小写是敏感的!比如你存的是基础.TXT,代码里写基础.txt就会找不到文件。另外如果文件放在Assets的子文件夹里,要写成getAssets().open("子文件夹名/基础.txt")。
最后一招:看崩溃日志找根源
如果还是崩,打开Android Studio的Logcat,过滤“Error”级别,或者直接搜你的MainActivity类名,就能看到具体的崩溃原因(比如NullPointerException、FileNotFoundException),对着报错的行数改就行,这是排查问题最快的方法!
内容的提问来源于stack exchange,提问作者jagged_prospect




