Java JOptionPane.showInputDialog с конструктором

#java #arrays #constructor #joptionpane

#java #массивы #конструктор #joptionpane

Вопрос:

Первый пост, я надеюсь, что я, кажется, не ошибаюсь.

Я нахожусь в классе Java и столкнулся с проблемой.

Требование состоит в том, чтобы создать класс ( Contact ), который имеет методы получения и конструктор для name , email и phoneNumber . Затем тестовый класс ( TestContact ), который имеет while loop , который продолжает запрашивать пользователя, потому что нажал OK и ничего не ввел, нажал Ввод или имя более 21 символа.

Кроме того, три переменные, которые мне нужны (имя, адрес электронной почты и номер телефона), должны быть введены в одно и то же поле ввода (разделяются пробелом между ними).

Кажется, я не могу понять, как заставить его работать. У меня много ошибок.

Во-первых, я не уверен, как я могу настроить массив, а затем разделить его с помощью пробела, а затем использовать этот массив для установки моей переменной amp; getters (надеюсь, это имеет смысл?).

Кроме того, программа продолжает сбоить из-за NullPointerException исключения в массиве и индексе массива за пределами.

Класс контакта:

 public class Contact 
{
    //Initiating variables
    private String name;
    private String phoneNumber;
    private String eMail;
    //Constructor
    public Contact()
    {
        this.name = getName();
        this.phoneNumber = getPhoneNumber();
        this.eMail = getEMail();
    }
    //Getter for name variable
    public String getName()
    {
        return name;
    }
    //Getter for phoneNumber variable
    public String getPhoneNumber()
    {
        return phoneNumber;
    }
    //Getter for eMail variable
    public String getEMail()
    {
        return eMail;
    }
}
  

Класс TestContact:

 public class testContact 
{
    public static void main(String[] args) 
    {
        Contact myContact = new Contact();
        String userInput;
        String noUserInput;
        userInput = JOptionPane.showInputDialog("Please enter your First and Last Name, Phone Number, amp; E-mail: ");
        do  
        {   
            String[] phrases = userInput.split(" ");
            String name = phrases[0]   " "   phrases[1];
            String phoneNumber = phrases[2];
            String eMail = phrases[3];
            if (!userInput.equals(""))
                {   
                    if (name.length() > 21)
                    {
                        String userInput = JOptionPane.showInputDialog("I'm sorry but your name is too long.nPlease enter your First and Last Name, Phone Number, amp; E-mail: ");
                        String[] phrases = userInput.split(" ");
                        String name = phrases[0]   " "   phrases[1];
                        String phoneNumber = phrases[2];
                        String eMail = phrases[3];
                        JOptionPane.showMessageDialog(null, "Name: " myContact.getName() "nPhone Number: " myContact.getPhoneNumber() "nE-Mail: " myContact.getEMail());
                    }
                    else
                    {
                        JOptionPane.showMessageDialog(null, "Name: " name "nPhone Number: " phoneNumber "nE-Mail: " eMail);
                    }
                }
            while ((userInput = JOptionPane.showInputDialog("I'm sorry but you didn't enter anything.nPlease enter your First and Last Name, Phone Number, amp; E-mail: ")) == null)
            {   
                String[] phrases = userInput.split(" ");
                String name = phrases[0]   " "   phrases[1];
                String phone = phrases[2];
                String eMail = phrases[3];
                JOptionPane.showMessageDialog(null, "Name: " myContact.getName() "nPhone Number: " myContact.getPhoneNumber() "nE-Mail: " myContact.getEMail());
            }
        }while(userInput != null);
    }
}
  

ПРИМЕЧАНИЕ
Я изменил свой класс TestContact, чтобы сделать его немного приятнее, см. Ниже. Моя единственная проблема заключается в том, как установить метод с помощью того, что я проанализировал из строкового массива и поместил в строковые переменные. Как бы я установил их для конструктора??

 public class testContact 
{
    static String userInput;
    static Contact myContact = new Contact();
    public static void main(String[] args) 
    {
        do  
        {   
            parsing(initialInput());
            if (!userInput.equals(""))
                {   
                    if (myContact.getName().length() > 21)
                    {
                        parsing(nameLengthErrorInput());
                        output();
                    }
                    else
                    {
                        output();
                    }
                }
            else
            {
                parsing(nullErrorInput());
                output();
            }
        }while(userInput != null);
    }
    public static String initialInput()
    {
        userInput = JOptionPane.showInputDialog("Please enter your First and Last Name, Phone Number, amp; E-mail: ");
        return userInput;
    }
    public static String nameLengthErrorInput()
    {
        userInput = JOptionPane.showInputDialog("I'm sorry but your name is too long.nPlease enter your First and Last Name, Phone Number, amp; E-mail: ");
        return userInput;
    }
    public static String nullErrorInput()
    {
        userInput = JOptionPane.showInputDialog("I'm sorry but you didn't enter anything.nPlease enter your First and Last Name, Phone Number, amp; E-mail: ");
        return userInput;
    }
    public static void output()
    {
        JOptionPane.showMessageDialog(null, "Name: " myContact.getName() "nPhone Number: " myContact.getPhoneNumber() "nE-Mail: " myContact.getEMail());
    }
    public static void parsing(String userInput)
    {
        String[] phrases = userInput.split(" ");
        String name = phrases[0]   " "   phrases[1];
        String phoneNumber = phrases[2];
        String eMail = phrases[3];
    }
}
  

Теперь моя проблема заключается только в методе parsing().

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

1. «Кроме того, три переменные, которые мне нужны (имя, адрес электронной почты и номер телефона), должны быть введены в одно и то же поле ввода (разделяются пробелом между ними)». Я бы подумал, что это неправильный подход и увеличивает сложность до почти неуправляемого уровня. Вместо этого рассмотрите возможность запроса для каждого значения отдельно…

2. Не допускается. Назначение состоит в том, чтобы иметь одно диалоговое окно ввода и анализировать имя, номер телефона и электронную почту, разделяя пробелы, и продолжать спрашивать, нажимает ли пользователь ввод без данных или отменяет.

Ответ №1:

Есть две основные ошибки…

Первый…

В Contact конструкторе вы присваиваете переменные обратно самим себе…

 public Contact() {
    this.name = getName();
    this.phoneNumber = getPhoneNumber();
    this.eMail = getEMail();
}
  

Это почти то же самое, что сказать…

 public Contact() {
    this.name = this.name;
    this.phoneNumber = this.phoneNumber;
    this.eMail = this.eMail;
}
  

Результат тот же…

Второй…

Здесь вы получаете NullPointerException

 if (myContact.getName().length() > 21) {
  

Поскольку значению Contact#getName никогда не присваивалось (допустимое) значение

Предложения…

Первый…

Я бы предложил изменить Contact конструктор, чтобы требовать передачи ему значений…

 public Contact(String name, String phoneNumber, String eMail) {
    this.name = name;
    this.phoneNumber = phoneNumber;
    this.eMail = eMail;
}
  

Это будет означать, что…

 static Contact myContact = new Contact();
  

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

 static Contact myContact;
  

вместо этого…

Второй…

Я бы предложил изменить ваш parsing метод, чтобы возвращать Contact , например…

 public static Contact parsing(String userInput) {
    Contact contact = null;
    if (userInput != null amp;amp; userInput.trim().length() > 0) {
        String[] phrases = userInput.split(" ");
        if (phrases.length == 4) {
            String name = phrases[0]   " "   phrases[1];
            String phoneNumber = phrases[2];
            String eMail = phrases[3];
            contact = new Contact(name, phoneNumber, eMail);
        }
    }
    return contact;
}
  

Вы также должны быть защищены от недопустимого ввода.

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

 myContact = parsing(initialInput());
  

Третий…

Каждый раз, когда пользователю не удается ввести то, что вам нужно, вы должны просто отобразить сообщение об ошибке и ввести новую информацию, вы вроде как пытаетесь это сделать, но вы не используете существующую проверку ошибок для повторной проверки ввода…

 public static void main(String[] args) {
    String errorMsg = "";
    do {
        myContact = parsing(getInput(errorMsg));
        if (myContact != null) {
            if (myContact.getName().length() > 21) {
                myContact = null;
                errorMsg = "<html>I'm sorry but your name is too long.<br>";
            }
        } else {
            errorMsg = "<html>I'm sorry but you didn't enter anything.<br>";
        }
    } while (myContact == null);
    output();
}

public static String getInput(String errorMsg) {
    userInput = JOptionPane.showInputDialog(errorMsg   "Please enter your First and Last Name, Phone Number, amp; E-mail: ");
    return userInput;
}
  

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

1. Спасибо за помощь. Не похоже, что используются методы получения. Кроме того, мне не разрешено использовать HTML:/ Но это дало мне кое-что для обдумывания!

2. Все заработало, пришлось немного изменить код; но вы дали мне правильное направление! Огромное спасибо!

Ответ №2:

Итак, я только что отправил свою лабораторную работу, и это мое окончательное решение

Класс контакта:

 public class Contact 
{
    private String name;
    private String phoneNumber;
    private String eMail;
    public Contact(String name, String phoneNumber, String eMail) 
    {
        this.name = name;
        this.phoneNumber = phoneNumber;
        this.eMail = eMail;
    }
    public String getName()
    {
        return name;
    }
    public String getPhoneNumber()
    {
        return phoneNumber;
    }
    public String getEMail()
    {
        return eMail;
    }
}
  

Класс TestContact:

 import javax.swing.JOptionPane;
public class testContact 
{
    static Contact myContact;
    static Boolean exitBool = true;
    public static void main(String[] args) 
    {       
        myContact = parsing(initialInput());
        do  
        {               
            if (myContact != null)
                {   
                    if (myContact.getName().length() > 21)
                    {
                        myContact = parsing(nameLengthErrorInput());
                        exitBool = false;
                    }
                    else
                    {
                        exitBool = true;
                    }
                }
            else if (myContact == null)
            {
                myContact = parsing(nullErrorInput());
                exitBool = false;
                //output();
            }
        }while(exitBool == false);
        output();
    }    

    public static String initialInput()
    {
        userInput = JOptionPane.showInputDialog("Please enter your First and Last Name, Phone Number, amp; E-mail: ");
        return userInput;
    }

    public static String nameLengthErrorInput()
    {
        userInput = JOptionPane.showInputDialog("I'm sorry but your name is too long.nPlease enter your First and Last Name, Phone Number, amp; E-mail: ");
        return userInput;
    }

    public static String nullErrorInput()
    {
        userInput = JOptionPane.showInputDialog("I'm sorry but you didn't enter anything.nPlease enter your First and Last Name, Phone Number, amp; E-mail: ");
        return userInput;
    }

    public static void output()
    {
        JOptionPane.showMessageDialog(null, "Name: " myContact.getName() "nPhone Number: " myContact.getPhoneNumber() "nE-Mail: " myContact.getEMail());
    }

    public static Contact parsing(String userInput) {
        Contact contact = null;
        if (userInput != null amp;amp; userInput.trim().length() > 0) {
            String[] phrases = userInput.split(" ");
                String name = phrases[0]   " "   phrases[1];
                String phoneNumber = phrases[2];
                String eMail = phrases[3];
                contact = new Contact(name, phoneNumber, eMail);
        }
        return contact;
    }
}
  

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

1. Как правило, это не рекомендуется делать, помимо того, что это был просто массивный дамп кода, он не предоставляет информацию о том, почему это решение решает проблему под рукой…