2017-05-01 9 views
-1

私は自分のコードの中でいくつかの脆弱性をテストしていましたが、ユーザーに入力が無効なときに例外を投げて修正しようとしました。今私がtry-catchを実装し、私の電話でアプリケーションを実行すると、その無効な入力を入れるとクラッシュします。Androidスタジオ:try-catch例外がクラッシュするアプリケーション

私のコードは、addDataメソッドから例外をキャッチしないと仮定します。例外を実装する別の方法がありますか、またはaddDataメソッドから例外をキャッチする方法を教えてください。

package com.odisee.photoboothapp; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.RadioButton; 
import android.widget.RadioGroup; 
import android.widget.EditText; 
import android.widget.Toast; 

import com.odisee.photoboothapp.fontchanger.FontChangeTextView; 

public class Form_Database extends AppCompatActivity { 
DatabaseHelper myDb; 

int selectedId; 
RadioGroup test; 
RadioButton editEducation; 
EditText editName, editSurname, editEmail; 
Button btnAddData; 

@Override 
protected void onCreate(Bundle savedInstanceState) throws IllegalArgumentException { 
    super.onCreate(savedInstanceState); 
    getSupportActionBar().hide(); 
    setContentView(R.layout.activity_form__database); 

    myDb = new DatabaseHelper(this); 

    test = (RadioGroup)findViewById(R.id.radioButtonChoice); 

    editName = (EditText)findViewById(R.id.edit_Name); 
    editSurname = (EditText)findViewById(R.id.edit_Surname); 
    editEmail = (EditText)findViewById(R.id.edit_Email); 


    btnAddData = (Button)findViewById(R.id.btnSend); 
    try { 
     addData(); 
    } 
    catch(IllegalArgumentException e) { 
     Toast.makeText(Form_Database.this,"Data not inserted" + e.getMessage(),Toast.LENGTH_LONG).show(); 
    } 
} 

public void addData() { 
    btnAddData.setOnClickListener(
      new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
         if(editName.getText().toString().contains("DROP")) { 
          throw new IllegalArgumentException("SQL Exceptie!"); 
         } 
         else { 

          selectedId = test.getCheckedRadioButtonId(); 
          editEducation = (RadioButton)findViewById(selectedId); 
          boolean isInserted = myDb.insertData(editName.getText().toString(), editSurname.getText().toString(), editEmail.getText().toString(), editEducation.getText().toString()); 

          sendEmail(); 

          if(isInserted == true) { 
           Toast.makeText(Form_Database.this,"Data inserted",Toast.LENGTH_LONG).show(); 
          } 
          else { 
           Toast.makeText(Form_Database.this,"Data not inserted",Toast.LENGTH_LONG).show(); 
          } 
         } 
       } 
      } 
    ); 
} 

public void sendEmail() { 
    //Getting content for email 
    String email = editEmail.getText().toString(); 
    String subject = "testberichtje voor lorenzo"; 
    String message = "testberichtje voor lorenzo"; 

    //Creating SendMail object 
    SendMail sm = new SendMail(this, email, subject, message); 

    //Executing sendmail to send email 
    sm.execute(); 
} 

} 

05-01 17:58:17.021 30232から30232/com.odisee.photoboothapp E/AndroidRuntime:致命的な例外:メイン プロセス:com.odisee.photoboothapp、PID:30232 れるjava.lang .IllegalArgumentException:SQL Exceptie! android.widget.TextView.performClickでandroid.view.View.performClickでcom.odisee.photoboothapp.Form_Database $ 1.onClick(Form_Database.java:55) (View.java:5697) (TextView.java:10826で ) android.view.View $ PerformClick.run(View.java:22526) (android.os.Handler.handleCallback(Handler.java:739)) (android.os.Handler.dispatchMessage(Handler.java:95))にあります。 ) android.os.Looper.loop(Looper.java:158) とandroid.app.ActivityThread.main(ActivityThread.java:7224) at java.lang.reflect.Method.invoke(ネイティブメソッド)com.android.internal.os.ZygoteInit.mainでcom.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1230) (ZygoteInit.java:1120)

+2

どのようなエラーでクラッシュしますか?構文エラーでない限り、try/catch自体はクラッシュしません。 – Carcigenicate

+0

@Carcigenicate私のアプリケーションのgradleファイルは完全に構築されています。アプリは例外を入れる前に完全に実行されました。だからそれ以外の何かになることはできません。フォームの入力行の中に文字列 "DROP"を入れて、 "SEND"ボタンをクリックします。それはちょうどクラッシュし、 "Nameappが停止した"と言います。 – Lorenzo

+0

スタックトレースをアップロードできますか?基本的に何が間違っているのかは分かりません。 –

答えて

1

問題があり、あなたがあなたの例外をラップしていないしやすいコード:あなたが問題を見ることができるので、あなたが実際にエラーをキャッチすることができますので、より一般的な漁獲量は、その後、スタックトレースを出力します。 OnClickListenerButtonに設定しました。これがテストされている唯一の部分です。

実際のボタン押下は非同期であり、テストされたコードブロックでは行われません。

実際には例外はありません。通常のアプリケーションフローを制御するために例外を使用しないでください。あなたの場合は、禁止されたキーワードを使用したことをユーザーに説明するToastを表示するだけです。

+0

私はそれを知らなかった! Androidアプリケーションをプログラミングしている最初のアプリケーションです。まともな、安全で良いプログラムフロー/コードを作成することについては、まだ多くを学ぶ必要があります。 アドバイスをいただきありがとうございます。 – Lorenzo

1

作ってみましょうで3210 try-catch句で

catch(Exception ex) { 
    Log.e(TAG, "EXCEPTION CAUGHT WHILE EXECUTING DATABASE TRANSACTION") 
    ex.printStackTrace(); 
} 
関連する問題