Исключение нулевого указателя, не перехваченное в диалоге Java

#java #exception #try-catch

#java #исключение #попробуйте-перехват

Вопрос:

Я пытаюсь получить входные данные из диалогового окна Java и, похоже, не могу уловить NullPointerException , когда окно закрыто, кто-нибудь может помочь?

 private static final String DEFAULTNAME = "Player001"; 

public class Player implements Serializable
{
    private String name;
    private int score;

    public Player(String Pname,int Pscore)
    {
         name = Pname;
         score = Pscore;
    }
}

    try
    {
        person = new Player(JOptionPane.showInputDialog("Please enter your name"),0);
    }
    catch(NullPointerException e)
    {
        person = new Player(DEFAULTNAME,0);
    }
    catch(Throwable t)
    {
        person = new Player(DEFAULTNAME,0);
    }
  

Есть ли у кого-нибудь решение или есть способ сделать невозможным закрытие диалога?

Комментарии:

1. Для более быстрой справки отправьте SSCCE .

Ответ №1:

вам лучше проверить имя на наличие недопустимых значений, прежде чем добавлять его в

 String name = JOptionPane.showInputDialog("Please enter your name");
if(name == null || name.equals(""))name = DEFAULTNAME;
person = new Player(name,0);
  

Ответ №2:

Вы не «перехватываете» NPE, как вы делаете. Получите строку от пользователя, посмотрите, является ли она == null, а затем, если да, используйте имя проигрывателя по умолчанию. В псевдокоде:

 call JOptionPane and get player name
If player name is null
  create new Player with default name
else
  create new Player with the user-entered name.
  

Здесь нет необходимости в try / catch.

Другой способ решить это — позволить вашему конструктору Player принять нулевую строку и изменить ее на default:

 public Player(String Pname,int Pscore)
{
     name = (Pname == null || Pname.trim().isEmpty()) ? DEFAULT_NAME : Pname;
     score = Pscore;
}