Obsługa wyjątku InputStreamReader z URL

Obsługa wyjątku InputStreamReader z URL
SH
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 2 lata
  • Postów:1
0

Cześć,

próbuje zrobić zadanie w którym mam wysłać zapytanie HTTP Get i pobrać dane. Jeśli zapytanie się nie uda, mam zwrócić wiadomość, oraz status HTTP. Dane pobieram z API udostępnionego przez Github:

Kopiuj
try {
    URL urlUser = new URL("https://api.github.com/users/blablabla");
    InputStreamReader readUserData = new InputStreamReader(urlUser.openStream());
    Owner user = new Gson().fromJson(readUserData, Owner.class);
    System.out.println(user.getLogin());
} catch (Exception e) {
    System.out.println(e.getMessage());
}

stworzyłem specjalną klasę Owner, która ma wszystkie pola znajdujące się w Jsonie, który dostaje w odpowiedzi.

Mam jednak problem z pobraniem potrzebnych danych w przypadku podania nieprawidłowego loginu. W Postmanie wygląda to tak:

screenshot-20220915180610.png

A przy użyciu swojego programu dostaje

Kopiuj
java.io.FileNotFoundException: https://api.github.com/users/blabererelabla
	at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1993)
	at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1589)
	at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:224)
	at java.base/java.net.URL.openStream(URL.java:1161)
	at pl.szymanski.githubInformationFinder.Service.RepositoryService.main(RepositoryService.java:49)

Process finished with exit code 0

i nie mogę znaleźć tam informacji na temat zwróconych danych.

Może powinienem użyć czegoś innego niż InputStreamReader - próbowałem z HTTPClient i innymi znalezionymi w internecie, ale nigdzie nie mogę znaleźć potrzebnych informacji.

edytowany 3x, ostatnio: Riddle
JK
Wklej cały wyjątek który dostajesz - będzie łatwiej.
Riddle
Możesz użyć skrótu Shift+Tab żeby wciąć kod źródłowy. Korzystaj też z oznaczników języka, np ```java.
Robert Karpiński
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad rok
  • Postów:133
2

W tego typu zadaniach, powinieneś zastosować klienta HTTP. Jest sporo bibliotek dla Java np. HttpClient, OkHttp,Jetty,Netty, Retrofit itp.
Przykładów użycia też można znaleźć sporo. Wujek Google na pewno pomoże.
Jaki wybrać ? Nie wiem, każdy ma swoje plusy i minusy. Przy tak prostym zadaniu, tak naprawdę nie ma to znaczenia.

W Twoim przypadku, po wywołaniu request ( zapytania) bezwzględnie należy sprawdzić status odpowiedzi ( o ile wcześniej nie wystąpi problem np. z timeout).
Przy poprawnym wyniku, zwykle powinno to być 200/OK - deserializujemy JSON do wymaganego obiektu.
Inny status ( znowu zwykle !! ) świadczy o jakimś problemie i wtedy powinno się oddzielnie obsłużyć taki przypadek.

O czym warto wiedzieć:

  1. Trzeba poznać REST API - co to jest, filozofia działania, jakie ma statusy wynikowe itp.
  2. Trzeba poznać dokumentację API danego serwisu bo np. status 200/OK to nie jedyny status poprawnie wykonanej operacji,
edytowany 1x, ostatnio: Robert Karpiński
Robert Karpiński
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad rok
  • Postów:133
1

Z drugiej strony, można pójść na łatwiznę i pozostawić to co zrobiłeś.
Założenie jest proste - jak występuje wyjątek, no to jest źle i niedobrze i można ten wyjątek specjalnie obsłużyć np. wymuszając kolejne logowanie.
Jak jest dobrze, czyli wyjątek nie wystąpił - to deserializuje się JSON i koniec.

Osobiście nie polecam tej drogi ..

W0
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 godziny
  • Postów:3518
0

Twoim błędem jest to, że zakładasz, że istnieje odpowiedź. HttpURLConnection (po którym dziedziczy HttpsURLConnection którego używasz) pozwala dorwać się do dwóch streamów:

  • głównego, przez getInputStream(), który da ci info z odpowiedzią - jeśli takowa istnieje
  • drugiego, przez getErrorStream(), który nie będzie pusty kiedy coś pójdzie nie tak

Jeśli chcesz to obsłużyć to nie próbuj dorwać się do contentu zanim nie sprawdzisz, w jakim stanie jest połączenie. Najlepiej po prostu sobie zrzutować:

Kopiuj
HttpsURLConnection connection = (HttpsURLConnection) new URL("https://api.github.com/users/blabla").openConnection();

I potem masz dostęp do wszelkiego rodzaju pomocniczych metod:

Kopiuj
connection.getResponseCode(); // zwraca 404
connection.getResponseMessage(); // zwraca "Not found"

// ewentualnie przez strumienie - ale to musisz decydować na podstawie responseCode
connection.getInputStream(); // kiedy serwer zwróci odpowiedź
connection.getErrorStream(); // kiedy serwer zwróci jakiś 4xx czy 5xx
edytowany 1x, ostatnio: wartek01
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)