#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. Как правило, это не рекомендуется делать, помимо того, что это был просто массивный дамп кода, он не предоставляет информацию о том, почему это решение решает проблему под рукой…