Mankind задача от Inheritance
Здравейте, някой може ли да хвърли едно око на тази задача. Тествам я мисля, че всичко си работи, обаче има нещо малко което не успявам да видя и в джъдж ми излиза следната грешка :
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
at com.company.p3_Mankind.Main.main(Main.java:17)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at _$SandboxExecutor.main(_$SandboxExecutor.java:38)
Моето решение : https://github.com/dimhristov/OOP_Basics/tree/master/05_Inheritance_Exercise/src/com/company/p3_Mankind
условие: Задача 3 от https://softuni.bg/trainings/resources/officedocument/32076/exercise-problem-descriptions-java-oop-basics-june-2018/1976
judge: https://judge.softuni.bg/Contests/Practice/Index/226#2
Благодаря!
Благодаря много за отговора :) Само че не ми е много ясно как да го направя това с регекса. Дали ще може малко повече инфо? Опитвах различни неща досега като добавих в maina и в student класа проверки първо за да не ми гърми ако не въведа факултетен номер и после ако е null да ми хвърля грешка. Само че в условието на задачата не е описано каква грешка да хвърли при това положение. Гледах и урока от 2018 мисля където е решена задачата обаче там не правят тези проверки за Null и им минава. Предполагам тогава не е имало тези тестове в judge и се чудя дали условието евентуално не е леко променено да се казва какъв exception да хвърля.
Но все пак ми стана интересно как би могло да стане това с регексите.
В края на краищата успях и да чийтна judge като хвърлиш Exception "Test Passed!" :D, но това разбира се не е решението което искам да достигна :)
Поздрави!
А и updatnah в горния линк в GitHub новите проверки, които правя които знам че не са ок разбира се
@amanis
Погледнах новото решение в github и ми изглежда ОК - все пак липсата на facultyNumber (т.е. null) си е невалиден facultyNumber и е нормално да се хвърли такъв exception.
Проверката за брой student елементи в main също е ОК, защото ни предпазва от хвърлянето ArrayIndexOutOfBoundsException. Друг е въпросът, че тази валидация е по-добре да се прави другаде, например във Factory клас, който приема стринга и връща инстанция на Student при валиден такъв или хвърля exception-a.
Относно регекса. Погледнах отново условието на задачата и за съжаление то не е достатъчно конкретно за да може да се направи разграничение между фамилия и факултетен номер (също стринг) на ниво регекс, което ни оставя с 4 възможни варианта:
- празен стринг
- има само първо име
- има първо име и фамилия
- има първо име, фамилия и факултетен номер
Горното и фактът, че същинската валидация на всеки елемент се прави при извикване на конструктора, обезсмисля използването на регекс, защото и .split("\\s+") + проверка колко елемента има в масива ни върши същата работа.
Нека променим малко условието, с цел да демонстрираме как може да се използва подходът с regex:
- първо име - задължително: започва с главна буква и продължава само малки букви, дължина 4 - 8 символа
- фамилия - опция: започва с главна буква и продължава само малки букви, дължина поне 3 символа
- факултетен номер - опция: само цифри, дължина 5-10 символа
Следният регекс покрива горните условия (demo):
Ето и пример как може да се използва (demo):
Output:
@MartinBG
Леле... много ти благодаря за подробния отговор и отделеното време. Определено ще го пробвам това с регекса :)