Професионална програма
Loading...
KatyaMarincheva avatar KatyaMarincheva 572 Точки

[Judge] Могат ли да се submit-ват Java решения съдържащи допълнителен клас в същия файл?

Здравейте, колеги,

Имам следния въпрос:

Току-що си написах решение на задачата Problem 13** – Durts от Homework: Loops, Methods, Classes.

Направила съм си собстевен клас Rectangle, който за разлика от java.awt.Rectangle работи с double values, а не с int. На място при мен минава всички нулеви тестоове, но като го пусна в judge получавам грешка:

Exception in thread "main" java.lang.NoClassDefFoundError: P13_Durts$Rectangle

Т.е. не ми намира класа Rectangle, който си е в същия файл.

Помислих да не би да се чуди дали това е мой class Rectangle или е държавния class Rectangle, смених му името - но грешката не се промени:

Exception in thread "main" java.lang.NoClassDefFoundError: P13_Durts$CustomRectangle

Код

Та въпросът ми е, по принцип възможно ли е judge да приема решение с повече от един клас, всички грубо и грозно в един файл, и ако е възможно - как става?

Не че не мога да го напиша без custom class Rectangle, но ми беше интересно да го напиша така....

Тагове:
0
Java Advanced
RoYaL avatar RoYaL Trainer 6845 Точки

Направи го да не е public просто.

1
KatyaMarincheva avatar KatyaMarincheva 572 Точки

@RoYaL

махнах public, остана: static class Rectangle

после пробвах с private static class Rectangle

При мен все си работи, а в judge грешката е същата:

Exception in thread "main" java.lang.NoClassDefFoundError: P13_Durts$Rectangle

Може ли да идва от факта, че всички решения са ми в package?

Не, и в package-a не е проблема, направих си нов проект Durts, без package - с private static class Rectangle - грешката не се промени:

Exception in thread "main" java.lang.NoClassDefFoundError: Durts$Rectangle

 

0
06/09/2015 14:03:42
RoYaL avatar RoYaL Trainer 6845 Точки

Възможно е. На изпитът по Java на който се явявах преди повече от година ползвах класове. Изрових си кода:

http://pastebin.com/se3aF6Vd

Нямам package, класът ми не е nest-нат вътре в другия клас и също така всичко, което е от тип моя клас е статично.

0
Filkolev avatar Filkolev 4485 Точки

А защо static?

1
RoYaL avatar RoYaL Trainer 6845 Точки

Пробвах и твоя код. Нямаш право и на публичен конструктор явно. Така, че това което направих е да не ползвам конструктор и изнесох като статични двете ти променливи от тип Rectangle (не знам дали е нужно)

http://pastebin.com/cxWPba15

1
KatyaMarincheva avatar KatyaMarincheva 572 Точки

@Filkolev

махнах само static и се счупи: No enclosing instance of type P13_Durts is accessible. (при използване на конструктора в main).

Може да трябва да извикам конструктора сега по друг начин, но в Java още не се сещам как....

0
06/09/2015 14:50:10
KatyaMarincheva avatar KatyaMarincheva 572 Точки

@RoYaL

Вярно, дава 100 точки сега, judge го прочете този път.

Благодаря много!

0
KatyaMarincheva avatar KatyaMarincheva 572 Точки

@RoYaL

Проблемът обаче излиза, че не е бил в конструктра, а точно в изнасянето като статични на двете променливи от тип Rectangle

Само си добавих втори конструктор - с default 0 values за всичко.

решението с public constructor

Judge пак го чете и пак си му дава точките.

 

0
RoYaL avatar RoYaL Trainer 6845 Точки

Проблемът е, че ти можеш да ги изнесеш като типове без да ги инициализираш, и после в мейна да ги инициализираш като ректейнгъли, въпросът е, че тогава ще даде същта грешка. А за да успееш да ги инициализираш като статични поле още горе, ти трябва конструктор с 0 аргумента...

Както би казал японски турист с разговорник в ръка, когато му кажат, че е един дюнер е 18 лв: ебасимамамата, да?

1
KatyaMarincheva avatar KatyaMarincheva 572 Точки

@RoYaL

Преди последния ти коменар пробвах буква по буква точно каквото си написал и стана буква по буква точно каквото си напписал :)

"Проблемът е, че ти можеш да ги изнесеш като типове без да ги инициализираш, и после в мейна да ги инициализираш като ректейнгъли, въпросът е, че тогава ще даде същта грешка. А за да успееш да ги инициализираш като статични поле още горе, ти трябва конструктор с 0 аргумента..."

Туристът е прав :)

Сега си работи де, с допълнителния 0 arguments конструктор и всичко на public в class Rectangle, както и с всичко на private в в class Rectangle.

 

0
KatyaMarincheva avatar KatyaMarincheva 572 Точки

@Filkolev

Прав си, че няма логика да е static - оказва се, че ако искам да не е static класа, и да си има конструктор, този конструктор се извиква по много странен начин:

private static Rectangle vertical = new P13_Durts().new Rectangle();

или само Rectangle vertical = new P13_Durts().new Rectangle(rectVerticalX, rectVerticalY, rectVerticalWidth, rectVerticalHeight);

- ако няма да е за judge.

Благодаря за напомнянето - така научих как се работи с конструктор на non-static class.

0
dgp_82 avatar dgp_82 19 Точки

Имам следния проблем със submit-ването на домашните. 

За да не правя всички задачи на отделни проекти отивам в src-папката  и създавам нов калс за всеки проблем.

Натискам десен бутон на SRC папката -> New -> наименовам си класа и до тук всичко ок. В момента в който започна да пиша кода в новия ллас не ми дава изобщо опция да принтирам System.out.println().

Моля помогнете.

0
Jinjaar avatar Jinjaar 348 Точки

@dgp_82  Чакай малко... сигурен ли си че всичко си правиш като хората? Новият клас който създаваш има ли си main() метод , това което описваш се поучава ако се опиташ да извикаш System.out.println() направо в класа, извикването трябва да се прави в някакъв метод main( ) или твой собствен, иначе няма как да стане.Огледай се добре.

1
dgp_82 avatar dgp_82 19 Точки

Вече всичко е ОК. Благодаря.

0
kosio197 avatar kosio197 104 Точки

Вътрешен клас може да е static или не в зависимост от това за какво ще го ползваш. Когато той не е статичен може да "види"  променливите и методите на горния клас и съответно затова иска да се инициализира от инстанция на горния глас например:

public class Test {
    private class Test1 {
        public void printTest() {
            System.out.println(test);
        }
    }

    public int test;

    public Test(int test) {
        this.test = test;
    }


    public static void main(String[] args) {
        new Test(5).new Test1().printTest();
        new Test(6).new Test1().printTest();
    }

}

В този случай вътрешния клас Test1 ползва променливата test на външния клас и съответно трябва да се конструира от инстанция на външния клас както е направено в мейн метода. Ако в този вид на кода Test1 се направи на static кода няма да се компилира, защото не знае кой точно test да вземе. В случай, че вътрешния клас няма да ползва промеливи/методи на външния клас  по - добре да е static  за да не се налага да се прави от инстанция на външния клас. например класа Test2 тук:

    private static class Test2 {
        public void printTest() {
            System.out.println("test");
        }
    }
    
    private class Test1 {
        public void printTest() {
            System.out.println(test);
        }
    }

    public int test;

    public Test(int test) {
        this.test = test;
    }


    public static void main(String[] args) {
        new Test(5).new Test1().printTest();
        new Test(6).new Test1().printTest();
        
        
        new Test2().printTest();
    }

}

0