Search code examples
javaandroidkotlinjsouphtml-parsing

java.lang.NullPointerException: Attempt to invoke interface method 'int java.lang.Comparable.compareTo(java.lang.Object)' on JSoup Library


I have tried to ask in Jsoup github forum but still didn't get any answer yet. This crash only happened in a specific device in Firebase TestLab(API Level 28, 26). Hard for me to test bcz All of my physical devices work normally. I know where the suspect

fun parseArticleP(article: String): MutableList<ContentArticle?> {

        println("article -> $article")
        val contents = mutableListOf<ContentArticle?>()
        val doc = Jsoup.parse(article)
        // wrap FIGURE
        val elFigure = doc.select("figure")
        for (i in elFigure.indices) {
            val element = elFigure[i]
            element.wrap("<p></p>")
        }
        val elP = doc.select("p")
        for (el in elP) {
            val v = el.text()
            val p = el.outerHtml()
            val ca = ContentArticle()
            ca.setValue(v)
            ca.setP(p)
            contents.add(ca)
        }
        return contents
    }

As you can see, I wrote println above to see what Console Log returns in below. Can someone help me?

06-08 20:22:51.081: I/System.out(13405): article -> <p><strong>TRIBUNNEWS.COM, JAKARTA -</strong> Gubernur Jawa Tengah (Jateng) secara mengejutkan naik ke papan atas sebagai calon presiden (Capres) 2024 dengan tingkat elektabilitas tertinggi nomor dua di bawah Prabowo Subianto.</p>
06-08 20:22:51.081: I/System.out(13405): <p>Survei yang dipublikasikan Indikator Politik Indonesia pada Minggu (7/6/2020) itu secara mengejutkan menempatkan Ganjar sebagai kandidat capres yang patut diperhitungkan pada Pilpres 2024 mendatang.</p>
06-08 20:22:51.081: I/System.out(13405): <p>Elektabilitas Ganjar Pranowo meningkat dari 9,1 persen pada Februari 2020 menjadi 11,8 persen pada Mei 2020.</p>
06-08 20:22:51.081: I/System.out(13405): <p>Dia mengalahkan sejumlah tokoh yang disebut-sebut berpeluang jadi capres seperti Gubernur DKI Jakarta Anies Baswedan, Gubernur Jawa Barat Ridwan Kamil, bahkan Ketua Umum Demokrat Agus Harimurti Yudhoyono (AHY).</p>
06-08 20:22:51.081: I/System.out(13405): <ul>
06-08 20:22:51.081: I/System.out(13405): <li>
06-08 20:22:51.081: I/System.out(13405): <p class="baca"><strong>Baca: <a title="Survei Terbaru: Elektabilitas Ganjar Menyodok ke Papan Atas Lampaui Anies, Sandi, AHY dan RK" href="https://www.tribunnews.com/nasional/2020/06/08/survei-terbaru-elektabilitas-ganjar-menyodok-ke-papan-atas-lampaui-anies-sandi-ahy-dan-rk">Survei Terbaru: Elektabilitas Ganjar Menyodok ke Papan Atas Lampaui Anies, Sandi, AHY dan RK</a></strong></p>
06-08 20:22:51.081: I/System.out(13405): </li>
06-08 20:22:51.081: I/System.out(13405): </ul>
06-08 20:22:51.081: I/System.out(13405): <p>Dua tokoh yang mengalami peningkatan elektabilitas yakni Ridwan Kamil dan Ganjar Pranowo.</p>
06-08 20:22:51.081: I/System.out(13405): <p>Meskipun, elektabilitas keduanya belum mampu mengalahkan Prabowo.</p>
06-08 20:22:51.081: I/System.out(13405): <p class="baca"><strong>Baca: <a title="Sebut Dirinya Tak Mungkin Maju Jadi Capres, Susi Pudjiastuti: Kalau Tanya Lagi Saya Tenggelamkan" href="https://www.tribunnews.com/nasional/2020/04/25/sebut-dirinya-tak-mungkin-maju-jadi-capres-susi-pudjiastuti-kalau-tanya-lagi-saya-tenggelamkan">Sebut Dirinya Tak Mungkin Maju Jadi Capres, Susi Pudjiastuti: Kalau Tanya Lagi Saya Tenggelamkan</a></strong></p>
06-08 20:22:51.081: I/System.out(13405): <p>"Dukungan pada Ganjar Pranowo dan Ridwan Kamil kini cenderung meningkat dibandingkan temuan Februari lalu," demikian tulis keterangan dalam hasil temuan survei tersebut, seperti dilansir Kompas.com dari laman resmi Indikator, Senin (8/6/2020).</p>
06-08 20:22:51.081: I/System.out(13405): <p>Presentase tersebut menempatkan Ganjar di urutan kedua teratas setelah Prabowo, sekaligus mengalahkan Anies.</p>
06-08 20:22:51.081: I/System.out(13405): <p>Sementara, elektabilitas Gubernur Jawa Barat Ridwan Kamil (RK) meningkat dari 3,8 persen menjadi 7,7 persen.</p>
06-08 20:22:51.081: I/System.out(13405): <p>Sehingga, membuatnya menempati urutan keempat teratas.</p>
06-08 20:22:51.081: I/System.out(13405): <p class="baca"><strong>Baca: <a title="DPD Gerindra Papua Ingin Prabowo Tetap Jadi Ketua Umum dan Capres 2024" href="https://www.tribunnews.com/nasional/2020/03/19/dpd-gerindra-papua-ingin-prabowo-tetap-jadi-ketua-umum-dan-capres-2024">DPD Gerindra Papua Ingin Prabowo Tetap Jadi Ketua Umum dan Capres 2024</a></strong></p>
06-08 20:22:51.081: I/System.out(13405): <figure class="op-interactive"><iframe src="https://www.youtube.com/embed/2hX3yehk0eU" width="520" height="292" scrolling="no" frameborder="0" loading="lazy"></iframe></figure>
06-08 20:22:51.081: I/System.out(13405): <p><strong>Berikut hasil survei selengkapnya :</strong></p>
06-08 20:22:51.081: I/System.out(13405): <p>1. Prabowo Subianto (Mei 14,1 persen; Februari 22,2 persen)<br />2. Ganjar Pranowo (Mei 11,8 persen; Februari 9,1 persen)<br />3. Anies Baswedan (Mei 10,4 persen; Februari 12,1 persen)<br />4. Ridwan Kamil (Mei 7,7 persen; Februari 3,8 persen)<br />5. Sandiaga Uno (Mei 6 persen; Februari 9,5 persen)<br />6. Agus Harimurti Yudhyono (Mei 4,8 persen; Februari 6,5 persen)<br />7. Khofifah Indar Parawansa (Mei 4,3 persen; Februari 5,7 persen)<br />8. Mahfud MD (Mei 3,3 persen; Februari 3,8 persen)<br />9. Gatot Nurmantyo (Mei 1,7 persen; Februari 2,2 persen)<br />10. Erick Thohir (Mei 1,6 persen; Februari 1,9 persen)<br />11. Puan Maharani (Mei 0,8 persen; Februari 1,4 persen)<br />12. Tito Karnavian (Mei 0,6 persen; Februari 0,8 persen)<br />13. Budi Gunawan (Mei 0,4 persen; Februari 0,4 persen)<br />14. Muhaimin Iskandar (Mei 0 persen; Februari 0,3 persen)</p>
06-08 20:22:51.081: I/System.out(13405): <p>Untuk diketahui, survei dilaksanakan dengan metode kontak telepon dengan margin of error kurang lebih sebesar 2,9 persen dan tingkat kepercayaan 95 persen.</p>
06-08 20:22:51.081: I/System.out(13405): <p>Adapun responden yang menjawab tidak tahu atau tidak jawab mengalami peningkatan dari 20,3 persen pada Februari 2020 menjadi 32,3 persen pada Mei 2020.</p>
06-08 20:22:51.081: I/System.out(13405): <p>Dari sekitar 1.200 responden yang disurvei pada 16-18 Mei 2020, elektabilitas Prabowo hanya 14,1 persen, bila dibandingkan Februari 2020 yang mencapai 22,2 persen.</p>
06-08 20:22:51.081: I/System.out(13405): <p><strong>Penerus Jokowi?</strong></p>
06-08 20:22:51.081: I/System.out(13405): <p>Pada awal Agustus 2018 lalu, <em>Kompas.com</em> menurunkan tulisan berjudul&nbsp;<a href="https://nasional.kompas.com/read/2019/08/05/05580091/ganjar-pranowo-dan-tri-rismaharini-dinilai-bisa-gantikan-sosok-jokowi">"Ganjar Pranowo dan Tri Rismaharini Dinilai Bisa Gantikan Sosok Jokowi".&nbsp;</a></p>
06-08 20:22:51.081: I/System.out(13405): <p>Sosok Ganjar Pranowo dan Tri Rismaharini dinilai bisa menggantikan sosok Joko Widodo (Jokowi) untuk diusung oleh PDI Perjuangan ( PDI-P) pada Pilpres 2024.</p>
06-08 20:22:51.081: I/System.out(13405): <p>"Pak Ganjar punya panggung sebetulnya karena Gubernur, bisa jadi batu lompatan menunggu tangga Pilpres 2024," ujar pengamat politik Universitas Islam Negeri (UIN) Syarif Hidayatullah, Pangi Syarwi Chaniago kepada Kompas.com, Minggu (4/8/2019).</p>
06-08 20:22:51.081: I/System.out(13405): <p>Menurut Pangi, Ganjar yang menjabat sebagai Gubernur Jawa Tengah itu merupakan figur yang memungkinkan sebagai pengganti Jokowi.</p>
06-08 20:22:51.081: I/System.out(13405): <p>Kendati demikian, Pangi mengingatkan agar Ganjar menjaga citranya tetap baik sampai Pilpres 2024.</p>
06-08 20:22:51.081: I/System.out(13405): <p>"Karena citra beliau sempat terganggu oleh kasus e-KTP, tetapi kan sudah clear bahwa beliau tidak terbukti korupsi," ujar dia.</p>
06-08 20:22:51.081: I/System.out(13405): <figure class="op-interactive"><iframe src="https://www.youtube.com/embed/AN9SVjoGIGA" width="520" height="292" scrolling="no" frameborder="0" loading="lazy"></iframe></figure>
06-08 20:22:51.081: I/System.out(13405): <p>Ia mencontohkan, selama ini dalam sosok Jokowi melekat citra sederhana dan merakyat.</p>
06-08 20:22:51.081: I/System.out(13405): <p>Oleh karena itu, kata dia, Ganjar pun harus mempunyai citra tersendiri yang dapat menjadi ciri khasnya jika ingin menonjol.</p>
06-08 20:22:51.081: I/System.out(13405): <p>"Termasuk beliau harus menjelaskan agar masyarakat dan rakyat Indonesia tahu sepak terjang dan keberhasilan beliau menata Jawa Tengah," kata dia.</p>
06-08 20:22:51.081: I/System.out(13405): <p>"Sehingga beliau memantaskan diri menjadi calon presiden dari PDI-P di tahun tersebut," ucap dia.</p>
06-08 20:22:51.081: I/System.out(13405): <p>Sementara itu, sosok Tri Rismaharini dinilai Panggi berpeluang menggantikan Jokowi sebagai calon presiden yang diusung PDI-P kelak.</p>
06-08 20:22:51.081: I/System.out(13405): <p class="baca"><strong>Baca: <a title="Cerita Guru Honorer di Purworejo yang Bertahan dengan Gaji Rp 200 Ribu: Ini Panggilan Jiwa" href="https://www.tribunnews.com/regional/2020/06/09/cerita-guru-honorer-di-purworejo-yang-bertahan-dengan-gaji-rp-200-ribu-ini-panggilan-jiwa">Cerita Guru Honorer di Purworejo yang Bertahan dengan Gaji Rp 200 Ribu: Ini Panggilan Jiwa</a></strong></p>
06-08 20:22:51.081: I/System.out(13405): <p class="baca"><strong>Baca: <a title="Apakah Kerusuhan di AS Menguntungkan Perekonomian Indonesia? Ini Kata Ekonom Bhima Yudhistira" href="https://www.tribunnews.com/nasional/2020/06/09/kerusuhan-di-as-bikin-dana-asing-mengalir-ke-indonesia">Apakah Kerusuhan di AS Menguntungkan Perekonomian Indonesia? Ini Kata Ekonom Bhima Yudhistira</a></strong></p>
06-08 20:22:51.081: I/System.out(13405): <p>Namun, menurut dia, akan lebih baik jika Risma turut bertarung dalam Pilkada DKI Jakarta 2022 terlebih dahulu.</p>
06-08 20:22:51.081: I/System.out(13405): <p>"Lalu, pada Pilpres 2024 bisa maju lagi bertarung menjadi calon presiden," ujar dia.</p>
06-08 20:22:51.081: I/System.out(13405): <p class="baca"><strong>Baca: <a title="Pasutri Bandar Sabu Ditangkap di Hotel Mewah, Bermula dari Jeritan Perempuan Ingin Bunuh Diri" href="https://www.tribunnews.com/regional/2020/06/09/pasutri-bandar-sabu-ditangkap-di-hotel-mewah-bermula-dari-jeritan-si-perempuan-ingin-bunuh-diri">Pasutri Bandar Sabu Ditangkap di Hotel Mewah, Bermula dari Jeritan Perempuan Ingin Bunuh Diri</a></strong></p>
06-08 20:22:51.081: I/System.out(13405): <p class="baca"><strong>Baca: <a title="Video Gerak Lambat Brutalnya Pukulan Cody Garbdrandt yang Bikin Lawan Tepar Seketika" href="https://www.tribunnews.com/sport/2020/06/08/video-gerak-lambat-brutalnya-pukulan-cody-garbdrandt-yang-bikin-lawan-tepar-seketika">Video Gerak Lambat Brutalnya Pukulan Cody Garbdrandt yang Bikin Lawan Tepar Seketika</a></strong></p>
06-08 20:22:51.081: I/System.out(13405): <p>"Risma dan Ganjar punya potensi sebagai penganti Jokowi karena kedua tokoh tersebut yang punya panggung sebagai wali kota dan gubernur," kata Pangi.</p>
06-08 20:22:51.081: I/System.out(13405): <p>Namun, yang lebih penting, kata dia, harus ada restu terlebih dahulu dari Megawati Soekarnoputri selaku Ketua Umum PDI-P untuk tiket calon Presiden 2024.</p>
06-08 20:22:51.081: I/System.out(13405): <p>Sebab, tidak mudah untuk mendapatkan tiket tersebut dari Megawati apabila Puan Maharani dan Prananda Prabowo yang merupakan putra-putrinya disiapkan menjadi capres atau cawapres lima tahun mendatang.</p>
06-08 20:22:51.081: I/System.out(13405): <figure class="op-interactive"><iframe src="https://www.youtube.com/embed/MhFMXGlbmCE" width="520" height="292" scrolling="no" frameborder="0" loading="lazy"></iframe></figure>
06-08 20:22:51.081: I/System.out(13405): <p>Artikel ini telah tayang di Kompas.com dengan judul <a href="https://nasional.kompas.com/read/2020/06/08/15104991/survei-elektabilitas-prabowo-turun-drastis-anies-kalah-dari-ganjar">"Survei: Elektabilitas Prabowo Turun Drastis, Anies Kalah dari Ganjar"</a>&nbsp;dan&nbsp;<a href="https://nasional.kompas.com/read/2019/08/05/05580091/ganjar-pranowo-dan-tri-rismaharini-dinilai-bisa-gantikan-sosok-jokowi">"Ganjar Pranowo dan Tri Rismaharini Dinilai Bisa Gantikan Sosok Jokowi".&nbsp;</a></p>
06-08 20:22:51.082: D/DnsProxyListener(5241): DNSDBG::dns addrinfo af 2
06-08 20:22:51.094: D/InputReader(5794): Input event [EV_SW]: value=1, when=4370.06447833000
06-08 20:22:51.094: D/InputReader(5794): processSwitch() : elapsed time = 0ms
06-08 20:22:51.094: D/InputManager(5794): notifySwitch: values=80, mask=80
06-08 20:22:51.094: V/WiredAccessoryManager(5794): notifyWiredAccessoryChanged: when=4370447833000 bits= mask=80
06-08 20:22:51.094: V/WiredAccessoryManager(5794): newName=h2w newState=0 headsetState=0 prev headsetState=0
06-08 20:22:51.094: E/WiredAccessoryManager(5794): No state change.
06-08 20:22:51.104: D/InputReader(5794): Input event [EV_SW]: value=0, when=4370.06457860000
06-08 20:22:51.104: D/InputReader(5794): processSwitch() : elapsed time = 0ms
06-08 20:22:51.104: D/InputManager(5794): notifySwitch: values=0, mask=80
06-08 20:22:51.104: V/WiredAccessoryManager(5794): notifyWiredAccessoryChanged: when=4370457860000 bits= mask=80
06-08 20:22:51.104: V/WiredAccessoryManager(5794): newName=h2w newState=0 headsetState=0 prev headsetState=0
06-08 20:22:51.104: E/WiredAccessoryManager(5794): No state change.
06-08 20:22:51.135: D/AndroidRuntime(13405): Shutting down VM
06-08 20:22:51.135: D/AndroidRuntime(13405): --------- beginning of crash
06-08 20:22:51.135: E/AndroidRuntime(13405): FATAL EXCEPTION: main
06-08 20:22:51.135: E/AndroidRuntime(13405): Process: mobile.android.tribun, PID: 13405
06-08 20:22:51.135: E/AndroidRuntime(13405): java.lang.NullPointerException: Attempt to invoke interface method 'int java.lang.Comparable.compareTo(java.lang.Object)' on a null object reference
06-08 20:22:51.135: E/AndroidRuntime(13405):    at java.util.Arrays.binarySearch0(Arrays.java:2367)
06-08 20:22:51.135: E/AndroidRuntime(13405):    at java.util.Arrays.binarySearch(Arrays.java:2307)
06-08 20:22:51.135: E/AndroidRuntime(13405):    at org.jsoup.nodes.Entities$EscapeMode.a(Entities.java:4)
06-08 20:22:51.135: E/AndroidRuntime(13405):    at org.jsoup.nodes.Entities.a(Entities.java:2)
06-08 20:22:51.135: E/AndroidRuntime(13405):    at org.jsoup.parser.Tokeniser.a(Tokeniser.java:42)
06-08 20:22:51.135: E/AndroidRuntime(13405):    at org.jsoup.parser.TokeniserState.b(TokeniserState.java:16)
06-08 20:22:51.135: E/AndroidRuntime(13405):    at org.jsoup.parser.TokeniserState.a(TokeniserState.java:1)
06-08 20:22:51.135: E/AndroidRuntime(13405):    at org.jsoup.parser.TokeniserState$2.a(TokeniserState.java:1)
06-08 20:22:51.135: E/AndroidRuntime(13405):    at org.jsoup.parser.Tokeniser.j(Tokeniser.java:5)
06-08 20:22:51.135: E/AndroidRuntime(13405):    at org.jsoup.parser.TreeBuilder.c(TreeBuilder.java:1)
06-08 20:22:51.135: E/AndroidRuntime(13405):    at org.jsoup.parser.TreeBuilder.b(TreeBuilder.java:2)
06-08 20:22:51.135: E/AndroidRuntime(13405):    at org.jsoup.parser.HtmlTreeBuilder.b(HtmlTreeBuilder.java:4)
06-08 20:22:51.135: E/AndroidRuntime(13405):    at org.jsoup.parser.Parser.b(Parser.java:2)
06-08 20:22:51.135: E/AndroidRuntime(13405):    at org.jsoup.Jsoup.a(Jsoup.java:2)
06-08 20:22:51.135: E/AndroidRuntime(13405):    at com.tribunnews.app.widget.b.a(ContentConjuction.kt:20)
06-08 20:22:51.135: E/AndroidRuntime(13405):    at com.tribunnews.app.widget.b.a(ContentConjuction.kt:2)
06-08 20:22:51.135: E/AndroidRuntime(13405):    at com.tribunnews.app.DetailActivity$d.a(DetailActivity.kt:37)
06-08 20:22:51.135: E/AndroidRuntime(13405):    at com.tribunnews.app.DetailActivity$d.a(DetailActivity.kt:1)
06-08 20:22:51.135: E/AndroidRuntime(13405):    at androidx.lifecycle.LiveData.b(LiveData.java:6)
06-08 20:22:51.135: E/AndroidRuntime(13405):    at androidx.lifecycle.LiveData.a(LiveData.java:8)
06-08 20:22:51.135: E/AndroidRuntime(13405):    at androidx.lifecycle.LiveData.b(LiveData.java:14)
06-08 20:22:51.135: E/AndroidRuntime(13405):    at androidx.lifecycle.t.b(MutableLiveData.java:1)
06-08 20:22:51.135: E/AndroidRuntime(13405):    at androidx.lifecycle.LiveData$a.run(LiveData.java:5)
06-08 20:22:51.135: E/AndroidRuntime(13405):    at android.os.Handler.handleCallback(Handler.java:873)
06-08 20:22:51.135: E/AndroidRuntime(13405):    at android.os.Handler.dispatchMessage(Handler.java:99)
06-08 20:22:51.135: E/AndroidRuntime(13405):    at android.os.Looper.loop(Looper.java:214)
06-08 20:22:51.135: E/AndroidRuntime(13405):    at android.app.ActivityThread.main(ActivityThread.java:7032)
06-08 20:22:51.135: E/AndroidRuntime(13405):    at java.lang.reflect.Method.invoke(Native Method)
06-08 20:22:51.135: E/AndroidRuntime(13405):    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
06-08 20:22:51.135: E/AndroidRuntime(13405):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)
06-08 20:22:51.135: E/AndroidJUnitRunner(13405): An unhandled exception was thrown by the app.
06-08 20:22:51.137: I/AndroidJUnitRunner(13405): Bringing down the entire Instrumentation process.

Solution

  • To make this question and answer complete I'm pasting my response from JSoup's github.
    NPE originates from: org.jsoup.nodes.Entities$EscapeMode.a(Entities.java:4) and here's the code

        public enum EscapeMode {
            /** Restricted entities suitable for XHTML output: lt, gt, amp, and quot only. */
            xhtml("entities-xhtml.properties", 4),
            /** Default HTML output entities. */
            base("entities-base.properties", 106),
    

    Looks like a problem with loading properties files as Android resources fixed in Jsoup issue #959. It was fixed in version 1.11.1 so try using at least this version.