Должны ли переменные метода Java String (локальные) быть инициализированы нулем или ""? - PullRequest
12 голосов
/ 30 марта 2011

Как лучше всего инициализировать переменную метода String (локальную), чтобы избежать ошибки «Возможно, переменная не инициализирована» в Java?

Строка s = ноль; или же Строка s = "";

Это имеет значение? Если да, то какой из них лучше и почему?

Я прочитал противоречивые ответы в Интернете.

Спасибо!

Ответы [ 6 ]

15 голосов
/ 30 марта 2011

Да, это имеет значение.Один - ссылка на пустую строку, другой - нулевая ссылка.Они не одинаковы.

Что лучше?Это зависит от того, хотите ли вы нулевое значение или ссылку на пустую строку ... они ведут себя по-разному, поэтому выберите ту, которая ведет себя так, как вы этого хотите.

Мне редко нужно назначать "пустышку"хотя значение для переменной - обычно просто инициализация переменной в точке объявления с real значением, которое я хочу, - это нормально.Если вы можете дать нам больше контекста, мы сможем помочь вам лучше структурировать ваш код, так что это не проблема для вас.

2 голосов
/ 30 марта 2011

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

Итак, в общем, попытайтесь заставить клиентский код создавать завершенные объекты во время построения. Если вы не знаете, какой должна быть строка во время создания, пусть они передадут ее в качестве параметра. Если строка используется только для внутренней логики, она может быть лучше в качестве локальной переменной или параметра - и в этом случае я обычно предпочитаю null вместо "", потому что == null более явный, чем isEmpty ().

1 голос
/ 30 марта 2011

Все зависит от того, что вы хотите, чтобы ваша программа делала.Иногда может быть полезно посмотреть, установлена ​​ли уже строка или нет, в которой null будет лучшим.В других случаях вы хотите предотвратить NullPointers, что делает "" лучше.

0 голосов
/ 30 марта 2011

Чаще всего я бы сказал: вообще не инициализируйте вашу локальную переменную при объявлении ее, если это будет фиктивное значение, например "" или null.Введите действительное значение или подождите, пока вы его не введете.

Затем компилятор проверит наличие хотя бы одного присваивания перед любым возможным использованием переменной.Только в тех редких случаях, когда компилятор не достаточно умен, чтобы понять это (поскольку ему нужна информация, недоступная для него локально), я бы использовал некоторую инициализацию, и тогда обычно null лучше, так как он показывает с исключением NullPointerException, когда ябыл неправ.(Я мог бы добавить assert s != null после того момента, когда я думаю, что инициализация должна быть выполнена для обеспечения этого.)

0 голосов
/ 30 марта 2011

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

0 голосов
/ 30 марта 2011

Это действительно зависит от того, что вы делаете в своей программе.

"" (пустая строка) связана только со строкой, и это безопаснее, чем ноль. Когда вы вызываете методы из класса String, например: replaceAll (), indexOf (), программа будет работать правильно , но , когда у вас есть значение null, у вас все время возникает исключение NullPointerException, когда вы вызываете метод для него.

Подумайте, не является ли для вас значение пустой строки в вашем приложении плохим, тогда выберите str = "".

Обратите внимание, что очень часто лучше, когда выдается исключение NullPointerException, потому что мы знаем о недопустимом состоянии в нашем приложении, поэтому, когда вы хотите узнать об этом, установите String в null по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...