You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android点击带伞查询按钮触发Fatal Exception原因排查

问题描述

开发Android降雨提醒应用时,点击查询按钮触发致命崩溃。应用逻辑为通过jsoup库抓取当日降雨概率,概率≥50%时提示带伞,否则提示无需带伞,对应实现代码如下:

package com.example.doineedanumbrellatoday;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import android.view.View;
import android.widget.*;
import java.io.IOException;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    TextView txtview;
    Button button;

    public MainActivity() throws IOException {
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        txtview = (TextView)findViewById(R.id.text);
        button = (Button)findViewById(R.id.button);
        button.setOnClickListener(this);
    }


    @Override
    public void onClick(View view) {
        if(view.getId()==R.id.button){
            Document doc= null;
            try {
                doc = Jsoup.connect("https://dalivali.bg/?location=222").timeout(6000).get();

            } catch (IOException e) {
                e.printStackTrace();
            }
            org.jsoup.select.Elements rain = doc.select("span.rain-num");
            char[] chars2 = rain.toString().toCharArray();
            StringBuilder chance = new StringBuilder();

            for(char c : chars2){
                if(Character.isDigit(c)){
                    chance.append(c);
                }
            }
            if(Integer.parseInt(chance.toString())>=50) {
                txtview.setText("Yes");
            } else {
                txtview.setText("No");
            }
        }
    }
}
触发异常的具体原因

代码存在多处致命问题,按触发概率从高到低排列:

  • 主线程执行网络请求违反系统强制规则:Android 3.0及以上版本默认禁止在UI主线程执行同步网络操作,按钮点击的onClick回调默认运行在主线程,Jsoup.connect().get()是阻塞式同步网络请求,会直接抛出NetworkOnMainThreadException,这是点击按钮立刻崩溃的核心原因。
  • 空指针异常:网络请求逻辑被包裹在try-catch块中,若出现断网、连接超时、目标站点不可达等情况,doc对象会保持初始的null值,但catch块仅打印错误堆栈,没有中断后续逻辑执行,后续调用doc.select()时会直接抛出NullPointerException。
  • 数字格式转换异常:当前提取降雨概率的逻辑是遍历DOM元素的字符串内容拼接数字,如果未匹配到span.rain-num对应节点、或目标站点页面结构调整导致提取不到有效数字,chance.toString()会是空字符串,传入Integer.parseInt()时会直接抛出NumberFormatException。
  • Activity构造方法写法违规:Android的Activity实例由系统托管创建,不允许自定义声明抛出受检异常的无参构造方法,代码中编写的public MainActivity() throws IOException {}不符合组件初始化规则,可能在应用启动阶段就触发崩溃。

内容的提问来源于stack exchange,提问作者muddypuddle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 08:27:24