Android Studio:Try-catch异常使应用程序崩溃



我正在测试代码中的一些漏洞,并试图通过在用户输入无效时抛出异常来修复它们。现在,当我实现 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/Android运行时:致命 例外:主要 进程: com.odisee.photoboothapp, PID: 30232 java.lang.IllegalArgumentException: SQL Exceptie! 点击com.odisee.photoboothapp.Form_Database$1.onClick(Form_Database.java:55) at android.view.view.performClick(View.java:5697) at android.widget.TextView.performClick(TextView.java:10826) at android.view.View$PerformClick.run(View.java:22526) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:158) at android.app.ActivityThread.main(ActivityThread.java:7224) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

尝试使捕获更通用,以便实际捕获错误,然后打印堆栈跟踪,以便可以看到问题:

try{
//Try to do something on here
}catch(Exception error1) {
Log.e(TAG, "The exception caught while executing the process. (error1)")
error1.printStackTrace();
}

问题是,您没有将容易出现异常的代码包装在try-catch子句中。您已将OnClickListener设置为Button,这是唯一正在测试的部分。

实际的按钮按下是异步的,它们不会在测试的代码块中进行。

实际上,您在这里不需要异常 - 异常不应用于控制正常的应用程序流。在您的情况下,您要做的就是显示一个Toast,向用户解释他们使用了禁止的关键字。

最新更新