Skip to Content
Kotlin📘 Ngôn ngữ Kotlin⌨️ Nhập dữ liệu (readln)

Nhập dữ liệu từ Bàn phím trong Kotlin

🎯 Mục tiêu: Học cách nhận input từ người dùng qua console với readln() và xử lý an toàn.


💡 Khái niệm

Trong console application, bạn cần nhận dữ liệu từ người dùng. Kotlin cung cấp hàm readln() (read line) để đọc một dòng input.

fun main() { println("Nhập tên của bạn:") val name = readln() println("Xin chào, $name!") }

Console:

Nhập tên của bạn: Bumbii Xin chào, Bumbii!

📝 readln() - Hàm đọc input cơ bản

Cú pháp

val input: String = readln()

readln() luôn trả về String. Nếu người dùng không nhập gì và nhấn Enter, trả về chuỗi rỗng "".

fun main() { print("Nhập thông tin: ") // Không xuống dòng val input = readln() if (input.isBlank()) { println("Bạn chưa nhập gì!") } else { println("Bạn đã nhập: $input") } }

🔢 Đọc và parse số

Parse Int

fun main() { print("Nhập tuổi: ") val ageInput = readln() val age = ageInput.toIntOrNull() if (age != null) { println("Bạn $age tuổi, năm sau bạn ${age + 1} tuổi") } else { println("Tuổi không hợp lệ!") } }

Parse Double

fun main() { print("Nhập cân nặng (kg): ") val weight = readln().toDoubleOrNull() ?: 0.0 print("Nhập chiều cao (m): ") val height = readln().toDoubleOrNull() ?: 0.0 if (weight > 0 && height > 0) { val bmi = weight / (height * height) println("BMI của bạn: ${"%.2f".format(bmi)}") } else { println("Dữ liệu không hợp lệ!") } }

🎯 Pattern: Loop until valid input

fun main() { var age: Int? = null while (age == null) { print("Nhập tuổi (số nguyên dương): ") age = readln().toIntOrNull()?.takeIf { it > 0 } if (age == null) { println("❌ Vui lòng nhập số nguyên dương!") } } println("✅ Tuổi của bạn là: $age") }

📊 Đọc nhiều giá trị từ một dòng

Split by space

fun main() { print("Nhập 2 số (cách nhau bởi dấu cách): ") val input = readln() val parts = input.split(" ") val a = parts.getOrNull(0)?.toIntOrNull() ?: 0 val b = parts.getOrNull(1)?.toIntOrNull() ?: 0 println("$a + $b = ${a + b}") }

Console:

Nhập 2 số (cách nhau bởi dấu cách): 10 20 10 + 20 = 30

Destructuring declaration

fun main() { print("Nhập 3 số (cách nhau bởi dấu cách): ") val (a, b, c) = readln().split(" ").map { it.toInt() } println("Tổng: ${a + b + c}") println("Trung bình: ${(a + b + c) / 3.0}") }

⚡ Đọc nhiều dòng

While loop

fun main() { println("Nhập các số (nhập 'done' để kết thúc):") val numbers = mutableListOf<Int>() while (true) { val input = readln() if (input == "done") break input.toIntOrNull()?.let { numbers.add(it) } } println("Các số đã nhập: $numbers") println("Tổng: ${numbers.sum()}") }

Repeat

fun main() { print("Nhập số lượng học sinh: ") val count = readln().toIntOrNull() ?: 0 val names = mutableListOf<String>() repeat(count) { index -> print("Nhập tên học sinh ${index + 1}: ") names.add(readln()) } println("Danh sách: $names") }

🛠️ Thực hành

Bài tập 1: Máy tính đơn giản

fun main() { // TODO: Nhập 2 số và phép tính (+, -, *, /) // TODO: Tính và in kết quả }

Lời giải:

fun main() { print("Nhập số thứ nhất: ") val a = readln().toDoubleOrNull() ?: 0.0 print("Nhập phép tính (+, -, *, /): ") val operator = readln() print("Nhập số thứ hai: ") val b = readln().toDoubleOrNull() ?: 0.0 val result = when (operator) { "+" -> a + b "-" -> a - b "*" -> a * b "/" -> if (b != 0.0) a / b else Double.NaN else -> Double.NaN } if (result.isNaN()) { println("Phép tính không hợp lệ!") } else { println("Kết quả: $a $operator $b = $result") } }

Bài tập 2: Đăng ký tài khoản

fun main() { // TODO: Nhập username, password, confirm password // TODO: Validate: // - Username: 4-20 ký tự // - Password: >= 8 ký tự // - Confirm password phải khớp }

Lời giải:

fun main() { println("=== ĐĂNG KÝ TÀI KHOẢN ===") print("Username (4-20 ký tự): ") val username = readln() print("Password (>= 8 ký tự): ") val password = readln() print("Xác nhận password: ") val confirmPassword = readln() val errors = mutableListOf<String>() if (username.length !in 4..20) { errors.add("Username phải từ 4-20 ký tự") } if (password.length < 8) { errors.add("Password phải có ít nhất 8 ký tự") } if (password != confirmPassword) { errors.add("Password xác nhận không khớp") } if (errors.isEmpty()) { println("✅ Đăng ký thành công!") } else { println("❌ Lỗi:") errors.forEach { println(" - $it") } } }

Bài tập 3: Quiz game

fun main() { // TODO: Hỏi 3 câu hỏi // TODO: Tính điểm (mỗi câu đúng được 1 điểm) }

Lời giải:

fun main() { data class Question(val text: String, val answer: String) val questions = listOf( Question("Thủ đô của Việt Nam là gì?", "hanoi"), Question("1 + 1 = ?", "2"), Question("Kotlin do công ty nào phát triển?", "jetbrains") ) var score = 0 println("=== QUIZ GAME ===\n") questions.forEachIndexed { index, question -> print("Câu ${index + 1}: ${question.text}\nTrả lời: ") val answer = readln().lowercase().trim() if (answer == question.answer) { println("✅ Đúng!\n") score++ } else { println("❌ Sai! Đáp án: ${question.answer}\n") } } println("=== KẾT QUẢ ===") println("Điểm của bạn: $score/${questions.size}") }

📱 Lưu ý cho Android

[!NOTE] Trong Android, bạn không sử dụng readln(). Thay vào đó, dữ liệu được nhập qua các UI components như EditText.

// Android - không dùng readln() class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val nameEditText = findViewById<EditText>(R.id.nameEditText) val submitButton = findViewById<Button>(R.id.submitButton) submitButton.setOnClickListener { val name = nameEditText.text.toString().trim() // Xử lý input ở đây } } }

⚠️ Lưu ý quan trọng

[!WARNING] readlnOrNull() vs readln():

// readln() - throw exception nếu EOF val input = readln() // Có thể crash nếu không có input // readlnOrNull() - trả về null nếu EOF (an toàn hơn) val safeInput = readlnOrNull() ?: ""

[!TIP] Luôn trim input:

val input = readln().trim() // Loại bỏ khoảng trắng đầu/cuối

✅ Checklist - Tự kiểm tra

Sau bài học này, bạn có thể:

  • Sử dụng readln() để đọc input từ console
  • Parse input thành số với toIntOrNull(), toDoubleOrNull()
  • Xử lý input không hợp lệ với Elvis operator ?:
  • Đọc nhiều giá trị với split()
  • Tạo vòng lặp để nhận input cho đến khi hợp lệ
  • Validate input trước khi sử dụng

Tiếp theo: Các toán tử số học

Last updated on