Tech
Batal
KATEGORI
link has been copied
8
KASKUS
51
244
https://www.kaskus.co.id/thread/58554b0650741020698b456b/java---gimana-cara-penyesuaian-class-generik-dalam-queue
Permisi gan, saya mau nanya tentang dilema yang sedang saya hadapi :( Mohon maaf kalo (mungkin) judul & isi threadnya ga akurat... Ceritanya saya mahasiswa yang lagi belajar struktur data ... Pada suatu hari .. Saya diberi tugas membuat program QUEUE (Antrian) dasar menggunakan Class Generik ( yang pake kurung diamond <> ). Setau saya, kalo program yang pake Class Generik semua tipe data bis
Lapor Hansip
17-12-2016 21:26

[JAVA] - Gimana cara penyesuaian class generik dalam QUEUE ?

Permisi gan, saya mau nanya tentang dilema yang sedang saya hadapi emoticon-Frown
Mohon maaf kalo (mungkin) judul & isi threadnya ga akurat...


Ceritanya saya mahasiswa yang lagi belajar struktur data ...
Pada suatu hari ..
Quote:
Saya diberi tugas membuat program QUEUE (Antrian) dasar menggunakan Class Generik ( yang pake kurung diamond <> ).
Setau saya, kalo program yang pake Class Generik semua tipe data bisa pake class tsb (contohnya : <String>, <Integer>, <Object> )

"Klo misalnya saya salah mengenai generik diatas. Pls, CMIIW"


masalah terjadi saat saya menggunakan class tersebut untuk data Integer. Dengan contoh method:
Method ala saya


Dalam ekspektasi saya. Jika generik saat itu adalah data Interger.
return null = null (bila String atau Char, CMIIW)
return null = 0 - nol (bila Integer, CMIIW)


Eksekusi Method

Tapi, ketika program di-exe. Muncul baris error berikut :

Pesan Error


Dari kasus yang saya alami, saya ingin bertanya :
Question


Penutup
Diubah oleh lo36oe
0
Masuk atau Daftar untuk memberikan balasan
[JAVA] - Gimana cara penyesuaian class generik dalam QUEUE ?
17-12-2016 23:40
classnya dilengkapin deh, jadi kelihatan source di baris 28
atau upload ke ideone, jadi bisa di analyze bareng

Code:

Exception in thread "main" java.lang.NullPointerException

at Queue_Antrian.RunQueueInteger.main(RunQueueInteger.java:28)
0 0
0
[JAVA] - Gimana cara penyesuaian class generik dalam QUEUE ?
18-12-2016 07:12
Quote:Original Posted By pekoy154
classnya dilengkapin deh, jadi kelihatan source di baris 28
atau upload ke ideone, jadi bisa di analyze bareng

Code:

Exception in thread "main" java.lang.NullPointerException

at Queue_Antrian.RunQueueInteger.main(RunQueueInteger.java:28)

Berdasarkan pertanyaan yang ditanyakan, kayaknya TS harus diajarin ulang dari 0.
Percuma aja mau analisa baris 28 kalo null dan tipe data primitif aja ngak ngerti.
0 0
0
[JAVA] - Gimana cara penyesuaian class generik dalam QUEUE ?
18-12-2016 09:29
Hasil kompile di CMD


==================

Quote:Original Posted By pekoy154
classnya dilengkapin deh, jadi kelihatan source di baris 28
atau upload ke ideone, jadi bisa di analyze bareng

Code:

Exception in thread "main" java.lang.NullPointerException

at Queue_Antrian.RunQueueInteger.main(RunQueueInteger.java:28)


Oke kak, ini source kode ane gabungin semua. emoticon-Big Grin

Kod


Quote:Original Posted By neko

Berdasarkan pertanyaan yang ditanyakan, kayaknya TS harus diajarin ulang dari 0.
Percuma aja mau analisa baris 28 kalo null dan tipe data primitif aja ngak ngerti.


Ya makanya ane bikin thread buat bertanya Kak/Bang, minta diajarin. emoticon-Big Grin
Saya kenal "null" aja baru kemaren, belajar struktur data baru coba2 emoticon-Big Grin
0 0
0
[JAVA] - Gimana cara penyesuaian class generik dalam QUEUE ?
18-12-2016 13:03
Quote:Original Posted By lo36oe
Ya makanya ane bikin thread buat bertanya Kak/Bang, minta diajarin. emoticon-Big Grin
Saya kenal "null" aja baru kemaren, belajar struktur data baru coba2 emoticon-Big Grin

Punya buku Java?
Kalo ngak punya ke http://docs.oracle.com/javase/tutorial/index.html
Pelajari dari awal, jangan ada yang dilompati.
Ntar ketemu null.
Agak susah buat dijelasin jadi mending baca sendiri.

BTW kalau mau belajar struktur data mending pake bahasa C, lebih kerasa layout data-nya.
Diubah oleh neko
0 0
0
[JAVA] - Gimana cara penyesuaian class generik dalam QUEUE ?
08-01-2017 12:10
Quote:Original Posted By lo36oe

1. Apakah mungkin kode diatas diperbaiki ?
"agar hasil sout tidak error." (hasil "2" bisa dicetak)

2. null itu sebenarnya apa & bagaimana ?
apakah nilai String yang kosong = null. Integer yang kosong = 0
(Soalnya baru2 ini juga pake "null")

3. Nilai default yang benar apa aja gan ? (Untuk setiap tipe data)
Keraguan saya terjadi pada tipe data 'char'.
defaultnya "0" (karena kode ascii) atau juga "null" ?

4. Kenapa String "Antrian terdepan: 9" diulang 2x ?
padahal methodnya sudah masuk int "tes". Seharusnya cuma angka saja. CMIIW

5. "java.lang.NullPointerException" artinya apa ?

6. Berdasarkan No.5 : Pointer itu apa ? Kegunaannya ?

7. Trik atau teknik Kakak/Abang sekalian dalam belajar pemrograman (JAVA) ?
Untuk bahan2 belajar saya & siapa saja.


Jawaban :
1. saya cek dulu, codenya cukup berantakan dan unreadable. biar saya coba debug dulu

2. untuk null penjelasannya agak panjang. tapi akan mudah dimengerti jika agan familier dengan pointer di C/C++.
saya rangkum saja.
jadi ceritanya gini, pertama agan harus tau dulu bentuk data di dalam ram itu seperti apa. semua data di ram itu sebetulnya merupakan angka integral (bukan koma) yang di representasikan dalam biner. misal saya simpan nilai integer 10, maka yang disimpan di ram adalah angka 0000 0000 0000 0000 0000 0000 1010, karena 1010 adalah representasi angka 10 dari biner. sama halnya dengan char, sebetulnya yang disimpan adalah angka kode ASCII (umunya) nya yang nanti akan di terjemahkan menjadi karakter sesuai nilai karakternya di table ASCII. floating point pun punya aturan tersendiri dimana bilangannya ditulis dengan notasi ilmiah yang dikalikan dengan 2^n.

ram sendiri bentuknya seperti laci yang bertumpuk-tumpuk dan diberi nomer. tiap laci besarnya 1 byte. setiap kali program membutuhkan laci, maka program akan meminta tempat ke OS, nantinya OS akan memberi tahu nomer laci yang bisa dipakai. laci ini pada dasarnya ditaruh bertumpuk. jadi misalkan program agan minta laci untuk array sepanjang 10 byte, maka akan diberikan laci, misal nomer 100 - 110. lalu ketika ada program lain meminta laci, maka akan diberikan diatasnya, yaitu mulai dari 111 dan seterusnya. itu salah satu alasan kenapa array tidak bisa bertambah panjang, karena tempat diatasnya bisa jadi sudah dipakai. bentuk urutan data seperti ini biasa di sebut stack

untungnya, ada pengurutan data selain stack, biasa disebut heap. alih-alih ditaruh bertumpuk, heap ditaruh di laci-laci paling atas dari ram. namun untuk mengaksesnya, dibutuhkan pointer, karena pada dasarnya processor akan membaca instruksi satu-persatu dari bawah yang tentu akan berada di stack, sehingga harus diberikan pointer di stack yang menunjuk ke heap.

pointer sendiri sebetulnya berisi angka yang mewakili alamat di heap. jadi misal saya menyimpan data di heap di laci ke 1000, maka akan ada pointer di stack yang berisi angka 1000 yang digunakan sebagai penunjuk ke alamat di heap.

nah di java secara garis besar ada 2 jenis data, yaitu object reference dan primitive. data primitive diantaranya adalah int, char, float, double, dst. data ini berisi nilai integralnya. jadi misal saya tulis : int angka = 1; sebetulnya yang dilakukan adalah, program menyimpan angka 1 ke laci yang telah dipesan di ram, laci ini selanjutnya seakan-akan diberi nama angka.

lain halnya dengan object reference, semua object di java ternyata disimpan di heap, sehingga dibutuhkan pointer untuk mengaksesnya, jadi ketika saya tuliskan: Integer angkaObject = 1; yang sebetulnya dilakukan adalah, program membuat sebuah object bertipe Integer dan menyimpannya di heap, lalu dibuat sebuah variable yang seakan-akan bernama angkaObject yang berisi nomer laci object Integer tersebut. ini yang disebut sebagi object reference. hal yang sama juga berlaku untuk string maupun semua object apapun di java. cara ini memungkinkan kita untuk membuat linkedlist dan tipe data lainnya yang bisa bertambah panjang, karena sebetulnya yang dilakukan adalah meminta tempat baru di heap dan menunjuknya dengan sebuah pointer.

disini ada beberapa hal yang harus diperhatikan:

1. myClass a = new myClass(); //membuat object di heap bertipe myClass dan menyimpan nomer laci ke "a"
myClass b = a; //menyimpan nomer laci dari object "a" ke "b"
b.value = "new value"; //mengubah nilai value milik object "a", karena sebetulnya object a dan b merujuk ke laci yang sama. ingat, banyak yang terjebak disini!

2. int a = 1; //menyimpan angka satu ke "a"
int b = a; //mengopi nilai milik a ke b
b++; //menambah nilai b dengan 1, disini nilai a tidak berubah karena mereka adalah variable primitive dan memiliki nilai mereka sendiri-sendiri

nilai null sendiri merupakan penanda bahwa object tersebut tidak merujuk ke alamat manapun di heap. misal:
myClass a = new myClass() (); //membuat object di heap bertipe myClass dan menyimpan nomer laci ke "a"
a = null; //sekarang "a" tidak menyimpan nomer laci apapun

nilai default variable object sendiri adalah null, jadi ketika kita menulis:
myClass a;
sebetulnya program membuat sebuah pointer namun berisi nilai null, atau tidak merujuk kemana-mana

3 nilai default untuk object adalah null, perlu diperhatikan, Integer adalah object, int adalah primitive. untuk data primitive, nilai defaultnya adalah biner 0, jika diterjemahkan maka untuk int, byte, short : 0, float, double : 0.0, char : '' (char kosong), boolean : false.

4 harus saya debug dulu

5 artinya, program mencoba mengakses object di heap, namun isi variablenya adalah null, sehingga program tidak bisa mengakses kemana-mana

6 penjelasan pointer sudah saya jelaskan di nomer 2

7 trik saya, pahami bahasanya, struktur datanya, cara kerja bahasanya, bukan cuma hapal API, karena API dan library itu sebetulnya bisa dihapal ataupun dicari di google, tapi untuk bisa menulis code yang berkualitas, harus mengerti apa yang sebenarnya terjadi pada program yang kita tulis. jangan lupa juga untuk sering melakukan debugging.
Diubah oleh nay1
0 0
0
[JAVA] - Gimana cara penyesuaian class generik dalam QUEUE ?
08-01-2017 14:43
Quote:Original Posted By lo36oe
1. Apakah mungkin kode diatas diperbaiki ?
"agar hasil sout tidak error." (hasil "2" bisa dicetak)

4. Kenapa String "Antrian terdepan: 9" diulang 2x ?
padahal methodnya sudah masuk int "tes". Seharusnya cuma angka saja. CMIIW


1 ternyata penyebab errornya sangat sederhana. dibagian ini :

x.makeEmpty();
int tesa = 1 + x.viewFirst();

ketika anda memanggil method makeEmpty, anda membuat nilai dari listQueue beris null semua. hal ini mengakibatkan method viewFirst akan mengembalikan nilai null. maka yang terjadi adalah :

int tesa = 1 + null;

sederhananya, program mencoba mengambil nilai yang di tunjuk oleh listQueue index pertama, sedangkan index pertama tidak menunjuk kemana-mana sehingga terjadi error nullPointerException.
untuk fix tercepat namun kurang bagus, cukup mengubah baris tersebut menjadi seperti ini :

x.makeEmpty();
Integer value = x.viewFirst();
if(value == null){
value = 0;
}
int tesa = 1 + value;

4 jelas diulang 2 kali. karena ketika method viewFirst di call, maka semua perintah yang berada didalamnya akan dijalankan. setelah selesai, baru nilai return dikembalikan. Karena viewFirst dipanggil 2x, maka program akan melakukan print 2x, tidak peduli jika hasil dari return di ambil atau diabaikan.
0 0
0
[JAVA] - Gimana cara penyesuaian class generik dalam QUEUE ?
08-01-2017 16:16
Quote:Original Posted By lo36oe
Setelah saya kompile. muncul 2 baris note yang ngasih tau file saya pake operasi "unchecked" atau operasi "tak aman"
itu maksudnya apaan gan ?

ketika meng compile tambahkan argument
-Xlint:unchecked

unchecked cast => listQueue = (E[]) new Object[LIMIT];
berarti melakukan casting yg beresiko karena ada kemungkinan object yg di cast tidak bisa di konversi ke tipe yg diinginkan (E). salah satu caranya adalah mengganti array dengan Vector atau List.

Vector<E> listQueue;

listQueue=new Vector<E>(LIMIT);


unchecked conversion => IdeWan<Integer> x = new IdeWan(5);
yg kiri IdeWan-Integer yg kanan IdeWan aja, harusnya keduanya disamakan

IdeWan<Integer> x = new IdeWan<Integer>(5);

atau

IdeWan<Integer> x = new IdeWan<>(5);
0 0
0
[JAVA] - Gimana cara penyesuaian class generik dalam QUEUE ?
08-01-2017 21:22
Yang bener adalah ya nilai null itu tidak bisa dipakai di operasi penambahan (null itu bukan 0),
null itu merepresentasi "ketiadaan objek"

Code:

// Dugaan saya, harusnya 2. karena queue udah kosong
int tesa = 2 + x.viewFirst(); // baris 28 yang error
System.out.println("Tes: " + tesa);


Dugaan kamu di awal sudah salah, karena method kamu mereturn null, yang artinya "tidak ada".
Apa sekarang artinya 2 + "tidak ada", yah tidak masuk akal, (disebutnya Null Pointer Exception), mencoba mengoperasikan sesuatu (penjumlahan) terhadap objek yang tidak ada emoticon-Smilie

emoticon-Toast
--
coolpie

Cek thread IT ane: https://kask.us/hnalI
0 0
0
icon-hot-thread
Hot Threads
obrolan-hangat-logo
Obrolan Hangat
Handphone & Tablet
Copyright © 2020, Kaskus Networks, PT Darta Media Indonesia