Excepción de puntero nulo:No se pueden enumerar archivos en un directorio
-
21-12-2019 - |
Pregunta
Por favor, eche un vistazo al siguiente código.
private class OpenFileEvent implements OnClickListener
{
LinearLayout openFileDialogView = (LinearLayout)findViewById(R.id.open_file_dialog);
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
final Dialog openFileDialog = new Dialog(Notes.this);
openFileDialog.setTitle("Open File");
openFileDialog.setContentView(R.layout.open_dialog);
//First, list all the available Files
File folder = new File(Environment.getExternalStorageDirectory()+"/Main Notes/Notes");
File[] fileNameList = folder.listFiles();
if(fileNameList.length>0 && fileNameList!=null)
{
for(int i=0;i<fileNameList.length;i++)
{
//Get the sub views first
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View openThisFileView = inflater.inflate(R.layout.open_dialog_file, null);
Button openThisFileButton = (Button)openThisFileView.findViewById(R.id.open_this_file_button);
Button appendThisFileButton = (Button)openThisFileView.findViewById(R.id.append_note_this_file);
TextView openThisFileNameTxt = (TextView)openThisFileView.findViewById(R.id.open_this_file_name);
//Set the Text
openThisFileNameTxt.setText(fileNameList[i].getName());
//Set the Listeners
//Add the View
openFileDialogView.addView(openThisFileView);
}
}
//Show the Dialog
openFileDialog.show();
}
}
Tan pronto como ejecuto este código, aparece el siguiente error
11-17 17:31:18.681: E/AndroidRuntime(4868): FATAL EXCEPTION: main
11-17 17:31:18.681: E/AndroidRuntime(4868): java.lang.NullPointerException
11-17 17:31:18.681: E/AndroidRuntime(4868): at com.a.Notter.Notes$OpenFileEvent.onClick(Notes.java:203)
11-17 17:31:18.681: E/AndroidRuntime(4868): at android.view.View.performClick(View.java:4204)
11-17 17:31:18.681: E/AndroidRuntime(4868): at android.view.View$PerformClick.run(View.java:17355)
11-17 17:31:18.681: E/AndroidRuntime(4868): at android.os.Handler.handleCallback(Handler.java:725)
11-17 17:31:18.681: E/AndroidRuntime(4868): at android.os.Handler.dispatchMessage(Handler.java:92)
11-17 17:31:18.681: E/AndroidRuntime(4868): at android.os.Looper.loop(Looper.java:137)
11-17 17:31:18.681: E/AndroidRuntime(4868): at android.app.ActivityThread.main(ActivityThread.java:5041)
11-17 17:31:18.681: E/AndroidRuntime(4868): at java.lang.reflect.Method.invokeNative(Native Method)
11-17 17:31:18.681: E/AndroidRuntime(4868): at java.lang.reflect.Method.invoke(Method.java:511)
11-17 17:31:18.681: E/AndroidRuntime(4868): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
11-17 17:31:18.681: E/AndroidRuntime(4868): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
11-17 17:31:18.681: E/AndroidRuntime(4868): at dalvik.system.NativeStart.main(Native Method)
Este error ocurre aquí, donde he manejado el NULL
también
if(fileNameList.length>0 && fileNameList!=null)
¿Que está sucediendo aquí?
Solución
La primera condición evaluada será la duración del fileNameList
.O si fileNameList
es null
lanzará un NPE
porque intentas primero acceder a su length
atributo.
Debes invertir tu condición:
if(fineNameList != null && fileNameList.length>0)
Por qué ?
Estos operadores exhiben un comportamiento de "cortocircuito", lo que significa que el segundo operando se evalúa solo si es necesario.
Así que si fileNameList
es null
el segundo operando no será evaluado y por lo tanto evitarás lanzar un NPE
.
Otros consejos
Deberías usar
if(fileNameList!=null && fileNameList.length>0)
de lo contrario tienes un NullPointerException
debido a fileNameList.length
dónde fileNameList
es NULL
.