【问题标题】:Try Catch not Catching Exception尝试捕获不捕获异常
【发布时间】:2013-08-01 10:48:07
【问题描述】:

如果网络调用不可用,我正在尝试阻止应用崩溃。

如果网络调用可用,那么我想单击按钮继续进入下一个活动。捕获的内容应该显示祝酒词。

但是应用程序仍然崩溃而不是显示 toast

这是我的代码:-

public void GoToStation(View v)
{

        try {

            Intent myIntent = new Intent(
                             MainActivity.this, CustomizedListViewStation.class);
            startActivityForResult(myIntent, 0);
        } catch (Exception myIntent) {
            // TODO Auto-generated catch block
            Context context = getApplicationContext();
            CharSequence text = "There is no data for this Community";
            int duration = Toast.LENGTH_LONG;
            Toast toast = Toast.makeText(context, text, duration);
            toast.show();
        }

LOGCAT:-

08-01 12:36:56.944: E/AndroidRuntime(32556): FATAL EXCEPTION: main
08-01 12:36:56.944: E/AndroidRuntime(32556): java.lang.RuntimeException: Unable to start     activity     ComponentInfo{police.uk.greatermanchesterpoliceandroid/police.uk.greatermanchesterpoliceandroid.CustomizedListViewStation}: android.os.NetworkOnMainThreadException
08-01 12:36:56.944: E/AndroidRuntime(32556):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2100)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at android.app.ActivityThread.access$600(ActivityThread.java:140)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at android.os.Looper.loop(Looper.java:137)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at android.app.ActivityThread.main(ActivityThread.java:4898)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at java.lang.reflect.Method.invokeNative(Native Method)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at java.lang.reflect.Method.invoke(Method.java:511)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at dalvik.system.NativeStart.main(Native Method)
08-01 12:36:56.944: E/AndroidRuntime(32556): Caused by: android.os.NetworkOnMainThreadException
08-01 12:36:56.944: E/AndroidRuntime(32556):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at java.net.InetAddress.getAllByName(InetAddress.java:214)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:670)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:509)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at police.uk.greatermanchesterpoliceandroid.XMLParser.getXmlFromUrl(XMLParser.java:45)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at police.uk.greatermanchesterpoliceandroid.CustomizedListViewStation.onCreate(CustomizedListViewStation.java:108)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at android.app.Activity.performCreate(Activity.java:5206)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
08-01 12:36:56.944: E/AndroidRuntime(32556):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2064)
08-01 12:36:56.944: E/AndroidRuntime(32556):    ... 11 more
08-01 12:37:05.694: I/Process(32556): Sending signal. PID: 32556 SIG: 9

【问题讨论】:

  • 您是否遇到任何错误?
  • 你试过调试了吗?
  • 为什么在打开下一个活动之前不检查连接?
  • Somesh - 该错误是我预期的网络主线程错误,但如果是这种情况,我想敬酒。
  • 例外应该是ActivityNotFoundException!!

标签: android try-catch toast


【解决方案1】:

而不是先检查互联网连接。删除 try-catch 块并在 if 代码中调用 isOnline 函数 -> if(isOnline()){} :

public boolean isOnline() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnectedOrConnecting()) {
        return true;
    }
    return false;
}

用这个替换你的try-catch:

if (isOnline()){
    Intent myIntent = new Intent(MainActivity.this, CustomizedListViewStation.class);
    startActivityForResult(myIntent, 0);
} 

else {            
    Context context = getApplicationContext();
    CharSequence text = "There is no data for this Community";
    int duration = Toast.LENGTH_LONG;
    Toast toast = Toast.makeText(context, text, duration);
    toast.show();
}

【讨论】:

  • 我对如何实现 ifisonline 有点困惑。我在布局中有一个带有 onclick 的按钮。我怎样才能做到这一点?
  • 检查更新的答案以实现它。只需将您的 try-catch 替换为我编写的代码
  • SC 先生。对不起朋友,但单击按钮时应用程序仍然崩溃。很奇怪。有什么想法吗?
  • 可以发一下logcat吗?
【解决方案2】:

如果您 200% 确定需要在主线程中进行网络活动,请使用此选项,请使用:

if (android.os.Build.VERSION.SDK_INT > 9) {
  StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
  StrictMode.setThreadPolicy(policy);
}

否则,看看ThreadsAsyncTasks

【讨论】:

  • FD_ 这看起来像我需要的。这会放在哪里?
  • 在你的 Activity 的 onCreate 中。但是,请注意这是不好的做法,从长远来看,您应该考虑将网络代码移到后台线程中。
  • 这是否会影响我的应用在 Play 商店中获得批准?
  • 没有像 Apple 的 App Store 那样的 Play Store 审核团队。他们真的不关心您使用的技术等
  • 虽然这可以解决您的问题,但这是一个非常糟糕的主意。您的用户很可能会收到应用无响应 (ANR) 消息,这将导致他们强制关闭应用并可能在 Play 商店中收到负面的 cmets。虽然这样做不会导致应用从 Play 商店下架,但 Google 绝不会宣传您的应用,因为他们希望应用按照开发指南开发
【解决方案3】:

这是因为您在主线程上运行代码,所以它抛出了NetworkOnMainThreadException。这不在您的代码中,因此您无法捕获它,也不应该尝试捕获它,因为您的应用程序将永远无法工作,因为由于此错误,它永远不会尝试建立网络连接。

您需要在单独的线程(例如 ASyncTask)中执行网络活动,并且不会再引发此异常。

此异常的原因是网络活动通常会导致应用程序出现延迟,因为网络调用往往会阻塞,直到它们完成。如果在主线程上执行网络活动,您的应用程序的用户可能会收到 ANR(应用程序无响应)消息,这意味着用户可以强制关闭您的应用程序,因为它看起来好像您的应用程序不再响应任何内容在后台它正在做网络活动。

【讨论】:

    猜你喜欢
    • 2014-05-11
    • 2020-07-31
    • 1970-01-01
    • 2021-12-13
    • 2011-12-05
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多