Делает Java, имеют эквивалент C# с помощью пункта

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, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

24
задан Raedwald 21 September 2013 в 10:50
поделиться

10 ответов

Да. Java 1.7 представил попытка с ресурсами конструкция, разрешающая Вам записать:

try(InputStream is1 = new FileInputStream("/tmp/foo");
    InputStream is2 =  new FileInputStream("/tmp/bar")) {
         /* do stuff with is1 and is2 */
}

... точно так же, как using оператор.

, К сожалению, перед Java 1.7, программисты Java были вынуждены использовать попытку {...} Наконец {...}. В Java 1.6:

InputStream is1 = new FileInputStream("/tmp/foo");
try{

    InputStream is2 =  new FileInputStream("/tmp/bar");
    try{
         /* do stuff with is1 and is 2 */

    } finally {
        is2.close();
    }
} finally {
    is1.close();
}
27
ответ дан Aaron Maenpaa 28 November 2019 в 23:25
поделиться

Самый близкий эквивалент в языке должен использовать попытку наконец.

using (InputStream in as FileInputStream("myfile")) {
    ... use in ...
}

становится

final InputStream in = FileInputStream("myfile");
try {
    ... use in ...
} finally {
    in.close();
}

Примечание, которое общая форма всегда:

acquire;
try {
    use;
} finally {
    release;
}

, Если приобретение в блоке попытки, Вы выпустите в случае, который приводит к сбою приобретение. В некоторых случаях Вы могли бы быть в состоянии бездельничать с ненужным кодом (обычно тестирующий на пустой указатель в вышеупомянутом примере), но в случае, скажем, ReentrantLock плохие вещи произойдут.

при выполнении того же самого часто можно использовать, "выполняются вокруг" идиомы. К сожалению, синтаксис Java является подробным, таким образом, существует много пластины бойлера.

fileInput("myfile", new FileInput<Void>() {
   public Void read(InputStream in) throws IOException {
       ... use in ...
       return null;
   }
});

, где

public static <T> T fileInput(FileInput<T> handler) throws IOException {
    final InputStream in = FileInputStream("myfile");
    try {
        handler.read(in);
    } finally {
        in.close();
    }
}

более сложный пример мои, например, обертывают исключения.

5
ответ дан Tom Hawtin - tackline 28 November 2019 в 23:25
поделиться

Не то, чтобы я знаю. Можно несколько моделировать с попыткой... наконец блок, но это все еще не вполне то же.

2
ответ дан Bob King 28 November 2019 в 23:25
поделиться

Самой близкой можно войти в Java, является попытка/наконец. Кроме того, Java не обеспечивает неявный Доступный тип.

C#: обзор переменной вне блока использования

public class X : System.IDisposable {

    public void Dispose() {
        System.Console.WriteLine("dispose");
    }

    private static void Demo() {
        X x = new X();
        using(x) {
            int i = 1;
            i = i/0;
        }
    }

    public static void Main(System.String[] args) {
        try {
            Demo();
        } catch (System.DivideByZeroException) {}
    }

}

Java: обзор переменной вне блока

public class X {

    public void dispose() {
        System.out.println("dispose");
    }

    private static void demo() {
        X x = new X();
        try {
            int i = 1 / 0;
        } finally {
            x.dispose();
        }        
    }

    public static void main(String[] args) {
        try {
            demo();
        } catch(ArithmeticException e) {}
    }

}

C#: обзор переменной в блоке

public class X : System.IDisposable {

    public void Dispose() {
        System.Console.WriteLine("dispose");
    }

    private static void Demo() {
        using(X x = new X()) {
            int i = 1;
            i = i/0;
        }
    }

    public static void Main(System.String[] args) {
        try {
            Demo();
        } catch (System.DivideByZeroException) {}
    }

}

Java: обзор переменной в блоке

public class X {

    public void dispose() {
        System.out.println("dispose");
    }

    private static void demo() {
        {
            X x = new X();
            try {
                int i = 1 / 0;
            } finally {
                x.dispose();
            }
        }
    }

    public static void main(String[] args) {
        try {
            demo();
        } catch(ArithmeticException e) {}
    }

}
2
ответ дан McDowell 28 November 2019 в 23:25
поделиться

Я думаю, что можно достигнуть чего-то подобного блоку "использования", реализовав анонимный внутренний класс. Как Spring делает с "Шаблонами Дао".

1
ответ дан Pablo Fernandez 28 November 2019 в 23:25
поделиться

Ну, в любом случае использование было синтаксическим сахаром, так что ребята из Java, не переживайте.

0
ответ дан Andrei Rînea 28 November 2019 в 23:25
поделиться

Если бы мы получаем закрытия BGGA в Java, это также открылось бы для подобных структур в Java. Gafter использовал этот пример в его слайдах, например:

withLock(lock) { //closure }
0
ответ дан Lars Westergren 28 November 2019 в 23:25
поделиться

Фактическая идиома, используемая большинством программистов для первого примера, такова:

InputStream is1 = null;
InputStream is2 = null;
try{
    is1 = new FileInputStream("/tmp/bar");
    is2 = new FileInputStream("/tmp/foo");

    /* do stuff with is1 and is 2 */

} finally {
    if (is1 != null) {
        is1.close();
    }
    if (is2 != null) {
        is2.close();
    }
}

Существует меньше отступов при использовании этой идиомы, что становится еще более важным, когда у вас есть более 2 ресурсов для очистки.

Кроме того, вы можете добавить в структуру предложение catch, которое будет обрабатывать новое исключение FileStream (), если вам это необходимо. В первом примере вам понадобится еще один включающий блок try / catch, если вы хотите это сделать.

0
ответ дан 28 November 2019 в 23:25
поделиться

Нет нет.

Вы можете

public void func(){

  {
    ArrayList l  =  new ArrayList();
  }
  System.out.println("Hello");

}

, Это дает Вам ограниченный объем пункта использования, но нет никакого интерфейса IDisposable для вызова кода завершения. Можно использовать попытку {} выгода () {} Наконец {}, но это не имеет сахара использования. Случайно использование финализаторов в Java обычно является плохой идеей.

-2
ответ дан Steve g 28 November 2019 в 23:25
поделиться

Нет, в Java нет использования, наиболее похожей функциональностью является ключевое слово «import».

-3
ответ дан user10059 28 November 2019 в 23:25
поделиться
Другие вопросы по тегам:

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