Pętla nieskończona - prośba o pomoc

0

Witam.

Mógłby mi ktoś pomóc (napisać chociażby krótki algorytm) jak powinna wyglądać funkcja zawierająca pętle nieskończoną, z której wyjście następuje tylko po osiągnięciu przez zmienną długość rzędu 17 znaków (treść zmiennej je wczytywana z pliku, natomiast wcześniej pobierana z maila -- te funkcje mi działają bez problemu, tylko nie wiem jak zaimplementować je w pętle, aby wszystko działało :( )

Pomożecie ??

1

Co to znaczy, że zmienna osiąga długość?

0

Chodzi o to, aby program cały czas sprawdzał maile i po napotkaniu maila z określoną liczbą znaków temacie pobierał treść tego tematu i kończył pętle, tylko jeśli ilość znaków w temacie będzie wynosić 17 (zwraca "od razu"), lub 13 (przed zwróceniem dodaje 4 spacje na koniec zmiennej)...

0
Kremius napisał(a):

Witam.

Mógłby mi ktoś pomóc (napisać chociażby krótki algorytm) jak powinna wyglądać funkcja zawierająca pętle nieskończoną, z której wyjście następuje tylko po osiągnięciu przez zmienną długość rzędu 17 znaków (treść zmiennej je wczytywana z pliku, natomiast wcześniej pobierana z maila -- te funkcje mi działają bez problemu, tylko nie wiem jak zaimplementować je w pętle, aby wszystko działało :( )

Pomożecie ??

Pobierz dane z pliku, iteruj po tematach i zachowuj się adekwatnie do ich długości:

void checkEmails(File file) {
    String[] emailSubjects = getSubjectsFromFile(file);
    checkSubjectLength : for (String subject : emailSubjects) {
        switch (subject.length()) {
            case 13:
                // Add 4 spaces to the subject.
                break checkSubjectLength;
            case 17:
                // Do something.
                break checkSubjectLength;
            default:
                break;
        }
    }
}
0

A w funkcji zwracającej jakąś wartość String mogę użyć return w środku kodu, czy nie ??

Pytam bo krzyczy, że return na końcu (null) jest nieosiągalny mimo to kod kompiluje się i działa prawidłowo. Jak więc "zignorować" ten "błąd" ??

1

Pokaż kod. Informacja o tym, że kod jest nieosiągalny to jest tylko informacja a nie żaden błąd. Po prostu obłożyłeś wszystko takimi warunkami, że program na pewno nie dojdzie do tego miejsca.

0

Informacja o tym, że kod jest nieosiągalny to jest tylko informacja a nie żaden błąd.

W Javie jest to błąd, który uniemożliwia kompilację. Nie uda Ci się skompilować takiego kodu:

 
    int foo(int i) {
        switch (i) {
            case 2:
                return 3;
            default:
                return 8;
        }
        return 2;
    }
0
for(;;)
        {
            try {
                Properties properties = new Properties();
                properties.put("mail.pop3.host", host);
                Session emailSession = Session.getDefaultInstance(properties);
    
                POP3Store emailStore = (POP3Store) emailSession.getStore("pop3");
                emailStore.connect(login, pass);
                
                Folder emailFolder = emailStore.getFolder("INBOX");
                emailFolder.open(Folder.READ_WRITE);
                
                Message[] messages = emailFolder.getMessages();
                for (Message message : messages) {
                    return message.getSubject();
                }
                
                emailFolder.close(false);
                emailStore.close();
            
            } catch (NoSuchProviderException e) {
            } catch (MessagingException e) {
            }
        }
        
        return null;

Po kompilacji wygląda następująco:
pętla idzie do momentu, kiedy natrafi na maila. Kiedy już pobierze temat wychodzi (return) z pętli nieskończonej. Co ciekawe wszystko działa, bo czy mail będzie od razu po uruchomieniu pętli czy po godzinie i tak wszystko działa. Natomiast kompilator cały czas krzyczy o nieosiągalnym return null; można to inaczej zrobić ?

Ważne jest dla mnie aby było to w jakiś pętli (czas kiedy mail znajdzie się na skrzynce jest nieznany tak naprawdę) ??

0
Kremius napisał(a):
for(;;)
        {
            try {
                Properties properties = new Properties();
                properties.put("mail.pop3.host", host);
                Session emailSession = Session.getDefaultInstance(properties);
    
                POP3Store emailStore = (POP3Store) emailSession.getStore("pop3");
                emailStore.connect(login, pass);
                
                Folder emailFolder = emailStore.getFolder("INBOX");
                emailFolder.open(Folder.READ_WRITE);
                
                Message[] messages = emailFolder.getMessages();
                for (Message message : messages) {
                    return message.getSubject();
                }
                
                emailFolder.close(false);
                emailStore.close();
            
            } catch (NoSuchProviderException e) {
            } catch (MessagingException e) {
            }
        }
        
        return null;

Po kompilacji wygląda następująco:
pętla idzie do momentu, kiedy natrafi na maila. Kiedy już pobierze temat wychodzi (return) z pętli nieskończonej. Co ciekawe wszystko działa, bo czy mail będzie od razu po uruchomieniu pętli czy po godzinie i tak wszystko działa. Natomiast kompilator cały czas krzyczy o nieosiągalnym return null; można to inaczej zrobić ?

Ważne jest dla mnie aby było to w jakiś pętli (czas kiedy mail znajdzie się na skrzynce jest nieznany tak naprawdę) ??

Mała poprawka: pierwszy return dałem w warunku:

 
if(message.getSubject().length() == 13 || message.getSubject().length() == 17)
{
     return message.getSubject();
}

drugi wywaliłem i wszystko działa normalnie i kompilator błędu \ ostrzeżenia nie zgłasza. Znaczy, że jest OK ?

0

Miałeś Unreachable statement dla return null ponieważ miałeś już jedno słowo kluczowe return w bloku try. Tak, powiedzmy, że teraz jest OK.

0
Gjorni napisał(a):

Miałeś Unreachable statement dla return null ponieważ miałeś już jedno słowo kluczowe return w bloku try. Tak, powiedzmy, że teraz jest OK.

Magiczne słowo "powiedzmy", czyli jednak jest coś co powinienem poprawić ;) ??

0

na grzyba to w pętli for? zrób while z wrunkiem logicznym. po to został on stworzony

0
wojciechmaciejewski napisał(a):

na grzyba to w pętli for? zrób while z wrunkiem logicznym. po to został on stworzony

While zostal stworzony do petli nieskonczonych? o.O Bo ja myslalem, ze istnieja sobie dwa rodzaje petli, tj. for i while i to od programisty zalezy, ktorej uzyje. Szczegolnie, ze np. w przypadkufor(;;) i while(true) generowany jest nawet identyczny kod bajtowy, wiec... No ale przeciez "petla while zostala do tego stworzona" :D

0

Teraz mam ciekawszy problem. Nie mogę się zalogować do pop :(
Mimo iż nie zmieniłem hasła i loginu (tym bardziej ;) ) cały czas mam błąd: failed to connect

0

Co to jest za blad? Czy odnosi sie on do linii emailStore.connect(login, pass);? Zapodaj wiecej informacji (w tym tresc bledu).

0

Dotyczy tej linii kodu, ale więcej info o błędzie nie ma :(

0

A gdzie pojawia się ten błąd? Pokaż jego pełną treść.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.