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

Tom*_*mas 4 exception strong-typing

string name = null; name.ToLower();

在大多数语言中,这样的代码会编译 哪些语言会在编译时捕获此类错误?

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

eml*_*lai 15

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();
Run Code Online (Sandbox Code Playgroud)

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


Swift比平均值更安全,但它确实包含运行时异常.但是,Swift的异常比C++,Java,C#等更明确(例如,你必须为每个调用前缀抛出一个抛出函数try,并且函数声明必须指定该函数是否可以抛出).

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
Run Code Online (Sandbox Code Playgroud)

Kotlin是一种更安全的JVM语言,它也可以编译为JavaScript.Kotlin也有例外.

val name = null
name.toLowerCase() // compile-error

if (name != null)
    name.toLowerCase() // ok

name?.toLowerCase() // call only if non-null
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 这个答案太棒了. (2认同)

eml*_*lai 0

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

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

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