Вылетание приложения при возникновении ошибки

Ответить
Napalm
Сообщения: 46
Зарегистрирован: 17 апр 2013, 11:48

Вылетание приложения при возникновении ошибки

Сообщение Napalm » 20 апр 2013, 12:50

Доброго всем времени суток!
Вот есть приложение по работе с MySQL.
Тему эту мы разобрали, и вроде все прекрасно.
Одно маленькое "но"
При вызове функции с подключением получается такая ситуация, если неправильно указан хост, логин, пароль, ошибка синтаксиса, любая ошибка.
В независимости от того, что почти каждое действие заключено в try приложение к фигам вылетает. Смотрю лог ошибки, а там просто пароль неверный...

Прошу подсказки, как бороться с этой ерундой.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Вылетание приложения при возникновении ошибки

Сообщение rezak90 » 20 апр 2013, 13:28

а мы вот не видим лог и ничего сказать не можем, а если бы вы ещё и код показали то вообще было бы здорово хД)
R.id.team
Политика на форуме запрещена

Napalm
Сообщения: 46
Зарегистрирован: 17 апр 2013, 11:48

Re: Вылетание приложения при возникновении ошибки

Сообщение Napalm » 20 апр 2013, 14:29

Виноват :) исправлюсь.

Код программы:
[syntax=java]
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

Button opensetting, quit, login;
String host, loginbd, passbd, oper;
SharedPreferences sPref;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

quit = (Button) findViewById(R.id.quit);
quit.setOnClickListener(this);
login = (Button) findViewById(R.id.LogIn);
login.setOnClickListener(this);
opensetting = (Button) findViewById(R.id.setting);
opensetting.setOnClickListener(this);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.setting:
Intent intent = new Intent(this, AppSetting.class);
startActivity(intent);
break;
case R.id.LogIn:
connect();
break;
default:
break;
}

}

void connect() {
try {
Log.d("My Logs", "Запускаем поток");
Thread t = new Thread(new Runnable() {
public void run() {
Connection conn = null;
sPref = getSharedPreferences("Setting", MODE_PRIVATE);
String hostname = sPref.getString("HOST", "");
String userName = sPref.getString("mlogin", "");
String password = sPref.getString("mpass", "");
//oper = sPref.getString("login", "");
//String userName = "srv29435_tester";
//String password = "VariusRain";
String url = "jdbc:mysql://"+hostname+":3306/srv29435_rain";
try {
Log.d("My Logs", "Подключаем драйвер");
Class.forName("com.mysql.jdbc.Driver").newInstance();
Log.d("My Logs", "Подключили");
} catch (InstantiationException e) {
Log.d("My Logs", "не подключили");
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
Log.d("My Logs", "Не подключили, правов маловато");
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
Log.d("My Logs", "Не подключили класс не найден");
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
Log.d("My Logs", "Подключаемся");
conn = DriverManager.getConnection(url, userName, password);
Log.d("My Log", "Подключилось");
} catch (SQLException e) {
Log.e("My Logs", "Не получилось");
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
});
t.start();
} catch (Exception e) {
e.printStackTrace();
System.err.println("Не вышло");
}
}

}
[/syntax]

намерено неверно указал имя пользователя
И лог:
04-20 11:26:12.517: D/My Logs(451): Запускаем поток
04-20 11:26:12.567: D/My Logs(451): Подключаем драйвер
04-20 11:26:12.607: D/My Logs(451): Подключили
04-20 11:26:12.607: D/My Logs(451): Подключаемся
04-20 11:26:13.577: D/dalvikvm(451): GC_CONCURRENT freed 357K, 51% free 2861K/5831K, external 731K/1038K, paused 18ms+7ms
04-20 11:26:14.657: W/dalvikvm(451): VFY: unable to find class referenced in signature (Ljavax/naming/Reference;)
04-20 11:26:14.657: I/dalvikvm(451): Could not find method javax.naming.Reference.get, referenced from method com.mysql.jdbc.ConnectionPropertiesImpl$ConnectionProperty.initializeFrom
04-20 11:26:14.667: W/dalvikvm(451): VFY: unable to resolve virtual method 11705: Ljavax/naming/Reference;.get (Ljava/lang/String;)Ljavax/naming/RefAddr;
04-20 11:26:14.667: D/dalvikvm(451): VFY: replacing opcode 0x6e at 0x0004
04-20 11:26:14.667: D/dalvikvm(451): VFY: dead code 0x0007-0013 in Lcom/mysql/jdbc/ConnectionPropertiesImpl$ConnectionProperty;.initializeFrom (Ljavax/naming/Reference;)V
04-20 11:26:14.677: W/dalvikvm(451): VFY: unable to find class referenced in signature (Ljavax/naming/Reference;)
04-20 11:26:14.677: E/dalvikvm(451): Could not find class 'javax.naming.StringRefAddr', referenced from method com.mysql.jdbc.ConnectionPropertiesImpl$ConnectionProperty.storeTo
04-20 11:26:14.687: W/dalvikvm(451): VFY: unable to resolve new-instance 986 (Ljavax/naming/StringRefAddr;) in Lcom/mysql/jdbc/ConnectionPropertiesImpl$ConnectionProperty;
04-20 11:26:14.687: D/dalvikvm(451): VFY: replacing opcode 0x22 at 0x0006
04-20 11:26:14.687: D/dalvikvm(451): VFY: dead code 0x0008-0019 in Lcom/mysql/jdbc/ConnectionPropertiesImpl$ConnectionProperty;.storeTo (Ljavax/naming/Reference;)V
04-20 11:26:15.177: D/dalvikvm(451): GC_CONCURRENT freed 167K, 47% free 3162K/5959K, external 731K/1038K, paused 17ms+11ms
04-20 11:26:15.577: I/dalvikvm(451): Jit: resizing JitTable from 512 to 1024
04-20 11:26:15.807: I/dalvikvm(451): Could not find method java.lang.management.ManagementFactory.getThreadMXBean, referenced from method com.mysql.jdbc.MysqlIO.appendDeadlockStatusInformation
04-20 11:26:15.817: W/dalvikvm(451): VFY: unable to resolve static method 11044: Ljava/lang/management/ManagementFactory;.getThreadMXBean ()Ljava/lang/management/ThreadMXBean;
04-20 11:26:15.817: D/dalvikvm(451): VFY: replacing opcode 0x71 at 0x0079
04-20 11:26:15.817: D/dalvikvm(451): VFY: dead code 0x007c-00a9 in Lcom/mysql/jdbc/MysqlIO;.appendDeadlockStatusInformation (Ljava/lang/String;Ljava/lang/StringBuffer;)V
04-20 11:26:15.837: D/dalvikvm(451): VFY: dead code 0x00ea-020a in Lcom/mysql/jdbc/MysqlIO;.appendDeadlockStatusInformation (Ljava/lang/String;Ljava/lang/StringBuffer;)V
04-20 11:26:17.587: E/My Logs(451): Не получилось
04-20 11:26:17.587: W/System.err(451): java.sql.SQLException: Access denied for user 'userlogin'@'5.19.252.48' (using password: YES)
04-20 11:26:17.607: W/System.err(451): at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)
04-20 11:26:17.607: W/System.err(451): at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120)
04-20 11:26:17.627: W/System.err(451): at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052)
04-20 11:26:17.627: W/System.err(451): at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:925)
04-20 11:26:17.627: W/System.err(451): at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1704)
04-20 11:26:17.627: W/System.err(451): at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1250)
04-20 11:26:17.638: W/System.err(451): at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2483)
04-20 11:26:17.638: W/System.err(451): at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2516)
04-20 11:26:17.647: W/System.err(451): at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2301)
04-20 11:26:17.647: W/System.err(451): at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:834)
04-20 11:26:17.647: W/System.err(451): at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
04-20 11:26:17.682: W/System.err(451): at java.lang.reflect.Constructor.constructNative(Native Method)
04-20 11:26:17.688: W/System.err(451): at java.lang.reflect.Constructor.newInstance(Constructor.java:415)
04-20 11:26:17.697: W/System.err(451): at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
04-20 11:26:17.707: W/System.err(451): at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:416)
04-20 11:26:17.707: W/System.err(451): at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:317)
04-20 11:26:17.707: W/System.err(451): at java.sql.DriverManager.getConnection(DriverManager.java:180)
04-20 11:26:17.707: W/System.err(451): at java.sql.DriverManager.getConnection(DriverManager.java:214)
04-20 11:26:17.707: W/System.err(451): at ru.dev.rainsupportsystem.MainActivity$1.run(MainActivity.java:95)
04-20 11:26:17.707: W/System.err(451): at java.lang.Thread.run(Thread.java:1019)
04-20 11:26:17.707: W/dalvikvm(451): threadid=9: thread exiting with uncaught exception (group=0x40015560)
04-20 11:26:17.707: E/AndroidRuntime(451): FATAL EXCEPTION: Thread-10
04-20 11:26:17.707: E/AndroidRuntime(451): java.lang.NullPointerException
04-20 11:26:17.707: E/AndroidRuntime(451): at ru.dev.rainsupportsystem.MainActivity$1.run(MainActivity.java:102)
04-20 11:26:17.707: E/AndroidRuntime(451): at java.lang.Thread.run(Thread.java:1019)

Napalm
Сообщения: 46
Зарегистрирован: 17 апр 2013, 11:48

Re: Вылетание приложения при возникновении ошибки

Сообщение Napalm » 20 апр 2013, 14:54

Попытался отловить вообще любой экзепшен в том try где происходит подключение
Всё равно при отладке вылетает сообщение на эмуляторе об ошибке и предложение force close
и приложение закрывается.

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Вылетание приложения при возникновении ошибки

Сообщение neoksi » 20 апр 2013, 15:09

Замени все
e.printStackTrace();
на
Log.e("My Logs",Log.getStackTraceString(e));
и попробуй запустить снова.

Napalm
Сообщения: 46
Зарегистрирован: 17 апр 2013, 11:48

Re: Вылетание приложения при возникновении ошибки

Сообщение Napalm » 20 апр 2013, 16:50

Ну, ситуация в общем-то не изменилась...
Логи:

Код: Выделить всё

04-20 13:47:01.324: D/My Logs(337): Запускаем поток
04-20 13:47:01.354: D/My Logs(337): Подключаем драйвер
04-20 13:47:01.393: D/My Logs(337): Подключили
04-20 13:47:01.393: D/My Logs(337): Подключаемся
04-20 13:47:03.194: D/dalvikvm(337): GC_CONCURRENT freed 232K, 50% free 2964K/5831K, external 731K/1038K, paused 11ms+11ms
04-20 13:47:03.604: W/dalvikvm(337): VFY: unable to find class referenced in signature (Ljavax/naming/Reference;)
04-20 13:47:03.604: I/dalvikvm(337): Could not find method javax.naming.Reference.get, referenced from method com.mysql.jdbc.ConnectionPropertiesImpl$ConnectionProperty.initializeFrom
04-20 13:47:03.604: W/dalvikvm(337): VFY: unable to resolve virtual method 11702: Ljavax/naming/Reference;.get (Ljava/lang/String;)Ljavax/naming/RefAddr;
04-20 13:47:03.604: D/dalvikvm(337): VFY: replacing opcode 0x6e at 0x0004
04-20 13:47:03.604: D/dalvikvm(337): VFY: dead code 0x0007-0013 in Lcom/mysql/jdbc/ConnectionPropertiesImpl$ConnectionProperty;.initializeFrom (Ljavax/naming/Reference;)V
04-20 13:47:03.624: W/dalvikvm(337): VFY: unable to find class referenced in signature (Ljavax/naming/Reference;)
04-20 13:47:03.624: E/dalvikvm(337): Could not find class 'javax.naming.StringRefAddr', referenced from method com.mysql.jdbc.ConnectionPropertiesImpl$ConnectionProperty.storeTo
04-20 13:47:03.624: W/dalvikvm(337): VFY: unable to resolve new-instance 986 (Ljavax/naming/StringRefAddr;) in Lcom/mysql/jdbc/ConnectionPropertiesImpl$ConnectionProperty;
04-20 13:47:03.624: D/dalvikvm(337): VFY: replacing opcode 0x22 at 0x0006
04-20 13:47:03.624: D/dalvikvm(337): VFY: dead code 0x0008-0019 in Lcom/mysql/jdbc/ConnectionPropertiesImpl$ConnectionProperty;.storeTo (Ljavax/naming/Reference;)V
04-20 13:47:04.434: I/dalvikvm(337): Could not find method java.lang.management.ManagementFactory.getThreadMXBean, referenced from method com.mysql.jdbc.MysqlIO.appendDeadlockStatusInformation
04-20 13:47:04.434: W/dalvikvm(337): VFY: unable to resolve static method 11042: Ljava/lang/management/ManagementFactory;.getThreadMXBean ()Ljava/lang/management/ThreadMXBean;
04-20 13:47:04.463: D/dalvikvm(337): VFY: replacing opcode 0x71 at 0x0079
04-20 13:47:04.463: D/dalvikvm(337): VFY: dead code 0x007c-00a9 in Lcom/mysql/jdbc/MysqlIO;.appendDeadlockStatusInformation (Ljava/lang/String;Ljava/lang/StringBuffer;)V
04-20 13:47:04.493: D/dalvikvm(337): VFY: dead code 0x00ea-020a in Lcom/mysql/jdbc/MysqlIO;.appendDeadlockStatusInformation (Ljava/lang/String;Ljava/lang/StringBuffer;)V
04-20 13:47:04.756: D/dalvikvm(337): GC_CONCURRENT freed 197K, 48% free 3169K/6023K, external 731K/1038K, paused 14ms+12ms
04-20 13:47:06.464: E/My Logs(337): Не получилось
04-20 13:47:06.474: E/My Logs(337): java.sql.SQLException: Access denied for user 'user'@'5.19.252.48' (using password: YES)
04-20 13:47:06.474: E/My Logs(337): 	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)
04-20 13:47:06.474: E/My Logs(337): 	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120)
04-20 13:47:06.474: E/My Logs(337): 	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052)
04-20 13:47:06.474: E/My Logs(337): 	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:925)
04-20 13:47:06.474: E/My Logs(337): 	at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1704)
04-20 13:47:06.474: E/My Logs(337): 	at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1250)
04-20 13:47:06.474: E/My Logs(337): 	at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2483)
04-20 13:47:06.474: E/My Logs(337): 	at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2516)
04-20 13:47:06.474: E/My Logs(337): 	at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2301)
04-20 13:47:06.474: E/My Logs(337): 	at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:834)
04-20 13:47:06.474: E/My Logs(337): 	at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
04-20 13:47:06.474: E/My Logs(337): 	at java.lang.reflect.Constructor.constructNative(Native Method)
04-20 13:47:06.474: E/My Logs(337): 	at java.lang.reflect.Constructor.newInstance(Constructor.java:415)
04-20 13:47:06.474: E/My Logs(337): 	at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
04-20 13:47:06.474: E/My Logs(337): 	at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:416)
04-20 13:47:06.474: E/My Logs(337): 	at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:317)
04-20 13:47:06.474: E/My Logs(337): 	at java.sql.DriverManager.getConnection(DriverManager.java:180)
04-20 13:47:06.474: E/My Logs(337): 	at java.sql.DriverManager.getConnection(DriverManager.java:214)
04-20 13:47:06.474: E/My Logs(337): 	at ru.dev.rainsupportsystem.MainActivity$1.run(MainActivity.java:91)
04-20 13:47:06.474: E/My Logs(337): 	at java.lang.Thread.run(Thread.java:1019)
04-20 13:47:06.483: W/dalvikvm(337): threadid=9: thread exiting with uncaught exception (group=0x40015560)
04-20 13:47:06.493: E/AndroidRuntime(337): FATAL EXCEPTION: Thread-10
04-20 13:47:06.493: E/AndroidRuntime(337): java.lang.NullPointerException
04-20 13:47:06.493: E/AndroidRuntime(337): 	at ru.dev.rainsupportsystem.MainActivity$1.run(MainActivity.java:98)
04-20 13:47:06.493: E/AndroidRuntime(337): 	at java.lang.Thread.run(Thread.java:1019)
04-20 13:47:13.014: I/Process(337): Sending signal. PID: 337 SIG: 9

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Вылетание приложения при возникновении ошибки

Сообщение neoksi » 20 апр 2013, 17:15

А я не говорил, что она изменится, мне нужен был более полный лог.
А теперь замени conn.close(); на if(conn!=null) conn.close();.
И тогда будет все ок.

А иначе ты пытаешься взаимодействовать с объектом, которого не существует, он просто не смог создаться из-за ошибки соединения ранее. Причем в этом блоке ты обрабатываешь SQLException, а там вылетает NullPointerException и его никто не отлавливает внутри потока.

Код: Выделить всё

try{
....
} catch (Exception e) {
        e.printStackTrace();
        System.err.println("Не вышло");
}
Обрабатывает только ошибки, которые могут вылететь при старте нового потока, а не происходящие в новом потоке ошибки.

П.С. как-то так...
П.П.С. Правил сообщение 4 раза, пойдука посплю)

Napalm
Сообщения: 46
Зарегистрирован: 17 апр 2013, 11:48

Re: Вылетание приложения при возникновении ошибки

Сообщение Napalm » 20 апр 2013, 17:35

Благодарю!
помогло

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Вылетание приложения при возникновении ошибки

Сообщение Foenix » 20 апр 2013, 21:49

и еще я бы заметила, что у тебя не совсем правильно построен алгоритм обработки ошибок. т.е. после каждого пойманного исключения , например, неправильный пароль, у тебя программа не выходит из потока, а он продолжается дальше. Но если пароль неверный, к чему дальше операторы идут-то?
Имхо все эти трай должны быть вложены в друг друга. Неправильное соединение - все, до свидания, правильное? неправильный пароль - до свидания. ПРавильный? неправильный запрос - все, до свидания.. и так далее.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Вылетание приложения при возникновении ошибки

Сообщение Foenix » 20 апр 2013, 21:51

тогда бы, если бы у тебя был неправильный пароль, то приложение бы вышло из потока вполне законно, и не лезло бы на нулловый конн (извини, печатаю с ноута и в темноте, не умею вслепую писать английскими буквами).
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Napalm
Сообщения: 46
Зарегистрирован: 17 апр 2013, 11:48

Re: Вылетание приложения при возникновении ошибки

Сообщение Napalm » 21 апр 2013, 02:17

Да, об этом я думал, но как-то мне половину траев эклипс сам за меня поставил, а я и не сопротивлялся

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Вылетание приложения при возникновении ошибки

Сообщение neoksi » 21 апр 2013, 02:38

Ну try эклипс умеет подставлять и хорошо это, а вот задача программиста это уже оптимизировать, в зависимости от задач.

Сам сейчас пишу разбор JSON объекта плюс взаимодействие с сетью и подключенным интерфейсом другого сервиса. Вложенность try и if всю красоту кода убивают ;)

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

Re: Вылетание приложения при возникновении ошибки

Сообщение Mikhail_dev » 21 апр 2013, 09:52

Да тут просто избыток траев. Зачем глобальный, самый первый? Выкинуть
InstantiationException
IllegalAccessException
ClassNotFoundException
SQLException

Всё это убрать, поставить один try catch, где в catch отлавливается исключение "Exception". Закрытие соединение лучше делать в finally, а не открывать еще один try, ибо finally означает "выполнение кода, независимо от того, что произошло. ", а закрыть подключение нам надо всё равно. Т.е. мы можем даже в catch написать return, finally всё равно выполнится.

Ответить