Помогите с ошибкой

andrei.zik
Сообщения: 6
Зарегистрирован: 23 сен 2013, 17:32

Помогите с ошибкой

Сообщение andrei.zik » 03 янв 2014, 13:35

создал новый проект, поместил одну кнопку и в главном классе написал всего одну строчку
View btn = findViewById(R.id.button1);

теперь каждый раз при компиляции приложение сразу вылетает, с другими новыми проектами всё так же


вот логи:

01-03 10:22:39.556: D/AndroidRuntime(334): Shutting down VM
01-03 10:22:39.556: W/dalvikvm(334): threadid=1: thread exiting with uncaught exception (group=0x40015560)
01-03 10:22:39.606: E/AndroidRuntime(334): FATAL EXCEPTION: main
01-03 10:22:39.606: E/AndroidRuntime(334): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{ru.karick.test_7/ru.karick.test_7.MainActivity}: java.lang.NullPointerException
01-03 10:22:39.606: E/AndroidRuntime(334): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1569)
01-03 10:22:39.606: E/AndroidRuntime(334): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
01-03 10:22:39.606: E/AndroidRuntime(334): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
01-03 10:22:39.606: E/AndroidRuntime(334): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
01-03 10:22:39.606: E/AndroidRuntime(334): at android.os.Handler.dispatchMessage(Handler.java:99)
01-03 10:22:39.606: E/AndroidRuntime(334): at android.os.Looper.loop(Looper.java:123)
01-03 10:22:39.606: E/AndroidRuntime(334): at android.app.ActivityThread.main(ActivityThread.java:3683)
01-03 10:22:39.606: E/AndroidRuntime(334): at java.lang.reflect.Method.invokeNative(Native Method)
01-03 10:22:39.606: E/AndroidRuntime(334): at java.lang.reflect.Method.invoke(Method.java:507)
01-03 10:22:39.606: E/AndroidRuntime(334): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
01-03 10:22:39.606: E/AndroidRuntime(334): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
01-03 10:22:39.606: E/AndroidRuntime(334): at dalvik.system.NativeStart.main(Native Method)
01-03 10:22:39.606: E/AndroidRuntime(334): Caused by: java.lang.NullPointerException
01-03 10:22:39.606: E/AndroidRuntime(334): at android.app.Activity.findViewById(Activity.java:1647)
01-03 10:22:39.606: E/AndroidRuntime(334): at ru.karick.test_7.MainActivity.<init>(MainActivity.java:15)
01-03 10:22:39.606: E/AndroidRuntime(334): at java.lang.Class.newInstanceImpl(Native Method)
01-03 10:22:39.606: E/AndroidRuntime(334): at java.lang.Class.newInstance(Class.java:1409)
01-03 10:22:39.606: E/AndroidRuntime(334): at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
01-03 10:22:39.606: E/AndroidRuntime(334): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1561)
01-03 10:22:39.606: E/AndroidRuntime(334): ... 11 more

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Помогите с ошибкой

Сообщение Mikhail_dev » 03 янв 2014, 13:49

View btn = findViewById(R.id.button1);
Может всё таки так?
[syntax=java5]Button btn = (Button) findViewById(R.id.button1);[/syntax]

andrei.zik
Сообщения: 6
Зарегистрирован: 23 сен 2013, 17:32

Re: Помогите с ошибкой

Сообщение andrei.zik » 03 янв 2014, 13:52

Может всё таки так?
[syntax=java5]Button btn = (Button) findViewById(R.id.button1);[/syntax]

так я уже пробывал, не в этом дело

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Помогите с ошибкой

Сообщение Mikhail_dev » 03 янв 2014, 14:10

Дело может не в этом, но поиск кнопки таким образом, которым Вы ищете приведет к ClassCastException, к гадалке не ходи. Я решил написать первое, что заметил в данном коде. А ошибка вылазит по причине того, что Вы ссылаетесь на другую кнопку, которая находится в другом XML файле (в другом, это НЕ в том, который Вы указали в методе setContentView(someXMLFile)). Если она даже и есть там, то возможно у вас ID пересекаются с одним из файлов. Советую изменить ID на более понятный.

andrei.zik
Сообщения: 6
Зарегистрирован: 23 сен 2013, 17:32

Re: Помогите с ошибкой

Сообщение andrei.zik » 03 янв 2014, 14:22

id совподают, xml файл всего один, я уже пытался менять id или делать правки в таком духе, мои попытки ни к чему иному не приводят.
всё что я заметил так это что ошибка появляется только когда я пытаюсь обратиться к кнопке из кода

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Помогите с ошибкой

Сообщение altwin » 03 янв 2014, 14:22

Что у вас в 15 строке класса MainActivity?

[ОФФТОП]Все таки мне кажется стоит указать в пререквизитах к урокам, что необходимо знание основ программирования и понимание java.
Изображение

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Помогите с ошибкой

Сообщение altwin » 03 янв 2014, 14:27

m090050 писал(а):
View btn = findViewById(R.id.button1);
Может всё таки так?
[syntax=java5]Button btn = (Button) findViewById(R.id.button1);[/syntax]
это странно, но допустимо и ошибку компиляции не вызывает. Только не спрашивайте зачем человек мог такое написать, другое дело, что указание (Button) в данном случае излишне, система сама определит тип.
Изображение

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Помогите с ошибкой

Сообщение Mikhail_dev » 03 янв 2014, 14:30

Так то оно да, надо указывать что следует знать основы ООП и Java, но думаю это не тот случай. 15 строка это как я понял та строка, что указал автор (View btn = findViewById(R.id.button1);).
Боюсь тут проблема IDE может быть. Попробуйте пересобрать проект, а также очистить, если это Eclipse. У меня были подобные проблемы, они были связаны именно с IDE, а если точнее, то с неправильной сборкой проекта.
это странно, но допустимо и ошибку компиляции не вызывает. Только не спрашивайте зачем человек мог такое написать, другое дело, что указание (Button) в данном случае излишне, система сама определит тип.
Я всё понимаю, что не вызывает. А вот что система сама определит тип, это неправда. Она просто приведет нашу кнопку к суперклассу, к View. Т.е. Java дает возможность приводить унаследованные классы к суперклассам, но не наоборот. Т.е. View никогда автоматом не будет приведена к Button, к тому же каким образом она может быть приведена к нему, когда мы пишем "View btn" ?
Последний раз редактировалось Mikhail_dev 03 янв 2014, 14:34, всего редактировалось 1 раз.

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Помогите с ошибкой

Сообщение altwin » 03 янв 2014, 14:32

Судя по ошибке - просто класса нет в Манифесте. Опять же если класс объявлен как абстрактный - та же байда. + Не стоит забывать, что делать это нужно в методе onCreate.
Изображение

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Помогите с ошибкой

Сообщение Mikhail_dev » 03 янв 2014, 14:36

это странно, но допустимо и ошибку компиляции не вызывает. Только не спрашивайте зачем человек мог такое написать, другое дело, что указание (Button) в данном случае излишне, система сама определит тип.
Я всё понимаю, что не вызывает. А вот что система сама определит тип, это неправда. Она просто приведет нашу кнопку к суперклассу, к View. Т.е. Java дает возможность приводить унаследованные классы к суперклассам, но не наоборот. Т.е. View никогда автоматом не будет приведена к Button, к тому же каким образом она может быть приведена к нему, когда мы пишем "View btn" ?
Судя по ошибке - просто класса нет в Манифесте. Опять же если класс объявлен как абстрактный - та же байда. + Не стоит забывать, что делать это нужно в методе onCreate.
Там другая ошибка вылазит, которая явно показывает, что в манифесте про активность нет информации.
+ Не стоит забывать, что делать это нужно в методе onCreate.
Делать что? findViewById??

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Помогите с ошибкой

Сообщение altwin » 03 янв 2014, 14:39

m090050 писал(а):
это странно, но допустимо и ошибку компиляции не вызывает. Только не спрашивайте зачем человек мог такое написать, другое дело, что указание (Button) в данном случае излишне, система сама определит тип.
Я всё понимаю, что не вызывает. А вот что система сама определит тип, это неправда. Она просто приведет нашу кнопку к суперклассу, к View. Т.е. Java дает возможность приводить унаследованные классы к суперклассам, но не наоборот. Т.е. View никогда автоматом не будет приведена к Button, к тому же каким образом она может быть приведена к нему, когда мы пишем "View btn" ?
Судя по ошибке - просто класса нет в Манифесте. Опять же если класс объявлен как абстрактный - та же байда. + Не стоит забывать, что делать это нужно в методе onCreate.
Там другая ошибка вылазит, которая явно показывает, что в манифесте про активность нет информации.
Я имел в виду. что кнопка будет работать нормально, поскольку R.id.button - объект Button, в данном случае во время компиляции объект View будет приведен к классу наследника

В данном случае в ошибке четко сказано - не могу инстанциировать активити - NullPointerException, т.е. обращение к не существующему объекту, учитывая то, как вы говорите в строке 15(где возбужденно исключение) код обращения к кнопке - именно эта ошибка будет если делать это до вызова метода onCreate/

p.s. опять же зачем гадать я уже более 13 причин нашел подобной ошибки, нужно видеть проект - иначе это все бесполезно.
Последний раз редактировалось altwin 03 янв 2014, 14:46, всего редактировалось 1 раз.
Изображение

andrei.zik
Сообщения: 6
Зарегистрирован: 23 сен 2013, 17:32

Re: Помогите с ошибкой

Сообщение andrei.zik » 03 янв 2014, 14:40

я уже переустанавливал эклипс, проверял манифест файл (несмотря на то что это MainActivity), всё четно

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Помогите с ошибкой

Сообщение altwin » 03 янв 2014, 14:40

m090050 писал(а): Делать что? findViewById??
в данном случае - да. Не создавать объект view до вызова метода onCreate
Последний раз редактировалось altwin 03 янв 2014, 14:47, всего редактировалось 1 раз.
Изображение

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Помогите с ошибкой

Сообщение altwin » 03 янв 2014, 14:43

andrei.zik писал(а):я уже переустанавливал эклипс, проверял манифест файл (несмотря на то что это MainActivity), всё четно
Уверенны? покажите структуру проекта, содержание MainActivity, layout файла и манифеста, экстрасенсов тут мало, а причин это ошибки я штук 10 назвать могу.
Изображение

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Помогите с ошибкой

Сообщение Mikhail_dev » 03 янв 2014, 14:47

поскольку R.id.button - объект Button, в данном случае во время компиляции объект View будет приведен к классу наследника
Повторюсь. Не будет он приведен к наследнику никогда. Это основы Java так сказать. При приведении к наследнику, надо делать явное приведение типов. (Я не буду сейчас брать в расчет autoboxing в Java).
И еще раз, если вы пишете тип View объекту, то он и будет View. Это же Java и строгая типизация. Указали View, будет Вакм View и не будет никакого Button.
в данном случае - да. Не создавать объект view до вызова метода onCreate
А, ну с этим согласен. Просто имелось ввиду наверное не onCreate, а super.onCreate

andrei.zik
Сообщения: 6
Зарегистрирован: 23 сен 2013, 17:32

Re: Помогите с ошибкой

Сообщение andrei.zik » 03 янв 2014, 14:49

прошу
Вложения
2014-01-03_184804.png
2014-01-03_184804.png (32.17 КБ) 9470 просмотров

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Помогите с ошибкой

Сообщение altwin » 03 янв 2014, 14:55

m090050 писал(а):
поскольку R.id.button - объект Button, в данном случае во время компиляции объект View будет приведен к классу наследника
Повторюсь. Не будет он приведен к наследнику никогда. Это основы Java так сказать. При приведении к наследнику, надо делать явное приведение типов. (Я не буду сейчас брать в расчет autoboxing в Java).
И еще раз, если вы пишете тип View объекту, то он и будет View. Это же Java и строгая типизация. Указали View, будет Вакм View и не будет никакого Button.
в данном случае - да. Не создавать объект view до вызова метода onCreate
А, ну с этим согласен. Просто имелось ввиду наверное не onCreate, а super.onCreate
допускается неявное приведение типов — в случае, если значение одного типа присваивается переменной другого, то компилятор автоматически генерирует код для преобразования значения в нужный тип, если только такое преобразование не приводит к потере данных

В данном случае значению типа View присваивается значение типа Button.(Вы правы -это основы программирования и это отличия псевдострогой типизации java от C++)

P.S. если не много отойти от темы, неявное преобразование типов java бывает разное:
1. Преобразование присваивания
2. Преобразование вызова метода
3. Преобразование приведения
4. Строковое преобразование
5. Арифметическое расширение
Все это по сути не всегда имеет значение в повседневной жизни, но открывает некоторые границы, да и наверно зависит от реализации компилятора. Опять же это преобразования контекстов, в свою очередь в каждом контексте разрешены различные преобразования:
1. Тождественное преобразование
2. Расширяющее примитивное преобразование
3. Сужающее примитивное преобразование
4. Расширяющее ссылочное преобразование
5. Сужающее ссылочное преобразование
6. Строковые преобразования
Последний раз редактировалось altwin 03 янв 2014, 15:16, всего редактировалось 2 раза.
Изображение

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Помогите с ошибкой

Сообщение altwin » 03 янв 2014, 14:57

andrei.zik писал(а):прошу
Измените код, как вам говорили на
[syntax=java]Button btn = (Button) findViewById(R.id.button1);[/syntax]

и поместите его в метод onCreate перед выводом Log
Изображение

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Помогите с ошибкой

Сообщение Mikhail_dev » 03 янв 2014, 15:12

допускается неявное приведение типов — в случае, если значение одного типа присваивается переменной другого, то компилятор автоматически генерирует код для преобразования значения в нужный тип, если только такое преобразование не приводит к потере данных
Вы только что сами ответили на вопрос. Во-первых потеря данных на лицо (View не Button), во-вторых, строгая типизация (View не Button). И я не пойму, как это невозможно понять.
1. Преобразование присваивания
2. Преобразование вызова метода
3. Преобразование приведения
4. Строковое преобразование
5. Арифметическое расширение
Все это по сути не всегда имеет значение в повседневной жизни, но открывает некоторые границы, да и наверно зависит от реализации компилятора. Опять же это преобразования контекстов, в свою очередь в каждом контексте разрешены различные преобразования:
1. Тождественное преобразование
2. Расширяющее примитивное преобразование
3. Сужающее примитивное преобразование
4. Расширяющее ссылочное преобразование
5. Сужающее ссылочное преобразование
6. Строковые преобразования
Покажите мне где в Java есть неявное расширяющее ссылочное преобразование, уж очень интересно. И было бы интересно узнать про строковое преобразование.
Последний раз редактировалось Mikhail_dev 03 янв 2014, 15:22, всего редактировалось 1 раз.

andrei.zik
Сообщения: 6
Зарегистрирован: 23 сен 2013, 17:32

Re: Помогите с ошибкой

Сообщение andrei.zik » 03 янв 2014, 15:20

всё заработало, спасибо всем

Ответить