[Java] Nagły koniec programu

Mam za zadanie napisać program, który pobierze od użytkownika liczbę całkowitą N reprezentującą długość tablicy a następnie poprosi o N kolejnych liczb uzupełniając nimi wcześniej stworzoną tablicę.
Wyświetl na konsoli tablicę posortowaną w kolejności od najmniejszej do największej liczby

Kod się kompiluje, startuje pobiera pierwszy argument i kończy działanie nie podając żadnego komunikatu z błędem. Po wyświetleniu pogrubionej linii następuje koniec. Prośba o sugestie co jest źle

import java.util.Arrays;
import java.util.Scanner;

public class Ex3 {
    static int arraySize;
    static int[] array = new int[arraySize];
    Scanner sc = new Scanner(System.in);
    public static void main(String[] args) {
        Ex3 o = new Ex3();
        o.arraySize();
        o.createArray();
        o.sortAndDisplayArray(array);
    }
    private int arraySize() {
        System.out.print("Podaj rozmiar tablicy: ");
        arraySize = sc.nextInt();
        return arraySize;
    }
    private int[] createArray() {
        **System.out.print("Podaj elementy, które będą dodane do tablicy: ");**
        for (int i = 0; i < array.length; i++) {
            System.out.print( i + 1 + " element tablicy");
            array[i] = sc.nextInt();
        }
        return array;
    }
    private void sortAndDisplayArray(int[] array) {
        Arrays.sort(array);
        for (int i = 0; i < array.length; i++) {
            System.out.print("Podałeś następujące liczby, które zostały posortowane od najmniejszej do największej: " + array[i]);
        }
    }
}

Nic się nie dzieje bo popełniłeś masę błędów.

  1. używasz zmiennych statycznych niepotrzebnie
  2. nie tworzysz tablicy o podanej długości
  3. tworzysz tablicę o 0 (zerowej) długości
  4. dwie z napisanych metod nie mają sensu działania
  5. pierwsza metoda właściwie jest zbędna bo o ile zapisuje podaną długość tablicy to nie ma to żadnego wpływu na nic
  6. używanie właściwości statycznych jako zmiennych w zwykłych metodach nie jest dobrą praktyką

Tak naprawdę w tej chwili program działa następująco:

  1. tworzysz tablicę o długości 0 ponieważ static arraySize domyślnie przyjmie 0
  2. tworzysz obiekt klasy Ex3
  3. wywołujesz metodę arraySize, która pobiera długość tablicy
  4. wywołujesz metodę createArray, która nie tworzy tablicy (zła nazwa metody) lecz wypełnia tablicę która ma 0 elementów - czyli właściwie nic nie robi
  5. wywołujesz kolejną metodą z rezultatem jak w przypadku pkt. 4

Jak sam (mam taką nadzieję) widzisz program w ogóle nie działa tak by zrealizować jakiekolwiek zadanie z treści. Jeśli chcesz to ogarnąć to zrób tak:

  1. wciśnij Ctrl+a
  2. następnie wciśnij backspace lub delete
  3. zacznij pisać kod od nowa
1 polubienie

Tak to prawda że program jest fatalnie napisany. Minimum jakie trzeba zmienić by zadziałał:

import java.util.Arrays;
import java.util.Scanner;

public class Ex3 {
    static int arraySize;
    static int[] array;
    Scanner sc = new Scanner(System.in);
    public static void main(String[] args) {
        Ex3 o = new Ex3();
        arraySize = o.arraySize();
        o.createArray();
        o.sortAndDisplayArray(array);
    }
    private int arraySize() {
        System.out.print("Podaj rozmiar tablicy: ");
        arraySize = sc.nextInt();
        return arraySize;
    }
    private int[] createArray() {
    array = new int[arraySize];    
System.out.print("Podaj elementy, które będą dodane do tablicy: ");
        for (int i = 0; i < array.length; i++) {
            System.out.print( (i + 1) + " element tablicy");
            array[i] = sc.nextInt();
        }
        return array;
    }
    private void sortAndDisplayArray(int[] array) {
        Arrays.sort(array);
        for (int i = 0; i < array.length; i++) {
            System.out.print("Podałeś następujące liczby, które zostały posortowane od najmniejszej do największej: " + array[i]);
        }
    }
}

Jakby co to nie kompilowałem

Dobrze, że rozwiązałeś za niego zadanie. Na pewno dzięki temu czegoś się teraz nauczy, a z całą pewnością ma szansę uczyć się na własnych błędach … Jedno jest pewny, przynajmniej udowodniłeś światu, że Ty z tym zadaniem sobie umiesz poradzić :wink: . Brawo Ty!

Zastanawiam się jaki sens ma uczenie się i studiowanie w takim przypadku. Dajmy wszystkim od razu tytuł inżyniera. Potem w razie potrzeby, gdyby jednak okazało się, że w pracy mają jakieś zadanie do zrobienia to będą prosić ludzi na forach internetowych o zaimplementowanie tego. W końcu tego nauczyli się w szkole czy an studiach.

3 polubienia

Zrobiłem to dlatego, że widzę, że sam spróbował i wstawił jakiś kod, co prawda pełen błędów, ale widać było, że zmierzał do rozwiązania zadania. Jak dałem działający (mam nadzieję) kod to on może sobie porównać co zrobił nie tak. Ty tylko mu napisałeś że ma to usunąć, i napisać od nowa, a ja pokazałem jakie można było nanieść poprawki, aby zadziałało.

Gdyby nie dał żadnego kodu i oczekiwał, że zrobimy wszystko za niego, nie postąpiłbym w ten sposób

To było na sam koniec, wcześniej wypisałem mu w czym jest problem oraz jak działa jego program po to by miał możliwość pomyśleć nad tym jak to naprawić.

Nie wiedziałem, że nauka polega na szukaniu różnić. Do tej pory myślałem, że to kwestia wiedzy i umiejętności wykorzystania jej w praktyce. Natomiast w programowaniu dodatkowo ważne jest by wiedzieć jak działa kod, zwłaszcza ten napisany samodzielnie oraz świadomość tego jaki wpływ i działanie mają poszczególne elementy języka czy środowiska.

PS. Rozumiem co zrobiłeś i w jakim celu, ale nie popieram takiej formy nauki. Zwłaszcza jeśli ewidentnie ktoś nie umie i nie rozumie podstaw (bo jest w trakcie ich nauki) danie mu gotowca to krzywdzenie tej osoby. Ma gotowe rozwiązanie wie gdzie popełnił błąd, ale nie wie dlaczego i w ogóle czemu jego pomysł był zły i nie działał.

Ten kolega to wie, bo mu to wyłożyłeś. Nie wiem czy dałem gotowca, bo nie chciało mi się odpalać komputera nawet sprawdzić czy to się kompiluje. Chodziło mi bardziej o pokazanie jak mniej więcej powinien wyglądać kod.

A kolega i tak się przy tym jeszcze pogłowi, bo użył bibliotecznej funkcji sortowania. Jeśli to jest zadanie na uczelnię to będą mu kazać klepnąć samemu jakimś algorytmem. Z doświadczenia wiem bo sam byłem studentem :slight_smile:

Ale ok w sumie to masz rację, zmienię podejście.

Przede wszystkim to Panowie chciałem powiedzieć, iż uczę się Javy 3 tydzień. Zdaję sobie sprawę, że rozwiązanie zastosowano nie było optymalne i na pewno da się to zrobić na tysiące lepszych sposobów. Zapewne są to sposoby, które na ten moment są mi obce. Dodatkowe info uczę się javy, bo chcę i nie jestem studentem. Uczę się dla siebie (kto wie kiedyś się to może przydać).

Fizyda, dzięki za obszerne zrównanie starań człowieka w nauce. Jak sądzę w trakcie nauki wszystko Ci wychodziło i od razu każdy wyglądał na profesjonalny.

Kuba, jak widzę zmiany dużych nie wprowadziłeś. Dzięki za podpowiedź, faktycznie inicjalizacja tablicy później dała efekt w postaci w pełni działającego programu.

Bardziej chodziło mi o to, byś spróbował zrobić to od nowa lepiej starając się wyeliminować problemy które wypisałem. W żadnym wypadku nie zamierzałem Cię zniechęcić bo i tak radzisz sobie świetnie. Zwłaszcza jeśli uczysz się sam na własną rękę. Być może zabrzmiało to bardzo brutalnie, ale niestety jest to moja wada, że potrafię tak czasami “dowalić” mimo to staram się jak mogę by tego nie robić.
Mi zależało na tym by skłonić cię do samodzielnego znalezienia odpowiedzi na pytania: co zrobiłeś źle oraz czemu zrobiłeś źle. Gdybyś później napisał pytanie jak naprawić konkretny błąd, w tedy bym Ci pomógł, dał przykładowy kod z wytłumaczeniem co, gdzie, jak, i co najważniejsze czemu tak, a nie inaczej.

Tak, dokładnie z kursu internetowego, ale samodzielnie. Bez wykładowcy, bez przymusu itp.

Właśnie w tym celu tu napisałem, ale cóż wyszło inaczej …

To pamiętaj, że ważniejsze nawet od umiejętności samego programowania jest znajomość algorytmów i struktur danych. Tego raczej ten kurs nie uczy bo używasz do sortowania wbudowanej metody w środowisko, więc warto byłoby zaimplementować sobie kilka różnych algorytmów sortowania, np. bubble sort, marge sort czy quick sort.

Zacząłbym też na Twoim miejscu od tworzenia programów bardziej proceduralnych niż obiektowych, przynajmniej do czasu, aż nie będziesz “czuł kodu”. Zrezygnowałbym na razie z tworzenia klas, używania zmiennych statycznych (właściwości statycznych). Ograniczyłbym się tylko do tworzenia metod statycznych i traktowania ich wręcz jak funkcje. W tedy zrozumiesz po co są właściwie returny i jak z nich korzystać.

Jeśli chcesz możesz zacząć pisać od nowa to zadanie i pytać tutaj po kolei, a nawet jeśli chcesz mogę Ci pierwszą cześć, czyli podawanie długości tablicy dla przykładu napisać, a ty podobnie będziesz starał się napisać kolejne kroki zadania.

No to trzeba też zrezygnować z Javy. Aby odpalić jakikolwiek kod w tym języku potrzebna jest co najmniej jedna klasa. Kod bez klas to sobie można w C albo C++ pisać.

I nawet nie jest to głupi pomysł, bo ja tak właśnie zaczynałem, w C++ i bez klas. Inaczej łatwo nauczyć się złych nawyków jakie wykształcają się właśnie u autora.

Inaczej się nie da. W czasie inicjalizacji tablicy musisz znać jej rozmiar, a ty robiłeś to jeszcze zanim on został podany z klawiatury.
W dalszym etapie nauki poznasz kolekcje, które potrafią zmieniać swój rozmiar po inicjalizacji, i wtedy będziesz mógł na początku zrobić sobie pustą kolekcję, i dodać tyle elementów ile chcesz. Zasada działania ArrayListy która jest jedną z kolekcji opiera się o zwykłe tablice jakich używasz teraz. W czasie dodawania obiektu tworzona jest nowa większa tablica, potem kopiowane są dane z poprzedniej (mniejszej) a na końcu ta mniejsza jest niszczona przez odśmiecacz pamięci, dlatego ArrayLista potrafi powiększać swój rozmiar :slight_smile:

Wystarczy tylko udawanie programowania proceduralnego, jedna klasa a w niej metody statyczne, to zimituje programowanie proceduralne. O tym, że masz deklarację klasy właściwie możesz w takim przypadku zapomnieć.