web-dev-qa-db-ja.com

例外をキャッチして処理する方法android

GetBitmapメソッドを使用して画像を表示しています。これをメソッドとして使用しているため、ビットマップを返す場合は画像を表示しますが、nullを返す場合は例外をキャッチします。ただし、入力されたURLも間違っている場合は、FileNotFoundExceptionを処理する必要があります。 2つの例外を処理してUIに表示する方法

public Bitmap getBitmap(final String src) {

        try {
              InputStream stream = null;
              URL url = new URL(src);
         Java.net.URL url = new Java.net.URL(src);
              URLConnection connection = url.openConnection();

            InputStream input = connection.getInputStream();
            myBitmaps = BitmapFactory.decodeStream(input);    
           return myBitmaps;        
         } catch (IOException e) {
            e.printStackTrace(); 
            Log.e("IO","IO"+e);
            return null;
        } 
        catch(OutOfMemoryError e1) {
             e1.printStackTrace();  
             Log.e("Memory exceptions","exceptions"+e1);
             return null;
        }
        }

活動では、私はこのように与えました

    Bitmap filename=service.getBitmap(url_box.getText().toString());
    if(file_name!=null)
        {
          displaybitmap(file_name);
        } 
    else
       {  //Toast.makeText("Memory Error");
       //my question is how to handle two exception in UI where memory error and also 
      // when entered url is wrong, file not found exceptions also to handle.
        }          
8
Shadow

本当に、これはお勧めしません...

try {
     ...
} catch (Exception e) {
     // This will catch any exception, because they are all descended from Exception
     System.out.println("Error " + e.getMessage());
     return null;
}

問題をデバッグするためにスタックトレースを見ていますか?それらを追跡することは難しくありません。 LogCatを見て、赤いテキストの大きなブロックを確認して、クラッシュの原因となったメソッドとエラーを確認します。

この方法ですべてのエラーをキャッチすると、プログラムは期待どおりに動作せず、ユーザーがレポートしたときにAndroid Marketからエラーレポートが届きません。

UncaughtExceptionHandlerを使用して、いくつかのクラッシュを防ぐことができます。私は1つを使用していますが、コンピューターから離れた電話でアプリをデバッグしているときのために、スタックトレースをファイルに出力するためだけに使用します。しかし、キャッチした例外をデフォルトのAndroid UncaughtExceptionHandlerに渡しました。これは、Androidで正しく処理できるようにするためです。ユーザーにスタックトレースを送信する機会を与えます。

8
Jebasuthan

キャッチ式を確認する

catch (IOException e) {
        e.printStackTrace(); 
        Log.e("IO","IO"+e);
        return null;
    } 
    catch(OutOfMemoryError e1) {
         e1.printStackTrace();  
         Log.e("Memory exceptions","exceptions"+e1);
         return null;
    }

ここでは、両方の例外でnullを返しています。私の提案はこれらのcatch句で変数を初期化するであり、アクティビティメソッドでその変数の値を確認します。

このような

 String exceptionName="";
 catch (IOException e) {
            e.printStackTrace(); 
            Log.e("IO","IO"+e);
            exceptionName="IOException";
            return null;

        } 
        catch(OutOfMemoryError e1) {
             e1.printStackTrace();  
             Log.e("Memory exceptions","exceptions"+e1);
             exceptionName="OutOfMemoryError";
             return null;
        }

今あなたの活動中

 Bitmap filename=service.getBitmap(url_box.getText().toString());
    if(file_name!=null)
        {
          displaybitmap(file_name);
        } 
    else
       {  //Toast.makeText("Memory Error");
       //my question is how to handle two exception in UI where memory error and also 
      // when entered url is wrong, file not found exceptions also to handle.

        if (exceptionName.equals("OutOfMemoryError")) {
            // Handle here  
        }
    else{
      // Handle here

        }

        }
2
Jitender Dev

あなたの解像度からデフォルトのビットマップを返します。しかし、ビットマップを操作するためのUniversal Image Loaderと呼ばれる非常に優れたライブラリがありますので、チェックしてください。

1
user3057944

代わりにgetBitmapメソッドから例外をスローし、クライアント(アクティビティ)が例外を処理できるようにします。この場合、ビットマップまたは例外を受け取り、return nullビットマップをスキップして、 "代わりに、例外/エラーの場合(これはnullケースであるため)、catchブロックの「デフォルトのビットマップ読み込み」。

public Bitmap getBitmap(final String src) throws FileNotFoundException,
        OutOfMemoryError, IOException, MalformedURLException {
    URL url = new URL(src);
    URLConnection connection = url.openConnection();
    InputStream input = connection.getInputStream();
    return BitmapFactory.decodeStream(input);
}
0
Magnus