Не могу найти проблему

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
usverX
Сообщения: 5
Зарегистрирован: 04 апр 2012, 11:37

Не могу найти проблему

Сообщение usverX » 04 апр 2012, 18:40

Добрый день.
Не могу понять в чем причина вылета приложения с ошибкой.
Смысл в том что на входе идет переменная String вида:

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

s003-12
n176-137
p573-9
...
где:
буква-указатель типа
следующие за ней 3 цифры-код, такой же как в файле с ценами(по нему и нужно искать цену)
после дефиса - количество(всегда целое)

Файл расценок имеет следующий вид:

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

001-0.15
002-11.09
...
999-185.60


В возвращаемом значении нужно вывести сумму вычислений количество*цена для всех кодов

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

public String Stoimost(String stNar) {

		float stoim = 0;
		Hashtable<String, Float> Price = new Hashtable<String, Float>();
		Hashtable<String, Integer> CurNar = new Hashtable<String, Integer>();
		// StringBuffer priceText = new StringBuffer();
		String PriceFilePath = DirPath + "price.dat";

		
		File priceF = new File(DirPath, "price.dat");
		if (!priceF.exists()) {
			
			stoim = 0;
			Toast.makeText(getApplicationContext(),
					"Ошибка: файл " + PriceFilePath + " не найден",
					Toast.LENGTH_LONG).show();
		} else {
			try {
				FileReader fRd = new FileReader(priceF);
				BufferedReader reader = new BufferedReader(fRd);
				String str;

				while ((str = reader.readLine()) != null) {
					// priceText.append(str + "\n");
					String[] tmp = str.split("-");
					Price.put(tmp[0], Float.valueOf(tmp[1]));
				}
				fRd.close();

			} catch (Throwable t) {
				Toast.makeText(getApplicationContext(),
						"Exception: " + t.toString(), Toast.LENGTH_LONG).show();
			}
		}
		
		String[] stringLine = stNar.split("\n");
		for (int i = 0; i < stringLine.length; i++) {
			String[] tmp = stringLine[i].split(" - ");
			String cod=tmp[0].substring(1);
			float mod =0;
			if (tmp[0].substring(0, 1)=="s") {
				mod=(float) 1.2;
			} else {
				mod=1;
			}
			stoim = stoim + (Float.valueOf(tmp[1]) * Price.get(tmp[0])*mod);
		}
		String stout=String.valueOf(stoim);
		return stout;

	}
Подскажите, пожалуйста, что я делаю не так, где возникает ошибка и как ее исправить.
P.S. Прошу прощения за "быдлокодинг", это первая моя программа. Даже Еклипс пишет мне что у меня хардкод.

Аватара пользователя
andev
Сообщения: 219
Зарегистрирован: 13 янв 2012, 17:56

Re: Не могу найти проблему

Сообщение andev » 04 апр 2012, 18:58

строку на котором эксепшн укажите

usverX
Сообщения: 5
Зарегистрирован: 04 апр 2012, 11:37

Re: Не могу найти проблему

Сообщение usverX » 04 апр 2012, 19:07

я б с превеликим удовольствием, а как ее узнать?

Аватара пользователя
andev
Сообщения: 219
Зарегистрирован: 13 янв 2012, 17:56

Re: Не могу найти проблему

Сообщение andev » 04 апр 2012, 19:10

пробегите в дебаге или выложите целиком проект в архиве, я пробегу как будет минута

usverX
Сообщения: 5
Зарегистрирован: 04 апр 2012, 11:37

Re: Не могу найти проблему

Сообщение usverX » 04 апр 2012, 20:31

проект
http://rghost.ru/37409599
на код не ругайтесь, все таки первая программа со времен школы (а там был паскаль и то поверхностно)
файл price.dat положить в /mnt/sdcard/_Naryadi/price.dat
работа с методом временно повешена на кнопку @+id/ButNarSave (метод public void ClickButtNarSave)
с дебагом не разобрался (как найти строку которая вызывает ошибку), хотя и интересно там лазить. Спасибо что открыли для меня этот режим. Пойду гуглить про него подробней

причина правки - не тот backup проекта скинул

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Не могу найти проблему

Сообщение damager82 » 05 апр 2012, 09:57

Есть ошибки, когда разбираете строку из файла:

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

String[] tmp = str.split("-");
Price.put(tmp[0], Float.valueOf(tmp[1]));
Надо проверять, что в tmp[1] что-то есть, иначе будет ошибка индекса массива. Т.к. есть строки типа "009-"
Когда переводите в Float, надо сначала запятую в строке tmp[1] заменить на точку

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

tmp[1] = tmp[1].replace(",", ".");
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

usverX
Сообщения: 5
Зарегистрирован: 04 апр 2012, 11:37

Re: Не могу найти проблему

Сообщение usverX » 05 апр 2012, 18:34

damager82 писал(а):Есть ошибки, когда разбираете строку из файла:
Надо проверять, что в tmp[1] что-то есть, иначе будет ошибка индекса массива. Т.к. есть строки типа "009-"
что то не получается.
Какое условие в этом случае нужно использовать? У меня такой вариант:

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

if (tmp[1] == null) {
   tmp[1] = "0";
}
Или нужно прицепить проверку по количеству элементов массива? Только не представляю как.

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

if (tmp.length==1) {
   tmp[1] = "0";
}
работать не будет, как я понимаю.
damager82 писал(а):Когда переводите в Float, надо сначала запятую в строке tmp[1] заменить на точку
Спасибо, добавил, и запомнил на будущее.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Не могу найти проблему

Сообщение damager82 » 09 апр 2012, 09:17

tmp[0] должен быть всегда, даже если строка пустая. А наличие tmp[1] можно проверить так:

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

if (tmp.length > 1)
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

usverX
Сообщения: 5
Зарегистрирован: 04 апр 2012, 11:37

Re: Не могу найти проблему

Сообщение usverX » 10 апр 2012, 18:23

Спасибо, помогло.

Ответить