Как объявить и инициализировать глобальную переменную за один раз [дубликат]

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

33
задан robbmj 29 March 2015 в 12:59
поделиться

3 ответа

Если вы случайно используете «Func» или «function» или «Function» вместо «func», вы также получите:

заявление без декларации вне тела функции

Проводя это, потому что я изначально оказался здесь в своем поиске, чтобы выяснить, что не так.

10
ответ дан J.M.I. MADISON 19 August 2018 в 07:02
поделиться

Вам нужно

var test = "This is a test"

:= работает только в функциях, а нижний регистр «t» таков, что он виден только в пакете (непортированный).

Более подробное объяснение

test1.go

package main

import "fmt"

// the variable takes the type of the initializer
var test = "testing"

// you could do: 
// var test string = "testing"
// but that is not idiomatic GO

// Both types of instantiation shown above are supported in
// and outside of functions and function receivers

func main() {
    // Inside a function you can declare the type and then assign the value
    var newVal string
    newVal = "Something Else"

    // just infer the type
    str := "Type can be inferred"

    // To change the value of package level variables
    fmt.Println(test)
    changeTest(newVal)
    fmt.Println(test)
    changeTest(str)
    fmt.Println(test)
}

test2.go

package main

func changeTest(newTest string) {
    test = newTest
}

output

testing
Something Else
Type can be inferred

Альтернативно, для более сложных инициализаций пакетов или для настройки того, что требуется для пакета, пакет GO предоставляет функцию init.

package main

import (
    "fmt"
)

var test map[string]int

func init() {
    test = make(map[string]int)
    test["foo"] = 0
    test["bar"] = 1
}

func main() {
    fmt.Println(test) // prints map[foo:0 bar:1]
}

Init будет вызываться до запуска main.

39
ответ дан robbmj 19 August 2018 в 07:02
поделиться
  • 1
    Почему этот тип инициализации работает? – sergserg 11 December 2013 в 02:43
  • 2
    Если присутствует инициализатор, тип может быть опущен; переменная примет тип инициализатора. – robbmj 11 December 2013 в 02:46
0
ответ дан Walk 30 October 2018 в 19:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: