Страница 1 из 2
Регулярные выражения
Добавлено: 10 июл 2013, 20:30
FoxTrix
Всем доброго времени суток!
Разбираться в создании приложений и соответственно языке начал всего несколько дней назад, поэтому код может быть абсурден)
Решил первым приложением сделать калькулятор, проблема вот в чём:
В textView пишем выражение, допустим 10+20, по нажатию = выполняется код ниже:
(если убрать все лишнее)(переменные int i, int[] a, int result и String res объявлены выше)
[syntax=java]
case R.id.equals:
String str = (String) text.getText(); //в str попадает 10+20
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(str);
i = 0;
while (matcher.find())
{
a = Integer.parseInt(matcher.group()); //в a[0] должно попасть 10, в a[1] соответственно 20
i++;
}
result = a[0] + a[1];
res = Integer.toString(result);
text.setText(text.getText()+ "=" + res);
break;
[/syntax]
но приложение вылетает с ошибкой при нажатии =, путем комментирования выяснил что вылетает из-за этой строки:
[syntax=java]
a = Integer.parseInt(matcher.group());
[/syntax]
подскажите что у меня не правильно? =)
Заранее спасибо!
Re: Регулярные выражения
Добавлено: 10 июл 2013, 20:51
Finch
Велосипед конечно, но уж как просишь
"(\\d*)+(\\d*)"
matcher.group(1) - все числа до плюса
matcher.group(2) - все числа после плюса
Re: Регулярные выражения
Добавлено: 10 июл 2013, 20:56
FoxTrix
Finch писал(а):Велосипед конечно, но уж как просишь
"(\\d*)+(\\d*)"
matcher.group(1) - все числа до плюса
matcher.group(2) - все числа после плюса
тоесть если я оставлю ("\\d+")
и напишу
Код: Выделить всё
while (matcher.find())
{
a[i] = Integer.parseInt(matcher.group(i+1));
i++;
}
то сработает?
(просто вдруг будет не 10+20, а 10+10+20)
Re: Регулярные выражения
Добавлено: 10 июл 2013, 21:53
FoxTrix
попробовал как ты написал, всё равно вылетает =(
Re: Регулярные выражения
Добавлено: 13 июл 2013, 16:09
FoxTrix
краш вызывает почему-то банальная конвертация String->Int, если закоментировать эти строки
Код: Выделить всё
a[0] = Integer.parseInt("12");
a[1] = Integer.parseInt("23");
то приложение не вылетает, в чём здесь проблема?
я что-то не так конвертирую?
Re: Регулярные выражения
Добавлено: 13 июл 2013, 20:55
anber
По твоему вопросу: там может быть много ошибок, массив не того типа, выход за пределы массива, итд, Какую ошибку пишет компилятор?
Re: Регулярные выражения
Добавлено: 13 июл 2013, 23:41
FoxTrix
в том то и дело что нет ошибок, компилируется, а когда нажимаю кнопку приложение вылетает =(
массив объявлен int[] a;
Re: Регулярные выражения
Добавлено: 14 июл 2013, 00:23
rezak90
а может стоит взглянуть в лог?!
Re: Регулярные выражения
Добавлено: 14 июл 2013, 01:19
FoxTrix
Re: Регулярные выражения
Добавлено: 14 июл 2013, 02:15
rezak90
ну вот нулл в onClick, смотри что там нуловое
Re: Регулярные выражения
Добавлено: 14 июл 2013, 02:35
FoxTrix
Код: Выделить всё
case R.id.equals:
a[0] = Integer.valueOf("12");
a[1] = Integer.valueOf("23");
result = a[0] + a[1];
text.setText(text.getText()+ "=" + String.valueOf(result));
break;
вот весь код кнопки, всё уже упростил для теста дальше некуда, я не представляю что тут может быть нулевого...
Re: Регулярные выражения
Добавлено: 14 июл 2013, 03:18
rezak90
text скорее всего нуловый
Re: Регулярные выражения
Добавлено: 14 июл 2013, 03:23
FoxTrix
нет, даже так
всё равно та же ошибка
Re: Регулярные выражения
Добавлено: 14 июл 2013, 10:55
anber
FoxTrix писал(а):нет, даже так
всё равно та же ошибка
Да, как уже сказали
text равен null.
Приведи весь текст файла.
Re: Регулярные выражения
Добавлено: 14 июл 2013, 12:57
FoxTrix
Код: Выделить всё
package com.example.calc;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
Button num0;
Button num1;
Button num2;
Button num3;
Button num4;
Button num5;
Button num6;
Button num7;
Button num8;
Button num9;
Button plus;
Button minus;
Button mult;
Button degree;
Button equals;
Button reset;
TextView text;
int firstNum;
int secondNum;
int result;
int i;
int a[];
String str;
String buff;
String res;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
plus = (Button) findViewById(R.id.plus);
minus = (Button) findViewById(R.id.minus);
mult = (Button) findViewById(R.id.mult);
degree = (Button) findViewById(R.id.degree);
equals = (Button) findViewById(R.id.equals);
reset = (Button) findViewById(R.id.reset);
num0 = (Button) findViewById(R.id.num0);
num1 = (Button) findViewById(R.id.num1);
num2 = (Button) findViewById(R.id.num2);
num3 = (Button) findViewById(R.id.num3);
num4 = (Button) findViewById(R.id.num4);
num5 = (Button) findViewById(R.id.num5);
num6 = (Button) findViewById(R.id.num6);
num7 = (Button) findViewById(R.id.num7);
num8 = (Button) findViewById(R.id.num8);
num9 = (Button) findViewById(R.id.num9);
text = (TextView) findViewById(R.id.text);
OnClickListener num = new OnClickListener()
{
@Override
public void onClick(View v)
{
switch(v.getId())
{
case R.id.reset:
text.setText("");
break;
case R.id.plus:
text.setText(text.getText() + "+");
break;
case R.id.equals:
//String str = (String) text.getText();
//Pattern pattern = Pattern.compile("\\d+");
//Matcher matcher = pattern.matcher(str);
//i = 0;
a[0] = Integer.valueOf("12");
a[1] = Integer.valueOf("23");
/*while (matcher.find())
{
//a[i] = Integer.parseInt(matcher.group());
i++;
}*/
result = a[0] + a[1];
text.setText(text.getText()+ "=" + String.valueOf(result));
break;
case R.id.num0:
text.setText(text.getText() + "0");
break;
case R.id.num1:
text.setText(text.getText() + "1");
break;
case R.id.num2:
text.setText(text.getText() + "2");
break;
case R.id.num3:
text.setText(text.getText() + "3");
break;
case R.id.num4:
text.setText(text.getText() + "4");
break;
case R.id.num5:
text.setText(text.getText() + "5");
break;
case R.id.num6:
text.setText(text.getText() + "6");
break;
case R.id.num7:
text.setText(text.getText() + "7");
break;
case R.id.num8:
text.setText(text.getText() + "8");
break;
case R.id.num9:
text.setText(text.getText() + "9");
break;
}
}
};
reset.setOnClickListener(num);
plus.setOnClickListener(num);
minus.setOnClickListener(num);
mult.setOnClickListener(num);
degree.setOnClickListener(num);
equals.setOnClickListener(num);
num0.setOnClickListener(num);
num1.setOnClickListener(num);
num2.setOnClickListener(num);
num3.setOnClickListener(num);
num4.setOnClickListener(num);
num5.setOnClickListener(num);
num6.setOnClickListener(num);
num7.setOnClickListener(num);
num8.setOnClickListener(num);
num9.setOnClickListener(num);
}
@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;
}
}
Re: Регулярные выражения
Добавлено: 14 июл 2013, 20:53
anber
А в файле main.xml есть элемент у которого id равен text?
Re: Регулярные выражения
Добавлено: 14 июл 2013, 21:21
FoxTrix
да

Re: Регулярные выражения
Добавлено: 14 июл 2013, 21:33
xr0m
Ты не объявил а
для двух чисел:
a = new int[2];
Re: Регулярные выражения
Добавлено: 14 июл 2013, 21:46
FoxTrix
у меня может быть больше 2 чисел, поэтому и не объявил
Re: Регулярные выражения
Добавлено: 14 июл 2013, 21:54
Mikhail_dev
Сбрось весь проект. Так будет быстрее.