Przekroczenie zakresu tablicy

Przekroczenie zakresu tablicy
J2
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 5 lat
0

Witam,

tworzę program w Javie w środowisku NetBeans. Mam dwa wektory, jeden globalny, drugi lokalny. Wywołuję funkcję sortowania (jako identyfikator podaję jej pierwszy element z globalnego wektora), która szuka identyfikatorów w tym globalnym wektorze, spełniających pewne kryteria. Jak już ich znajdzie, dodaje ich numery do lokalnego wektora. Na końcu, przeszukuje wszystkie elementy dodane do lokalnego wektora, wywołując rekurencyjnie znów funkcję sortowania, kolejno dla elementów lokalnego wektora. Niestety, wystepuje odwołanie do nieistniejącego elementu.

Tak w uproszczeniu wygląda funkcja sortowania:

Kopiuj
	public void sortowanie(int identyfikator, int argument1, int argument2)
	{
		try
		{
			//tu tworzę wewnętrzny wektor
			final Vector<Integer> mojWektor = new Vector<Integer>();

			//Tutaj jest dużo linijek kodu, w których wyszukuję innych identyfikatorów
			//i dodaję je do mojWektor.

			if (mojWektor.size() > 0)
			{
				for (int i = 0; i < mojWektor.size(); i++)
				{ sortowanie(mojWektor.get(i),0,0); }
			}
		}
		catch (Exception e)
		{
			JOptionPane.showMessageDialog(null,
					"Wyjątek: " + e,
					"Błąd funkcji",
					JOptionPane.ERROR_MESSAGE);
		}
	}

I błąd, który wyrzuca "catch":

Exception: java.lang.ArrayIndexOutOfBoundsException: -1

Jednak dodałem parę System.out.println(mojWektor.size() + " " + i) i wygląda mi z nich tuż przed błędem:

mojWektor.size() = 9
i = 6
mojWektor.get(i) = 4

to oznacza, że wcale nie chciałem się odwołać do nieistniejącego elementu. Na co zatem innego może wskazywać ten błąd z "catch"?

Całe sortowanie znajduje się w klasie:
public class MojaBazaDanych extends Vector

Pomyślałem, że to może chodzi o zasięg tego wektora lokalnego (że wcale nie jest on taki, jak tego chciałem) i jakiś słów kluczowych może brakuje lub są użyte niewłaściwe, odnośnie zakresu zmiennej. Proszę o sugestie.

Pozdrawiam!

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1
  1. Debugger twoim przyjacielem. Znalazł byś powód błędu w ciągu 30 sek...
  2. Przecież w stacktrace masz informacje o tym w której linijce poleciał ci wyjątek...
  3. Zapewne błąd jest w tych linijkach ktorych nie pokazałeś...

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
J2
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 5 lat
0

Dzięki!

Jak użyć tego Stack Trace'a? Tutaj (http://wiki.netbeans.org/AnalyzeStackTrace) znajduję informację, że jest to w Window => Other => Analyze Stacktrace. Włączam go, ale w momencie błędu nie wyświetla żadnych informacji.

Bardziej mnie interesuje stan zmiennych tuż przed błędem (choć i konkretna linijka, która powoduje błąd też), jednak być może z powodu zasięgu nie widzę żadnej zawartości tego lokalnego wektora. A to co widzę dzięki error output wskazuje, że zakres nie został przekroczony.

Mam ciągle tylko w message dialog:

Exception: java.lang.ArrayIndexOutOfBoundsException: -1

i żadnych błędów w zakładce "Output", poza tym, co wrzucam samemu do testowania zmiennych na standard error (poprzez System.out.println).

Pozdrawiam!

remigio
  • Rejestracja:prawie 15 lat
  • Ostatnio:ponad 8 lat
  • Postów:357
1

obsłuż porządnie wyjątek. Z tego co kojarze to nie powinno się rzucać Exception w bloku catch.
Może ArrayIndexOutOfBoundsException byłoby lepsze

edytowany 1x, ostatnio: remigio
Wibowit
To w końcu rzucać czy łapać?
remigio
no łapać łapać :d
1

Obsłuż porządnie ..., tzn. chwilowo zrób tak:

Kopiuj
                catch (Exception e)
                {
                        e.printStackTrace();
                        JOptionPane.showMessageDialog(null,
                                        "Wyjątek: " + e,
                                        "Błąd funkcji",
                                        JOptionPane.ERROR_MESSAGE);
                }
J2
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 5 lat
0

Dzięki!

Jestem w trakcie debuggowania i taka mnie wątpliwość naszła. Otóż miałem warunek

if (PierwszaZmienna == DrugaZmienna)

jednak IDE zasugerowało mi jego zmianę na:

if (PierwszaZmienna == null ? DrugaZmienna == null : PierwszaZmienna.equals(DrugaZmienna))

gdzie obie zmienne są typu String. Czy IDE słusznie zasugerował zmianę? (Czy logika warunku jest taka sama)?

Pozdrawiam!

edytowany 1x, ostatnio: johnyjj2
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 5 godzin
2

Operator == porównuje zawartość tylko dla typów prymitywnych, tzn int, char, double, float, short. Dla wszystkiego co dziedziczy po Object (i nie podlega autoboxingowi) operator == porównuje referencje, tzn sprawdza czy referencje wskazują na ten sam obszar pamięci, nie porównując zawartości tego obszaru.

Widać, że masz nikłą wiedzę z Javy, proponuję zaopatrzyć się w jakąś książkę do Javy.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
VT
  • Rejestracja:ponad 16 lat
  • Ostatnio:6 miesięcy
  • Postów:167
1

ale odpowiadając na pytanie johnyjj2-to zdaje się, że źle Ci IDE podpowiedziało. Teoria tu: http://pl.wikipedia.org/wiki/Operator_warunkowy czyli on zmienił twój warunek na:
if (PierwszaZmienna == null{
DrugaZmienna == null}
else{
PierwszaZmienna.equals(DrugaZmienna)
}
Trochę bez sensu.

Jak wibowit pisze: Stringi porównuje się metodą equals, jeśli porównasz operatorem == to porównasz tylko, czy te zmienne są trzymane w tym samym miejscu w pamięci.
Twój warunek to:
if (PierwszaZmienna.equals(DrugaZmienna))

Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 22 godziny
  • Postów:2512
2

Jeżeli już to warunek raczej powinien wyglądać tak:

Kopiuj
if (PierwszaZmienna == null || DrugaZmienna == null ? false : PierwszaZmienna.equals(DrugaZmienna))

EDIT: Warunek podpowiedziany przez IDE jest poprawny, jeżeli chcesz aby blok w if się wykonał gdy oba stringi są null, ale myślę, że o to raczej Tobie nie chodziło.

edytowany 1x, ostatnio: Sarrus
VT
sprytne:) pytanie tylko, czy puste stringi są równe czy różne, ale to pod filozofię bardziej podpada:)
iooi
Są różne, chyba że jest to ten sam string. Jest też: Objects.equals(PierwszaZmienna, DrugaZmienna) (JDK 7)
J2
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 5 lat
0

Witam,

zmieniłem deklarację myVector:

Kopiuj
public class NazwaMojejKlasy extends Vector {

    private Vector vector; //pierwszy wektor
    private Vector<Integer> myVector; //drugi wektor; wcześniej nie deklarowałem go tutaj

    public FamilyDatabase() {
        vector = new Vector();
        myVector = new Vector(); //tu go tworzę; wcześniej tworzyłem go w funkcji, nie konstruktorze, jako final Vector<Integer> myVector = new Vector<Integer>();
    }

oraz sposób odnoszenia się do niego:

Kopiuj
myVector.addElement(new Integer(i)); //wcześniej: myVector.add(i);
//...
int zmiennaInt =  myVector.elementAt(i); //wcześniej: int actualID = myVector.get(i);

Wcześniej działało "poprawnie" (to znaczy, dodawało elementy w sposób taki, jakiego się można było spodziewać). Zdecydowałem się jednak, aby nie był tworzony przy każdym wywołaniu funkcji rekurencyjnej nowy wektor, ale aby był jeden, globalny wektor. Niestety, teraz dodaje elementy za pierwszym i drugim razem, później zaś wcale nie dodaje elementów. Innych fragmentów kodu nie zmieniałem, więc błąd się powinien kryć w którejś z powyższych.

Pozdrawiam!

J2
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 5 lat
0

Witam,

zmieniłem kod w następujący sposób

Kopiuj
deklaracja
private List<Integer> values = new ArrayList<>();

dodanie wartości
values.add(Integer.valueOf(random.nextInt(100)));

zwrócenie wartości
int value = values.get(index);

jednak linijka

values = new ArrayList<>();

powoduje błąd:

diamond operator is not supported in -source 1.6
(use -source 7 or higher to enable diamond operator)

cannot infer type arguments for java.util.ArrayList<>;
reason: no instance(s) of type variable(s) E exist so that java.util.ArrayList<E> conforms to java.util.Vecotr<java.lang.Integer>

W jaki sposób mogę uniknąć używania "diamond operator"?

Pozdrawiam!

Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 5 godzin
2

Napisz po staremu, czyli List<Integer> lista = new ArrayList<Integer>(); Z reguły musisz dawać identyczną parametryzację z obu stron przypisania (no chyba, że parametr jest kowariantny albo kontrawariantny, czyli ? extends Coś, albo ? super Coś, ale to jest rzadko używane i możesz to na początku olać).
Diamond operator to po prostu częściowa inferencja typu, po to aby nie musieć explicite parametryzować klas po obu stronach równości. Jest dostępne od Javy 7, a ty piszesz pod Javę 6 (choć akurat ten ficzer powinien latać pod wersjami niższymi niż 7, bo nie zmienia wynikowego kodu przecież).


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
iooi
Bo lata, tylko -source trzeba ustawić na 7
remigio
  • Rejestracja:prawie 15 lat
  • Ostatnio:ponad 8 lat
  • Postów:357
1

Nowe wersje Javy działają wstecz ze starym kodem. Wcześniej pisali List arr = new ArrayList(); i było ok.
(Jednakże ja bym tego nie stosował bo w pewnych sytuacjach jest to niebezpieczne)

Wibowit
Ale zapis List<> (tzn diamond operator) nie był dostępny w kompilatorach dla Javy <7.
J2
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 5 lat
0

Dzięki za odpowiedzi,

zamieniłem dotychczasowe

Kopiuj
import java.awt.*;
import java.util.*;

public class NazwaMojejKlasy extends Vector {

    private Vector<Integer> mojWektor;

    public NazwaMojejKlasy() {
        mojWektor = new ArrayList<>();

na taki kod

Kopiuj
import java.awt.*;
import java.util.*;

public class NazwaMojejKlasy extends Vector {

    private List<Integer> mojWektor;

    public NazwaMojejKlasy() {
        mojWektor = new ArrayList<Integer>();

i ta linijka

private List<Integer> myVector;

powoduje błąd

reference to List is ambiguous, both interface java.util.List in java.util and class java.awt.List in java.awt match

Korzystam zarówno z java.awt, jak i java.util w swoim kodzie, więc pewnie w deklaracji jakoś muszę zaznaczyć, o które List mi chodzi, tylko jak?

Pozdrawiam!

Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 5 godzin
1

Ja stosuję zasadę, w której nie korzystam z wildcardów przy importach. W NetBeansie mam Crtl+Shift+I do uzupełniania importów (Eclipse też ma jakiś tam skrót). Jeśli jednak tak bardzo chcesz importować masowo, to użyj zapisu java.util.List<Integer> myVector;


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
J2
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 5 lat
0

Dzięki!

To teraz stosuję taki kod:

Kopiuj
import java.awt.*;
import java.util.*;

public class NazwaMojejKlasy extends Vector {

    private java.util.List<Integer> mojWektor;

    public NazwaMojejKlasy() {
        mojWektor = new ArrayList<Integer>();
        //...
    }

    public void JakasFunkcja() {
        mojWektor.addElement(new Integer(i));
        int pobranaWartosc = mojWector.get(i);

i linijka

mojWektor.addElement(new Integer(i));

powoduje błąd

cannot find symbol
symbol: method addElement(java.lang.Integer)
location: variable mojWektor of type java.util.List<java.lang.Integer>

Szukam tutaj (http://docs.oracle.com/javase/6/docs/api/java/util/List.html) i znajduję:

void add(int index, E element)

Zmienilem addElement na add i nie wykrywa błędów kompilacji. Zaraz się przekonam, czy wykonuje się poprawnie.

Pozdrawiam!

edytowany 1x, ostatnio: johnyjj2
iooi
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 11 lat
  • Postów:573
1
edytowany 1x, ostatnio: iooi
J2
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 5 lat
0

Dzięki!

Teraz debugguję kod i przy wystąpieniach

Kopiuj
mojWektor.add(new Integer(i));

mojWektor.get(i)

w pasku stanu otrzymuję błąd:

Thread AWT-EventQueue-0 stopped at NazwaMojejKlasy.java

oraz w zakładce debugging:

'AWT-EventQueue-0' at field breakpoint NazwaMojejKlasy.mojWektor

Za chwilę dokładniej się przyjrzę temu, choć na razie nie mam pomysłu, co dokładnie ten błąd powoduje.

Pozdrawiam!

iooi
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 11 lat
  • Postów:573
1

Nie rzuca żadnego wyjątku? Może odwołujesz się do nieistniejącego indeksu i.
Swoją drogą, możesz pisać:

Kopiuj
mojWektor.add(i);
// zamiast
mojWektor.add(new Integer(i));

Autoboxing sam zadziała.

edytowany 1x, ostatnio: iooi
J2
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 5 lat
0

Dzięki!

Właściwie to pierwszy raz zatrzymuje się debugger na samym :

mojWektor = new ArrayList<Integer>();

z informacją:

'main' at field breakpoint NazwaMojejKlasy.mojWektor
NazwaMojejKlasy.<init>:18
NazwaGlownegoPliku.<init>:38
NazwaGlownegoPliku.main:69

ponieważ w NazwaGlownegoPliku.java w "public static void main(String[] args) {" wywołuję "new NazwaGlownegoPliku();", to zaś uruchamia konstruktor "public NazwaGlownegoPliku() {", a w nim jest "nazwaGlownejZmiennejZBaza = new NazwaMojejKlasy();", to zaś w pliku NazwaMojejKlasy.java wywołuje "public NazwaMojejKlasy() {", a w nim "mojWektor = new ArrayList<Integer>();". (Nie zaznaczyłem powyższych fragmentów w osobnych tagach code, bo odpowiedź byłaby bardzo długa).

Pozdrawiam!

iooi
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 11 lat
  • Postów:573
1

Ale powinna być też tam informacja, jaki wyjątek został rzucony. Najlepiej pokaż cały stacktrace.

J2
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 5 lat
0

Dzięki!

Pisząc o "stack trace" masz na myśli okienko "Debugging"?

Pojawia się tam

Kopiuj
'AWT-Windows' running
'main' at field breakpoint NazwaMojejKlasy.mojWektor
NazwaMojejKlasy.<init>:18
GlownyPlik.<init>:38
GlownyPlik.main:69

Osiemnasta linijka w pliku z klasą to:

mojWektor = new ArrayList<Integer>();

Trzydziesta ósma w głównym pliku

bazadanych = new NazwaMojejKlasy();

Sześćdziesiąta dziewiąta w głównym pliku:

new GlownyPlik();

ale o tym (ze szczegółami) pisałem we wcześniejszym poście.

Pozdrawiam!

iooi
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 11 lat
  • Postów:573
1

W takim razie musiałeś sobie po prostu ustawić breakpoint na polu mojVector.

edytowany 1x, ostatnio: iooi
J2
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 5 lat
0

Rzeczywiście :p

Nie wiem, gdzie mam zobaczyć ten "stack trace" (co najwyżej w trakcie wykonywania kodu podglądam sobie zmienne najeżdżając na fragmenty kodu albo korzystam z outputa).

Błąd w outpucie jest taki:

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError

i jest on związany z wywołaniem rekurencyjnym funkcji, w której się znajdują odwołania do Listy.

Pozdrawiam!

Dodano: 2011-11-26 19:09

Przyglądam się dalej kodowi w trybie debuggowania i widzę, że ta moja funkcja jest wiele razy rekurencyjnie wywoływana, ale dopiero na samym końcu wyrzuca błąd, przy ostatnim wywołaniu, powodując błąd w outpucie, jak to wyżej napisałem.

Jak mogę ustawić w debuggerze, aby dopiero przy wyrzuceniu tego błędu zatrzymał mi wykonanie? Chciałbym znać wartości parametrów przekazywanych funkcji, ale wtedy już niczego nie widzę, gdy na nie najeżdżam w kodzie.

edytowany 2x, ostatnio: johnyjj2
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 5 godzin
1

Hmm, breakpoint na konstruktor SOE? :D Głowy nie dam za to.
Możesz zrobić coś a'la:

Kopiuj
    void run() {
        try {
            run();
        } catch (StackOverflowError ex) {
            // tutaj breakpoint
        }
    }

SOE nie jest rzucany przy ostatnim wywołaniu rekurencyjnym (czasem może takiego w ogóle nie być, gdy ma się nieskończoną rekurencję) tylko wtedy, gdy nastąpi przepełnienie stosu (jak sama nazwa błędu mówi). A więc jeśli na stosie jest miejsce na tysiąc zagnieżdżonych wywołań funkcji, a twój algorytm chce zrobić dwa tysiące, to po zrobieniu tysiąca dostaniesz SOE.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit
J2
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 5 lat
0

Witam,

właściwie to teraz wracam do podobnego problemu, dla którego założyłem ten temat, czyli zasięgu zmiennych dla wektorów/list.

GlownyPlik.java:

Kopiuj
public class GlownyPlik extends Frame implements WindowListener, ActionListener {
   //...
   private java.util.List<Integer> rozpatrzone;
 
//i później, gdzieś dużo dalej w kodzie
 
   database.mojaFunkcja(identyfikator, arg1, arg2, rozpatrzone);

DrugiPlik.java

Kopiuj
        try {
            //nie przeszukuj już przeszukanych danych
//            if (rozpatrzone.isEmpty() == false)
//            {
                if (rozpatrzone.contains(identyfikator))
                { return; }
//            }
            rozpatrzone.add(identyfikator);
 
//...
 
   mojaFunkcja(actualID, actualCol, actualRow, rozpatrzone);

Błąd wykonania:

Błąd funkcji. Wyjątek: java.lang.NullPointerException

dla linijki

if (rozpatrzone.contains(identyfikator))

Ja to rozumiem tak, że nie widzi

private java.util.List<Integer> rozpatrzone;

zadeklarowanego w GlownyPlik.java.

Próbowałem sprawdzać, czy "rozpatrzone.isEmpty() == false", a także zamienić "private" na "public", co niestety nie pomogło.

Pozdrawiam!

1

Źle rozumiesz, jeżeli ten kod

Kopiuj
(rozpatrzone.contains(identyfikator))

rzuca NPE, to albo rozpatrzone, albo identyfikator jest nullem.

Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 5 godzin
1

A zainicjowałeś zmienną rozpatrzone? Domyślna wartość zmiennej referencyjnej (tzn wskazującej na obiekt, a nie na prymityw) to null.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
bogdans
Przeczytałem pytanie trochę dokładniej, skoro rozpatrzone.isEmpty() nie rzuca NPE, to nullem jest identyfikator.
Wibowit
hm, w podanym kodzie linijka z isEmpty jest zakomentowana
iooi
Przynajmniej w tych podstawowych implementacjavh, contains nie rzuca NPE dla nulli. Raczej wyjątek jest po prostu wyżej dla niezainicjalizowanej listy.
bogdans
@Wibovit, to widziałem. Ale później zobaczyłem Próbowałem sprawdzać, czy "rozpatrzone.isEmpty() == false".
J2
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 5 lat
0

Dzięki za odpowiedzi,

w kodzie GlownyPlik.java mam taki fragment:

Kopiuj
        //dodaj pierwszą wartość do 'rozpatrzone'
        rozpatrzone.add(0); //linijka 68; znajduje się pod koniec konstruktora public GlownyPlik()

który powoduje błąd:

Exception in thread "main" java.lang.NullPointerException
at GlownyPlik.<init>(GlownyPlik.java:68)
at GlownyPlik.main(GlownyPlik.java:75)

Gdzie linijka 75 to:

Kopiuj
    public static void main(String[] args) {
        new GlownyPlik(); //linijka 75
    }

Pozdrawiam!

Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 5 godzin
1

Przed "rozpatrzone.add(0)" dodaj "System.out.println("rozpatrzone = " + rozpatrzone)" i wklej to co zostało wypisane.

Kup sobie książkę omawiającą podstawy Javy i poczytaj zamiast co chwilę zadawać banalne pytania. To będzie szybsze i tańsze (bo czas to pieniądz).


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)