Isolating all the checks in guard clauses right at the beginning of your function makes the logic much clearer.
Example
Using nested conditionals:
if (file != null && file.isAFile()){
if (user != null && user.isLogged()){
if (user.isAdmin()){
if (page != null && page.isAnInteger && page > 0){
text = file.read();
return getPageFromText(text, page);
} else {
return "Invalid page."
}
} else {
return "User does not have sufficient privileges."
}
} else {
return "Invalid user."
}
} else {
return "Invalid file.";
}
Using guard clauses:
if (file == null || !file.isAFile()){
return "Invalid file.";
}
if (user == null || !user.isLogged()){
return "Invalid user."
}
if (!user.isAdmin()){
return "User does not have sufficient privileges."
}
if (page == null || !page.isAnInteger || page <= 0){
return "Invalid page."
}
text = file.read();
return getPageFromText(text, page);