【问题标题】:Parking lot project error: when using a scanner. NoSuchElementException停车场项目错误:使用扫描仪时。 NoSuchElementException
【发布时间】:2020-11-11 00:20:15
【问题描述】:

感谢您的所有帮助。 我一直在做一个课程项目,我必须制作一个可以登记汽车的停车场。当我在我的 IDE 中使用它时它工作正常,但是当我通过平台测试运行它时,在第一个测试中,没有问题,但是当第二次迭代达到 "when (val command =scanner.next()) " 在 createOrder 乐趣中,它会因错误而崩溃:

java.lang.AssertionError: Exception in test #1

Probably your program run out of input (Scanner tried to read more than expected).

java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:862)
    at java.util.Scanner.next(Scanner.java:1371)
    at parking.ParkingLot.createOrder(Main.kt:39)
    at parking.ParkingLot.start(Main.kt:31)
    at parking.MainKt.main(Main.kt:6)
    at parking.MainKt.main(Main.kt)

Please find below the output of your program during this failed test.
Note that the '>' character indicates the beginning of the input line.

---

> park KA-01-HH-1234 White
White car parked in spot 1.

这个想法是测试输入了许多汽车,但在尝试进行第二个输入时它崩溃了

这是我的代码(对不起,如果我的代码很乱,我还在学习)


import java.util.*

fun main() {
    ParkingLot.start()
}

class Car(val regNumber: String = "", val color: String = "") {

}

class Order(val command: String) {
    lateinit var regNum: String
    lateinit var color: String
    lateinit var spot: String
    lateinit var status: String

}

object ParkingLot {
    val spaces: Array<Pair<String?, Car?>> = Array(20) { Pair(null, null) }
    const val occupied = "occupied"
    const val park = "park"
    const val leave = "leave"
    const val exit = "exit"

    fun start() {
        val scanner = Scanner(System.`in`)
        do {
            val order = createOrder(scanner)
            interaction(order, scanner)
        } while (order.command != exit)
    }

   fun createOrder(scanner: Scanner): Order {

        when (val command = scanner.next()) {
            park -> {
                val parkOrder = Order(command)
                parkOrder.regNum = scanner.next()
                parkOrder.color = scanner.next()
                parkOrder.status = "valid"
                return parkOrder
            }
            leave -> {
                val retrieveOrder = Order(command)
                retrieveOrder.spot = scanner.next()
                retrieveOrder.status = "valid"
                return retrieveOrder
            }
            exit -> {
                val exitOrder = Order(command)
                exitOrder.status = "valid"
                return exitOrder
            }

            else -> {
                val incorrectOrder = Order(command)
                incorrectOrder.status = "invalid"
                return incorrectOrder
            }
        }
    }


    fun interaction(order: Order, scanner: Scanner) {

        if (order.command == park) {
//            val toParkCar = Car(order.regNum, order.color)
            park(Car(order.regNum, order.color))
        }
        if (order.command == leave) {
            leave(order)
        }
        if (order.command == exit) return
//TODO update the error msg to include exit command
        if (order.status == "invalid") println("\"${order.command}\" isn't a valid , either use \"park\" or \"leave\"")
//        scanner.close()
    }

    fun park(car: Car) {
        for ((index, item) in spaces.withIndex()) {
            if (item.first == null) {
                spaces[index] = Pair(occupied, car)
                println("${car.color} car parked in spot ${index + 1}.")
                return
            }
        }
        println("Sorry, the parking lot is full.")
    }

    fun leave(order: Order) {
        if (spaces[order.spot.toInt() - 1].first == occupied) {
            spaces[order.spot.toInt() - 1] = Pair(null, null)
            println("Spot ${order.spot} is free.")
        } else {
            println("There is no car in spot ${order.spot}.")
        }
    }
} 

【问题讨论】:

  • 您的代码是否包含产生“java.lang.AssertionError: Exception in test #1”的断言?通常,一个断言发生是为了告诉你一些具体的事情,因为它正在测试某事是真实的还是不真实的。如果您知道该断言在哪里失败,那么一条关键信息可能就是它所断言的内容……也就是说,断言语句中的布尔表达式是什么?如果您找到此断言代码,请将其添加到您的问题中。另外,您是否有该错误消息附带的堆栈跟踪?如果是这样,请在您的问题中提出。
  • 好的,我将添加堆栈跟踪。如果这是一个愚蠢的问题,我很抱歉,但断言是什么,我怎样才能得到它?
  • 语句“assert ”是您在代码中添加的内容,用于仔细检查您所做的假设。它们不会(或至少不应该)影响程序的逻辑。如果您对代码运行方式的假设是否真的不正确,它们会通知您。
  • 您如何将输入输入到您的程序中。难道问题出在代码告诉你的……你没有给它足够的输入?
  • 哦,好吧,我没有仔细检查。我确实用“scanner.hasNext()”尝试过,但它没有用。并且测试提供输入,我不确定它是如何做到的

标签: kotlin java.util.scanner nosuchelementexception


【解决方案1】:

好的,所以我注意到这是 JetBrains 插件的问题。我不知道为什么,但解决方案是将扫描仪从功能中取出并直接放在主循环中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-04
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多