티스토리 뷰
RxJava에 대해 알아보자 - 제4편 Error는 언제 나는지? 에러나면 어떻게 되는지?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public class DoOnError { public void run6() { Flowable.fromIterable(Arrays.asList(1, 2, 0, 1)) .doOnComplete(() -> System.out.println("completed 6")) .map(item -> { return 10 / item; }) .doOnNext(item -> System.out.println("---next6---")) .doOnError(throwable -> System.out.println("---error6---")) .subscribe(item2-> System.out.println("subscribe:"+item2)); System.out.println("---------finish--------"); } public static void main(String[] args) { DoOnError doOnError = new DoOnError(); doOnError.run6(); } } | cs |
결과
---next6---
subscribe:10
---next6---
subscribe:5
---error6---
io.reactivex.exceptions.OnErrorNotImplementedException: The exception was not handled due to missing onError handler in the subscribe() method call. Further reading: https://github.com/ReactiveX/RxJava/wiki/Error-Handling | java.lang.ArithmeticException: / by zero
at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:704)
---- 중략 ----
---------finish--------
결론은 Flowable안에서 에러가 나도 Flowable 밖에 있는 코드는 실행 된다는 것이다.
그리고 Flowable에서 에러가 나면 그 뒤에 있는 item은 실행이 안된다. 1, 2, 0, 1 일 때 0에서 에러가 나면 남은 1을 실행이 안된다.
위 소스코드를 좀 설명을 해보면 Flowable(Observable)에 1, 2, 0, 1을 넣고 .subscribe()로 실행을 했을 때 어떻게 되는지 보는 코드이다.
일부러 에러가 나도록 만든 코드다. 왜냐하면 10을 위 4개의 숫자 1, 2, 0, 1로 나누는 코드인데 0으로 나눌려고 하면 divide by zero 에러가 나도록 되어있다.
이 코드의 목적은 rxjava가 한개의 collection에 있는 모든 데이터를 처리 할 때 잘 처리 하는지 보기 위함이다.
잘 처리한다는 것은 위에서 4개의 숫자를 넣었으면 4개의 결과가 나오고 5개의 숫자를 넣었으면 5개의 결과가 나와야 하는 것이다.
이를테면 고객 1000명에게 10,000원씩 나누어주는 코드를 rxjava로 짰을 때 에러가 나면 어떻게 되는지 아주 궁금하기 때문이다.
1 2 3 4 5 6 7 | Flowable.just(1, 2, 3, 0, 4) .map(item -> 10 / item) .doOnError(throwable -> System.out.println("doOnError:"+throwable)) .doOnComplete(()-> System.out.println("complete")) .subscribe(item-> System.out.println("success item:"+item), item2-> System.out.println("error item:"+item2) ); | cs |
결과
success item:10
success item:5
success item:3
doOnError:java.lang.ArithmeticException: / by zero
error item:java.lang.ArithmeticException: / by zero
발행은 총 5개 1, 2, 3, 0, 4 이렇게 발행을 한다.
연산은 10 나누기 발행한 숫자를 한다.
일부러 에러가 나는 코드이다. 4번째 0으로 나누려고 할 때 어떻게 되는지 보기 위함이다.
0에서 에러가 났기 때문에 10/4는 실행이 되지 않았다.
1 2 3 4 5 6 7 8 | Flowable.just(1, 2, 3, 0, 4) .map(item -> 10 / item) .doOnNext(item -> System.out.println("doOnNext:"+item)) .doOnError(throwable -> System.out.println("doOnError:"+throwable)) .doOnComplete(()-> System.out.println("complete")) .subscribe(item-> System.out.println("success item:"+item), item2-> System.out.println("error item:"+item2) ); | cs |
결과
doOnNext:10
success item:10
doOnNext:5
success item:5
doOnNext:3
success item:3
doOnError:java.lang.ArithmeticException: / by zero
error item:java.lang.ArithmeticException: / by zero
이 코드는 .doOnNext()가 에러가 나면 계속 실행이 될건지 말건지 알아보는 코드이다.
에러가 나면 그 뒤에 있는 item은 실행이 되지 않는다.
'Language > JAVA' 카테고리의 다른 글
Java로 http request보내서 string 받기 with okhttp (0) | 2018.12.24 |
---|---|
rxjava - return은 Flowable이 끝나고 될까? (0) | 2018.12.14 |
Java Stack 예제 (0) | 2018.11.04 |
spring boot2 dataSource or dataSourceClassName or jdbcUrl is required. 이 에러 나는 경우 (0) | 2018.10.23 |
자바 스트링 빌더 java string builder (0) | 2018.08.21 |
- Total
- Today
- Yesterday
- Sh
- 도커티슈박스
- docker container case
- shellscript
- 도커각티슈케이스
- 2017 티스토리 결산
- 개발자
- 이직
- 싱가폴
- 도커컨테이너
- docker container whale
- docker container tissue box
- 도커티슈케이스
- docker container
- 도커각티슈박스
- vim
- docker container tissue
- Linux
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |