Присвоение переменной данной строке в java [duplicate]

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

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

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

71
задан user2864740 5 May 2014 в 21:41
поделиться

7 ответов

Это не то, как вы делаете что-то на Java. В Java нет динамических переменных. Переменные Java должны быть объявлены в исходном коде (*). Период.

В зависимости от того, чего вы пытаетесь достичь, вы должны использовать массив, List или Map; например,

int n[] = new int[3];
for (int i = 0; i < 3; i++) {
    n[i] = 5;
}

List<Integer> n = new ArrayList<Integer>();
for (int i = 1; i < 4; i++) {
    n.add(5);
}

Map<String, Integer> n = new HashMap<String, Integer>();
for (int i = 1; i < 4; i++) {
    n.put("n" + i, 5);
}

Можно использовать динамическое отражение для обозначения переменных , которые были объявлены в исходном коде. Однако это работает только для переменных, являющихся членами класса (т. Е. Статических полей и полей экземпляра). Он не работает для локальных переменных. См. Пример «быстрый и грязный» @ fyr.

Однако делать это без необходимости в Java - это плохая идея. Это неэффективно, код более сложный, и поскольку вы полагаетесь на проверку времени выполнения, он более хрупкий.

И это не «переменные с динамическими именами». Он лучше описывает динамический доступ к переменным со статическими именами.


* - Это утверждение немного неточно. Если вы используете BCEL или ASM, вы можете «объявить» переменные в файле байт-кода. Но не делай этого! Таким образом, безумие!

91
ответ дан Stephen C 19 August 2018 в 12:33
поделиться
  • 1
    Thanx много, получил то, что я искал. Последняя часть (Map & lt; String, integer & gt;). – Ashish Anand 18 July 2011 в 08:35
  • 2
    Следует отметить, что даже если бы это было возможно, это не должно было быть чем-то, что вы на самом деле делали бы. Вы ничего не получаете от этого; вы действительно потеряете удобочитаемость. Если вы хотите связать их, используйте вместо этого Map<String, T>, не начинайте возиться с вашим фактическим кодом. – Jeroen Vannevel 15 December 2013 в 04:37
  • 3
    @JeroenVannevel - Вот что я имел в виду под «безумием». :-) – Stephen C 15 December 2013 в 09:25

Что вам нужно, так называется array. Я хотел написать следующий код:

int[] n = new int[4];

for(int i=1;i<4;i++)
{
    n[i] = 5;
}
11
ответ дан AlexR 19 August 2018 в 12:33
поделиться
  • 1
    Не хотите использовать массивы. Я хочу динамически получать доступ к переменным (n1, n2, n3) в зависимости от некоторого условия. – Ashish Anand 18 July 2011 в 08:19

У вас нет. Самое близкое, что вы можете сделать, это работать с Картами, чтобы имитировать его, или определять свои собственные объекты, с которыми нужно иметь дело.

2
ответ дан everton 19 August 2018 в 12:33
поделиться

Если вы хотите получить доступ к переменным какой-то динамике, вы можете использовать отражение. Однако Reflection работает не для локальных переменных. Это применимо только для атрибутов класса.

Грубый быстрый и грязный пример:

public class T {
    public Integer n1;
    public Integer n2;
    public Integer n3;

    public void accessAttributes() throws IllegalArgumentException, SecurityException, IllegalAccessException,
            NoSuchFieldException {

        for (int i = 1; i < 4; i++) {
            T.class.getField("n" + i).set(this, 5);
        }
    }
}

Вам нужно улучшить этот код различными способами, это только пример. Это также не считается хорошим кодом.

28
ответ дан fyr 19 August 2018 в 12:33
поделиться
  • 1
    Отлично, когда вам нужно преобразовать датчик сенсора event.values ​​[] в набор переменных. event.values ​​[] может иметь длину от 1 до 6, и это удобно для его преобразования, в моем случае для jars-маршалинга без использования массива. – Farshid T 21 June 2015 в 22:30

Вы должны использовать List или array вместо

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);

Или

int[] arr  = new int[10];
arr[0]=1;
arr[1]=2;

Или даже лучше

Map<String, Integer> map = new HashMap<String, Integer>();
map.put("n1", 1);
map.put("n2", 2);

//conditionally get 
map.get("n1");
10
ответ дан Jigar Joshi 19 August 2018 в 12:33
поделиться

Динамические имена переменных в Java Нет такой вещи.

В вашем случае вы можете использовать массив:

int[] n = new int[3];
for() {
 n[i] = 5;
}

Для более общих (name, value), используйте Map<>

5
ответ дан Op De Cirkel 19 August 2018 в 12:33
поделиться

Попробуйте следующим образом:

    HashMap<String, Integer> hashMap = new HashMap();

    for (int i=1; i<=3; i++) {
        hashMap.put("n" + i, 5);
    }
3
ответ дан user 19 August 2018 в 12:33
поделиться
Другие вопросы по тегам:

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