Saya menggunakan Eclipse IDE untuk mengembangkan, mengkompilasi, dan menjalankan proyek Java saya. Hari ini, saya mencoba menggunakan java.io.Console
kelas untuk mengelola keluaran dan, yang lebih penting, masukan pengguna.
Masalahnya adalah yang System.console()
kembali null
ketika aplikasi dijalankan "melalui" Eclipse. Eclipse menjalankan program pada proses latar belakang, bukan proses tingkat atas dengan jendela konsol yang kita kenal.
Apakah ada cara untuk memaksa Eclipse menjalankan program sebagai proses tingkat atas, atau setidaknya membuat Konsol yang akan dikenali JVM? Jika tidak, saya terpaksa mengacaukan proyek dan menjalankan lingkungan baris perintah di luar Eclipse.
System.out
danSystem.in
mencukupi untuk kasus penggunaan saya dan berhenti menggunakanSystem.console()
.Jawaban:
Saya berasumsi Anda ingin dapat menggunakan langkah-langkah debugging dari Eclipse. Anda bisa menjalankan kelas secara eksternal dengan menyetel kelas yang dibangun di direktori bin pada jalur kelas JRE.
Anda dapat men-debug menggunakan debugger jarak jauh dan memanfaatkan file kelas yang dibangun dalam proyek Anda.
Dalam contoh ini, struktur proyek Eclipse terlihat seperti ini:
1. Mulai Konsol JVM dalam Mode Debug
debug.bat adalah file batch Windows yang harus dijalankan secara eksternal dari konsol cmd.exe .
Dalam argumen, port debug telah disetel ke 8787 . The menangguhkan = y argumen memberitahu JVM untuk menunggu sampai atase debugger.
2. Buat Konfigurasi Peluncuran Debug
Di Eclipse, buka dialog Debug (Run> Open Debug Dialog ...) dan buat konfigurasi Aplikasi Java Jarak Jauh baru dengan setelan berikut:
3. Debugging
Jadi, yang harus Anda lakukan kapan pun Anda ingin men-debug aplikasi adalah:
Anda dapat melacak masalah ini di bug 122429 . Anda dapat mengatasi masalah ini dalam aplikasi Anda dengan menggunakan lapisan abstraksi seperti yang dijelaskan di sini .
sumber
pause
di akhir file batch itu sehingga Anda dapat melihat pesan kesalahan yang muncul sebelum ditutup.Solusi yang saya gunakan adalah dengan hanya menggunakan System.in/System.out daripada Konsol saat menggunakan Eclipse. Misalnya, alih-alih:
Kamu bisa memakai:
sumber
IOException
, yang tidak terlempar dalam kasusConsole.readLine()
.Alasan hal ini terjadi adalah karena eclipse menjalankan aplikasi Anda sebagai proses latar belakang dan bukan sebagai proses tingkat atas dengan konsol sistem.
sumber
Anda dapat menerapkan kelas sendiri. Berikut ini contohnya:
sumber
Temukan sesuatu tentang ini di http://www.stupidjavatricks.com/?p=43 .
Dan sayangnya, karena konsol sudah final, Anda tidak dapat memperluasnya untuk membuat pembungkus di sekitar system.in dan system.out yang juga melakukannya. Bahkan di dalam konsol gerhana Anda masih memiliki akses ke sana. Mungkin itu sebabnya eclipse belum menghubungkan ini ke konsol mereka ...
Saya mengerti mengapa Anda tidak ingin memiliki cara lain untuk mendapatkan konsol selain System.console, tanpa penyetel, tetapi saya tidak mengerti mengapa Anda tidak ingin seseorang dapat menimpa kelas untuk membuat tiruan / konsol pengujian ...
sumber
Opsi lainnya adalah membuat metode untuk menggabungkan kedua opsi, dan "gagal" ke metode System.in saat Konsol tidak tersedia. Contoh di bawah ini cukup mendasar - Anda dapat mengikuti proses yang sama untuk menyelesaikan metode lain di Console (readPassword, format) sesuai kebutuhan. Dengan cara itu Anda dapat menjalankannya dengan senang hati di Eclipse & saat diterapkan, Anda mendapatkan fitur Konsol (mis. Penyembunyian kata sandi) mulai bekerja.
sumber
Sejauh yang saya tahu, tidak ada cara untuk mendapatkan objek Konsol dari Eclipse. Saya hanya akan memastikan konsol itu! = Null, lalu JAR dan jalankan dari baris perintah.
sumber
Sepertinya tidak ada cara untuk mendapatkan objek java.io.Console saat menjalankan aplikasi melalui Eclipse. Jendela konsol baris perintah tidak dibuka dengan aplikasi, karena dijalankan sebagai proses latar belakang (latar belakang ke Eclipse?). Saat ini, tidak ada plugin Eclipse untuk menangani masalah ini, terutama karena java.io.Console adalah kelas terakhir.
Yang benar-benar dapat Anda lakukan adalah menguji objek Konsol yang dikembalikan untuk null dan melanjutkan dari sana.
sumber
Tautan ini menawarkan alternatif untuk menggunakan System.console (). Salah satunya adalah dengan menggunakan BufferedReader yang melingkari System.in, yang kedua adalah menggunakan Scanner yang membungkus System.in.
Tidak ada yang sesingkat konsol, tetapi keduanya bekerja dalam gerhana tanpa harus menggunakan debug kekonyolan!
sumber
Katakanlah ruang kerja Eclipse Anda adalah C: \ MyWorkspace, Anda membuat aplikasi java di dalam proyek maven MyProject, dan kelas utama Java Anda adalah com.mydomain.mypackage.MyClass.
Dalam hal ini, Anda dapat menjalankan kelas utama yang menggunakan
System.console()
baris perintah:NB1: jika tidak ada dalam proyek maven, periksa folder keluaran di properti proyek | Jalur Membangun Java | Sumber. Ini mungkin bukan "target / kelas"
NB2: jika ini adalah proyek maven, tetapi kelas Anda ada di src / test / java, Anda mungkin harus menggunakan "target \ test-class" daripada "target \ kelas"
sumber