哪些编程语言没有运行时异常?

string name = null; name.ToLower();

在大多数语言中,这些代码将被编译 哪些语言会在编译时捕获这个错误?

我现在知道的唯一一个是榆树: http : //elm-lang.org

这是一个默认情况下不允许变量为空的语言列表。

这使得它们更安全,在编译时防止所有的NullPointerException ,并且更清晰,因为只要查看代码,就知道允许哪里传递null,哪里不传递。

大多数这些语言还提供了许多其他编译时安全功能。

如果你正在寻找一种能够在编译时尽可能地防止错误的语言, Rust就是最好的选择。 Rust没有运行时异常(除了panic!会使程序崩溃),而是使用返回值进行错误处理。

 let name = None; // error: mismatched types let name: Option<String> = None; // ok name.to_lowercase(); // error: no method named `to_lowercase` found for type `Option` // correct: match name { None => { /* handle None */ }, Some(value) => { value.to_lowercase(); }, } // or to ignore None and crash if name == None name.unwrap().to_lowercase(); 

Rust的核心概念之一是没有其他语言(afaik),它是在编译时防止悬挂引用的生命周期 。 但是,这是垃圾收集和引用计数的语言不需要的东西。


Swift也比平均安全,但它包含运行时异常。

 let name = nil // error: type of expression is ambiguous without more context let name: String? = nil // ok name.lowercaseString // error: value of optional type 'String?' not unwrapped; did you mean to use '!' or '?'? name!.lowercaseString // will crash at runtime with: fatal error: unexpectedly found nil while unwrapping an Optional value name?.lowercaseString // calls method only if name != nil 

Kotlin是一种更安全的JVM语言,也可以编译为JavaScript。 科特林也有例外。

 val name = null name.toLowerCase() // compile-error if (name != null) name.toLowerCase() // ok name?.toLowerCase() // call only if non-null 

Ada是为安全关键目的而设计的语言。 根据http://www.adaic.org/advantages/features-benefits/ ,其“许多内置检查允许编译器或链接器检测基于C的语言中只能在运行时被捕获的错误” 。


Go没有例外。 像Rust一样,它使用返回值来表示错误。 但它不是无效的:

 // strings can't be nil: var name string = nil // error: cannot use nil as type string in assignment // string pointers can: var name *string = nil // ok string.ToLower(*name) // panic: runtime error: invalid memory address