#java #android #android-studio #runtime-error
#java #Android #android-studio #время выполнения-ошибка
Вопрос:
Пользователь должен выбрать домен, в котором он разбирается в «Математике» или «Информации», а затем в списке будет показан список предметов в зависимости от выбранного им домена и его уровня. Но когда пользователь выбирает одну из тем и нажимает на кнопку «ОК», я получаю эту ошибку:
D / AndroidRuntime: завершение работы виртуальной машины E / AndroidRuntime: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основной процесс: android.example.easya, PID: 1153 java.lang.Исключение NullPointerException: попытка вызвать виртуальный метод ‘void android.widget.TextView.setText(java.lang.Последовательность символов)’ для ссылки на нулевой объект в android.example.easya.edit_profil_vol$2 $2.onClick(edit_profil_vol.java:223) в androidx.appcompat.app.AlertController $ButtonHandler.handleMessage(AlertController.java: 167) в android.os.Handler.DispatchMessage(Handler.java: 109) в android.os.Looper.loop(Looper.java: 166) в android.app.ActivityThread.main(ActivityThread.java:7555) в java.lang.reflect.Метод.invoke(собственный метод) в com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:469) в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:963)
Вот код проблемы с кнопками «OK» и «ОЧИСТИТЬ», хотя я уже использовал ту же программу для сохранения пользовательских данных раньше, когда ему нужно было зарегистрироваться:
ВОТ КОД ДЛЯ ВСЕЙ ОПЕРАЦИИ
FirebaseDatabase rootNode;
DatabaseReference reference;
TextInputEditText regnom_vol,regnum_vol,regmail_vol,regpassword_vol;
Spinner regniveau_vol;
Button mod_maths, mod_info;
//text des modules selectionnes par le volontaire pour chaque discipline
TextView mod_maths_selected, mod_info_selected;
//liste des modules en maths a partir de lesquelles le volontaire va selectionner
//LISTE DES MODULES DE MATHS
String[] listModMaths_lc;
String[] listModMaths_ma;
String[] listModMaths_doc;
String[] listModMaths;
//LISTE DES MODULES D'INFO
String[] listModInfo_lc;
String[] listModInfo_ma;
String[] listModInfo_doc;
String[] listModInfo;
//les element selectionne considere true
boolean[] chekedmodMaths;
boolean[] chekedmodInfo;
//La liste de modules selectionnes
ArrayList<Integer> modVol_Maths = new ArrayList<>();
ArrayList<Integer> modVol_Info = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.enregistrer_vol);
mod_maths = findViewById(R.id.modules_maths);
mod_info = findViewById(R.id.modules_info);
mod_maths_selected = findViewById(R.id.selected_maths_mod);
mod_info_selected = findViewById(R.id.selected_info_mod);
regniveau_vol = findViewById(R.id.niveau_volontaire);
//SELECTIONNER LE NIVEAU DU VOLONTAIRE
List<String> niveau_Vol = new ArrayList<>();
niveau_Vol.add(0, "Seclectionnez votre niveau d'etude");
niveau_Vol.add("Licence");
niveau_Vol.add("Master");
niveau_Vol.add("Doctorat");
//styler le spinner
ArrayAdapter<String> data;
data = new ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, niveau_Vol);
data.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
//RECUPERATION DES LISTES DE MODULES SELON LE NIVEAU DU STRING.XML
listModMaths_lc = getResources().getStringArray(R.array.Maths_LC);
listModMaths_ma = getResources().getStringArray(R.array.Maths_MA);
listModMaths_doc = getResources().getStringArray(R.array.Maths_DOC);
//////////INFORMATIQUE///////////////////////////////////////////////
listModInfo_lc = getResources().getStringArray(R.array.Info_LC);
listModInfo_ma = getResources().getStringArray(R.array.Info_MA);
listModInfo_doc = getResources().getStringArray(R.array.Info_DOC);
//Attacher data au spinnner (niveau etd)
regniveau_vol.setAdapter(data);
regniveau_vol.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{
if (parent.getItemAtPosition(position).equals("Selectionnez votre niveau d'etude")) {
//On ne va rien faire
} else {
//ON selectionne un niveau
String niv = parent.getItemAtPosition(position).toString();
//Afficher toast message du niveau selectionne
Toast.makeText(parent.getContext(), "Vous etes en " niv, Toast.LENGTH_SHORT).show();
if(parent.getItemAtPosition(position).toString().equals("Licence"))
{
listModMaths= listModMaths_lc;
listModInfo= listModInfo_lc;
}
else if(parent.getItemAtPosition(position).equals("Master"))
{
listModMaths=listModMaths_ma;
listModInfo= listModInfo_ma;
}
else
{
listModMaths= listModMaths_doc;
listModInfo= listModInfo_doc;
}
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
if (regniveau_vol.getSelectedItem().toString().equals(""))
{
}
}
});
//LES BOUTONS OK CLEAR ALL ET CANCEL DE LISTE DES MODULES A COCHER
mod_maths.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder mBuilder = new AlertDialog.Builder(enregistrer_vol.this);
mBuilder.setTitle("Modules : Maths");
mBuilder.setMultiChoiceItems(listModMaths, chekedmodMaths, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int position, boolean isChecked) {
//tester si le module est selectionne
if (isChecked) {
if (!modVol_Maths.contains(position))//si l'element courant ne fait partie de laliste des modules selectionne il faut l'ajouter
{
modVol_Maths.add(position);
} else //Si l'element selectionne fait partie deja de la liste des modules selectionnees apr le volontaire
{
modVol_Maths.remove(position);
}
}
}
});
//Le bouton OK
mBuilder.setCancelable(false);
mBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String module = "";//Cette chaine de caractere va contenir la liste des modules qui se trouve dans la liste des modules selectionnes
for (int i = 0; i < modVol_Maths.size(); i ) {
module = module listModMaths[modVol_Maths.get(i)];
if (i != modVol_Maths.size() - 1)//si l'element a la position i n'est pas le dernier on va faire un retour a la ligne
{
module = module "n ";
}
}
mod_maths_selected.setText(module);
}
});
mBuilder.setNegativeButton("Annuler", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
mBuilder.setNeutralButton("Clear", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
for (int i = 0; i < chekedmodMaths.length; i )//Verifier la liste des elements selectionne pour effacer la selection
{
chekedmodMaths[i] = false;
modVol_Maths.clear();//clear item in this list
mod_maths_selected.setText("");//changer le text des modules selectionnes apres avoir supprimer certains
}
}
});
AlertDialog mDialog = mBuilder.create();
mDialog.show();
}
});
//LES BOUTONS OK CLEAR ALL ET CANCEL DE LISTE DES MODULES A COCHER
mod_info.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder mBuilder = new AlertDialog.Builder(enregistrer_vol.this);
mBuilder.setTitle("Modules : Informatique");
mBuilder.setMultiChoiceItems(listModInfo, chekedmodInfo, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int position, boolean isChecked) {
//tester si le module est selectionne
if (isChecked) {
if (!modVol_Info.contains(position))//si l'element courant ne fait partie de la liste des modules selectionne il faut l'ajouter
{
modVol_Info.add(position);
} else //Si l'element selectionne fait partie deja de la liste des modules selectionnees apr le volontaire
{
modVol_Info.remove(position);
}
}
}
});
//Le bouton OK
mBuilder.setCancelable(false);
mBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String module_info = "";//Cette chaine de caractere va contenir la liste des modules qui se trouve dans la liste des modules selectionnes
for (int i = 0; i < modVol_Info.size(); i ) {
module_info = module_info listModInfo[modVol_Info.get(i)];
if (i != modVol_Info.size() - 1)//si l'element a la position i n'est pas le dernier on va faire un retour a la ligne
{
module_info = module_info "n ";
}
}
mod_info_selected.setText(module_info);
}
});
mBuilder.setNegativeButton("Annuler", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
mBuilder.setNeutralButton("Clear", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
for (int i = 0; i < chekedmodInfo.length; i )//Verifier la liste des elements selectionne pour effacer la selection
{
chekedmodInfo[i] = false;
modVol_Info.clear();//clear item in this list
mod_info_selected.setText("");//changer le text des modules selectionnes apres avoir supprimer certains
}
}
});
AlertDialog mDialog = mBuilder.create();
mDialog.show();
}
});
// Donnees du xml a la l'activite "enregistrer_vol"
regnom_vol = findViewById(R.id.nom_vol);
regnum_vol = findViewById(R.id.num_vol);
regpassword_vol = findViewById(R.id.password_vol);
regmail_vol = findViewById(R.id.mail_vol);
regniveau_vol = findViewById(R.id.niveau_volontaire);
}
//Validation des donnees etd
private Boolean validate_name() {
String val = regnom_vol.getText().toString();
if (val.isEmpty()) {
regnom_vol.setError("Champs obligatoire");//affiche le message d'erreur si le champs est vide
return false;
} else {
regnom_vol.setError(null);
return true;
}
}
private Boolean validate_mail() {
String val = regmail_vol.getText().toString();
String mail_syntaxe = "[a-zA-Z0-9._-] @[a-z] \. [a-z] ";
if (val.isEmpty()) {
regmail_vol.setError("Champs obligatoire");//affiche le message d'erreur si le champs est vide
return false;
} else if (!val.matches(mail_syntaxe)) {
regmail_vol.setError("Adresse mail non valide");//affiche le message d'erreur si la syntaxe du mail est fausse
return false;
} else {
regmail_vol.setError(null);
// nom.setErrorEnabled(false);// remove the error message after
return true;
}
}
private Boolean validate_password() {
String val = regpassword_vol.getText().toString();
String password_syntaxe = ".{4,}"; //au moins 4 caracteres n'impote lesquels
if (val.isEmpty()) {
regpassword_vol.setError("Champs obligatoire");//affiche le message d'erreur si le champs est vide
return false;
} else if (!val.matches(password_syntaxe)) {
regpassword_vol.setError("Mot de passe faible");//affiche le message d'erreur si la syntaxe du mail est fausse
return false;
} else {
regpassword_vol.setError(null);
return true;
}
}
private Boolean validate_num() {
String val = regnum_vol.getText().toString();
if (val.isEmpty()) {
regnum_vol.setError("Champs obligatoire");//affiche le message d'erreur si le champs est vide
return false;
} else {
regnum_vol.setError(null);
return true;
}
}
public void register_vol(View view)
{
if(!validate_name() | !validate_num()| !validate_mail()| !validate_password())
return;
else
{
rootNode = FirebaseDatabase.getInstance();
reference = rootNode.getReference("vol");
//getting all the values
String name = regnom_vol.getText().toString();
String mail = regmail_vol.getText().toString();
String password = regpassword_vol.getText().toString();
String num = regnum_vol.getText().toString();
String niveau = regniveau_vol.getSelectedItem().toString();
String maths= mod_maths_selected.getText().toString();
String info= mod_info_selected.getText().toString();
Volontaires volontaire= new Volontaires(name,num,niveau,mail,password,maths,info);
reference.child(num).setValue(volontaire);
//Afficher profil volontaire
startActivity(new Intent(enregistrer_vol.this,identification_fragment.class));
}
}
}
Комментарии:
1. Я считаю, что здесь
AlertDialog.Builder mBuilder = new AlertDialog.Builder(edit_profil_vol.this);
вам следует использовать контекст вашей активности / фрагмента. также, пожалуйста, покажите весь ваш код этого действия / фрагмента.
Ответ №1:
Вы инициализировали объект mod_info_selected?
Вы должны получить это представление из макета.. в настоящее время у вас есть такая строка
mod_info_selected = findViewById(R.id.mod_info_selected)
И именно поэтому ваше приложение разбилось
Комментарии:
1. mod_info_selected — это TextView, как я должен его инициализировать?
2. Я только что обновил свой ответ. Теперь это должно быть ясно
3. Да, у меня уже есть эта строка, как я уже сказал, этот код отлично работает при регистрации, но здесь нет, он каждый раз вылетает
4. @DidyouknowTHAT У вас НЕТ этой плитки в коде, который вы опубликовали.
5. Я просто публикую весь код действия