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, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
Да. 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();
}
Самый близкий эквивалент в языке должен использовать попытку наконец.
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();
}
}
более сложный пример мои, например, обертывают исключения.
Не то, чтобы я знаю. Можно несколько моделировать с попыткой... наконец блок, но это все еще не вполне то же.
Самой близкой можно войти в 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) {}
}
}
Я думаю, что можно достигнуть чего-то подобного блоку "использования", реализовав анонимный внутренний класс. Как Spring делает с "Шаблонами Дао".
Ну, в любом случае использование было синтаксическим сахаром, так что ребята из Java, не переживайте.
Если бы мы получаем закрытия BGGA в Java, это также открылось бы для подобных структур в Java. Gafter использовал этот пример в его слайдах, например:
withLock(lock) { //closure }
Фактическая идиома, используемая большинством программистов для первого примера, такова:
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, если вы хотите это сделать.
Нет нет.
Вы можете
public void func(){
{
ArrayList l = new ArrayList();
}
System.out.println("Hello");
}
, Это дает Вам ограниченный объем пункта использования, но нет никакого интерфейса IDisposable для вызова кода завершения. Можно использовать попытку {} выгода () {} Наконец {}, но это не имеет сахара использования. Случайно использование финализаторов в Java обычно является плохой идеей.
Нет, в Java нет использования, наиболее похожей функциональностью является ключевое слово «import».